Esse artigo tem como objetivo explicar de forma detalhada, e com exemplos, como funciona o processo de gerenciamento de múltiplos Docker hosts.
Docker host é o nome do ativo responsável por gerenciar a infraestrutura Docker, nesse artigo mostraremos como é possível criar e gerenciá-los em ambientes distintos, tal como máquina virtual, nuvem e até mesmo máquina física.
Docker machine é a ferramenta usada para essa gerência distribuída, que lhe permite a instalação e gerência de docker hosts de forma fácil e direta.
Essa ferramenta é muito usada por usuários de sistema operacional “não linux”, como foi demonstramos nesse artigo, mas sua função não se limita a isso, pois ela também é bastante usada para provisionar e gerenciar infraestrutura Docker na nuvem, tal como AWS, Digital Ocean e Openstack.
Como funciona
Antes de explicar como utilizar o docker machine, precisamos reforçar o conhecimento sobre a arquitetura do Docker.
Como podemos ver a imagem acima, a utilização do Docker se divide em dois serviços, o que roda em modo daemon, em background, que é chamado de Docker Host, esse serviço é responsável pela viabilização dos containers no kernel Linux. Temos também o cliente, que chamaremos de Docker client, esse serviço é responsável por receber comandos do usuário e traduzir em gerência do Docker Host.
Cada Docker client é configurado para se conectar a um determinado Docker host e nesse momento o Docker machine entra em ação, pois ele viabiliza a automatização da escolha de configuração de acesso do Docker client a distintos Docker host.
O Docker machine possibilita que você utilize diversos ambientes distintos apenas modificando a configuração de seu cliente para o Docker host desejado, que é basicamente modificar algumas variáveis de ambiente. Segue abaixo um exemplo:
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/gomex/.docker/machine/machines/default"
export DOCKER_MACHINE_NAME="default"
Modificando essas quatro variáveis o seu Docker client poderá utilizar um ambiente diferente rapidamente e sem precisar reiniciar nenhum serviço.
Criando ambiente
O Docker machine serve principalmente para criar ambientes, que serão futuramente geridos por ele em sua troca automatizada de contexto de configuração, através da mudança de variáveis de ambiente, como foi explicada anteriormente.
Para criar o ambiente é necessário verificar se a infraestrutura que deseja criar tem algum driver com suporte a esse processo. Segue a lista de drivers disponíveis.
Máquina virtual
Para esse exemplo usaremos o driver mais utilizado, que é o do virtualbox, ou seja, precisamos de um virtualbox instalado na nossa estação para que esse driver funcione adequadamente.
Antes de criar o ambiente vamos entender como funciona o comando de criação do docker machine:
docker-machine create --driver=<nome do driver> <nome do ambiente>
Para o driver virtualbox temos algumas opções que podem ser utilizadas:
--virtualbox-memory : Especifica a quantidade de memória RAM que esse ambiente poderá utilizar. O valor padrão é 1024MB. (Sempre em MB)
--virtualbox-cpu-count : Especifica a quantidade de núcleos de CPU que esse ambiente poderá utilizar. O valor padrão é 1.
--virtualbox-disk-size : Especifica o tamanho do disco que esse ambiente poderá utilizar. O valor padrão é 20000MB (Sempre em MB)
Como teste vamos utilizar o seguinte comando:
docker-machine create --driver=virtualbox --virtualbox-disk-size 30000 teste-virtualbox
O resultado desse comando é a criação de uma máquina virtual no virtualbox, essa máquina terá 30GB de espaço em disco, 1 núcleo e 1GB de memória RAM.
Para validar que todo processo aconteceu tranquilamente, basta utilizar o seguinte comando:
docker-machine ls
O comando acima é responsável por listar todos os ambiente que podem ser usados a partir de sua estação cliente.
Pra mudar de cliente basta utilizar o comando abaixo:
eval $(docker-machine env teste-virtualbox)
Executando o comando ls será possível verificar qual ambiente está ativo:
docker-machine ls
Inicie um container de teste pra testar o novo ambiente
docker run hello-world
Caso deseje mudar pra outro ambiente basta digitar o comando abaixo usando o nome do ambiente desejado:
eval $(docker-machine env <ambiente>)
Caso deseje desligar seu ambiente, utilize o comando abaixo:
docker-machine stop teste-virtualbox
Caso deseje iniciar seu ambiente, utilize o comando abaixo:
docker-machine start teste-virtualbox
Caso deseje remover seu ambiente, utilize o comando abaixo:
docker-machine rm teste-virtualbox
Tratamento de problema conhecido: Caso esteja utilizando docker-machine no MacOS e por algum motivo sua estação hiberne quando o ambiente virtualbox esteja iniciado, é possível que no retorno da hibernação esse Docker host apresente problemas em sua comunicação com a internet. Dessa forma oriento a sempre que passar problemas de conectividade no seu Docker host com driver virtualbox, desligue seu ambiente e reinicie como medida de contorno.
Nuvem
Para esse exemplo usaremos o driver da nuvem mais utilizada, que é AWS, ou seja, precisamos de uma conta na AWS para que esse driver funcione adequadamente.
É necessário que suas credenciais estejam no arquivo ~/.aws/credentials da seguinte forma:
[default]
aws_access_key_id = AKID1234567890
aws_secret_access_key = MY-SECRET-KEY
Caso não deseje colocar essas informações em arquivo, você pode especificar via variáveis de ambiente:
export AWS_ACCESS_KEY_ID=AKID1234567890
export AWS_SECRET_ACCESS_KEY=MY-SECRET-KEY
Você pode encontrar mais informações sobre credencial AWS nesse artigo.
Quando criado um ambiente utilizando o comando docker-machine create, isso é traduzido para AWS na criação uma instância EC2 e em seguida é instalado todos os softwares necessários automaticamente nesse novo ambiente.
Os parâmetros mais utilizados na criação desse ambiente são:
--amazonec2-region
: Informa qual região da AWS será utilizada para hospedar seu ambiente. O valor padrão é us-east-1.
--amazonec2-zone
: É a letra que representa a zona utilizada. O valor padrão é a
--amazonec2-subnet-id
: Informa qual a sub-rede utilizada nessa instância EC2. Ela precisa ter sido criada previamente.
--amazonec2-security-group
: Informa qual o security group será utilizado nessa instância EC2. Ele precisa ter sido criado previamente
--amazonec2-use-private-address
: Será criado uma interface com IP privado, pois por default ele só especifica uma com IP público
--amazonec2-vpc-id
: Informa qual o ID do VPC desejado para essa instância EC2. Ela precisa ter sido criado previamente.
Como exemplo, usarei o seguinte comando de criação do ambiente:
docker-machine create --driver amazonec2 --amazonec2-zone a --amazonec2-subnet-id subnet-5d3dc191 --amazonec2-security-group docker-host --amazonec2-use-private-address --amazonec2-vpc-id vpc-c1d33dc7 teste-aws
Após executar o comando, basta esperar finalizar, pois demora um pouco.
Para testar o sucesso do comando, execute o comando abaixo:
docker-machine ls
Verifique se o ambiente chamado teste-aws existe em sua lista, caso positivo utiliza o comando abaixo para mudar o ambiente:
eval $(docker-machine env teste-aws)
Inicie um container de teste pra testar o novo ambiente
docker run hello-world
Caso deseje desligar seu ambiente, utilize o comando abaixo:
docker-machine stop teste-aws
Caso deseje iniciar seu ambiente, utilize o comando abaixo:
docker-machine start teste-aws
Caso deseje remover seu ambiente, utilize o comando abaixo:
docker-machine rm teste-aws
Após removido localmente, ele automaticamente removerá a instância EC2 que foi provisionada na AWS.
Pingback: Utilizando Docker em múltiplos ambientes - Peguei do()