Docker, do Básico a Orquestração e Clusterização - 5. Ambiente

Nessa série de artigos estamos abordando tópicos para uma boa utilização do Docker .

Ship shipping ships

Para entender melhor a orquestração e antes de partirmos para a clusterização precisamos entender bem como usar o docker em nossa máquina de dia a dia, a nossa máquina dev, nosso ambiente de desenvolvimento.

Se sua máquina estiver rodando Linux, qualquer distribuição, tudo fica mais fácil. Por que wsilva? Porque como vimos nos artigos anteriores o Docker trabalha com LXC - Linux Containers. Bom, linux dispensa comentários mas container, fazendo um paralelo com a virtualização tradicional, seria o sistema operacional (Linux também no nosso caso) rodando como guest.

Pô wsilva mas então é Linux rodando em cima de Linux!?

Exatamente. E como também já vimos anteriormente a grande vantagem de usarmos LXC é não precisar do hypervisor (Virtualbox e afins), já que muitos recursos são compartilhados entre o Host e o Guest.

Aaaaa wsilva, então por isso que tem que ser Linux sobre Linux, senão esse compartilhamento não rola, certo!?

Certíssimo, rodar um linux container num host Windows acho quase impossível por causa da arquitetura, do Kernel diferente, etc. O mesmo também seria para o MacOS, mas devemos lembrar que MacOS vem do Unix. E o Linux vem do Minix que vem do Unix. Isso significa que por mais difícil que possa parecer pode pintar algum louco que consiga compartilhar o Kernel, libs e outros recursos de um host MacOS com containers Linux, ou até o contrário.

No Linux

No linux tenho trabalhado apenas com o Docker Compose . Temos um fig.yml, que em breve teremos que renomear para docker-compose.yml, com os container, a instruções de cada container, os links e tudo mais.

Após rodar o fig up / docker-compose up nossos containers sobem como se estivessem em nossa máquina local. Podemos confirmar com o docker-compose ps.

$ docker-compose up -d
fig.yml is deprecated and will not be supported in future. Please rename your config file to docker-compose.yml

Recreating projeto_proxy_1...
Recreating projeto_rabbit_1...
Recreating projeto_mysql_1...
Recreating projeto_solr_1...
Recreating projeto_redis_1...
Recreating projeto_web_1...
$ docker-compose ps
fig.yml is deprecated and will not be supported in future. Please rename your config file to docker-compose.yml

     Name                Command          State                        Ports
--------------------------------------------------------------------------------------------------
projeto_mysql_1    /entrypoint.sh mysqld   Up      0.0.0.0:3306->3306/tcp
projeto_proxy_1    forego start -r         Up      443/tcp, 0.0.0.0:80->80/tcp
projeto_rabbit_1   /run.sh                 Up      0.0.0.0:15672->15672/tcp, 0.0.0.0:5672->5672/tcp
projeto_redis_1    redis-server            Up      0.0.0.0:6379->6379/tcp
projeto_solr_1     /start-solr.sh          Up      0.0.0.0:8983->8983/tcp
projeto_web_1      /start-web.sh           Up      0.0.0.0:49153->80/tcp

Podemos acessar por exemplo o dashboard do rabbit pelo ip de loopback: http://127.0.0.1:15672, o próprio painel do solr pelo http://127.0.0.1:8983/, ou até o redis sem passar o parâmetro com o host:

redis-cli
127.0.0.1:6379>

No MacOS

No MacOS (e creio que no Windows seja parecido) precisamos rodar uma máquina virtual linux com o serviço docker de pé e é esse linux que vai ser o docker host rodar os containers.

Até a postagem desse artigo a instalação oficial de docker para MacOS e para Windows era através do boot2docker .

O boot2docker é um distribuição linux bem leve (aproximadamente 27MB) baseada no Tiny Core Linux que carrega em memória e já tem suporte para o file system (AUFS) requerido pelo docker e o próprio docker service.

Primeiro temos que criar nossa VM com o comando:

$ boot2docker init

Depois podemos iniciar nossa VM com o comando

$ boot2docker start

Sempre que iniciarmos uma janela de terminal nova no MacOS devemos exportar as variáveis de ambiente do Docker para que consigamos levantar nossos containers (que neste caso rodarão dentro do boot2docker). Basta rodar o comando:

$ $(boot2docker shellinit)

Com as variáveis exportadas podemos subir nossos containers:

$ docker-compose up -d

Para parar nossa VM:

boot2docker stop

Desvantagem

A desvantagem de não estar usando linux é que para acessar nossos containers temos que usar ip da VM, do boot2docker. Podemos pegar com o comando:

$ boot2docker ip

E assim acessar nossos containers pelo ip. Ex.: http://{ip.do.boot2docker}:15672 (rabbit) ou http://{ip.do.boot2docker}:8983/ ou até concatenar comandos para acessar o container de redis por exemplo:

redis-cli -h `boot2docker ip`

Alternativas no MacOS

Docker Machine

Quando disse que a até a data do post a instalação oficial era o boot2docker é porque agora temos uma “alternativa oficial” (sim entre aspas mesmo), o docker-machine que não só provisiona VMs linux em nossa máquina dev através do Virtualbox e VMware ele também provisiona em outros ambientes Linux e em serviços cloud como o EC2 da Amazon, o Azure, a Digitalocean, o Google Engine, Openstack, Rackspace, Softlayer, etc.

Por que alternativa oficial entre aspas? Porque a VM que ele provisiona (pelo menos localmente) é um boot2docker, e sendo o docker-machine mais completo pode vir a substituir o processo de instalação em MacOS e Windows que atualmente na documentação é a instalação do boot2docker puro e simples.

Para criar uma VM na DigitalOcean por exemplo executamos:

$ docker-machine create --driver digitalocean --digitalocean-access-token=tokenxptoyadaxptoyadatoken nome-da-vm

No nosso caso, para trabalhar localmente podemos criar uma VM no Virtual Box:

$ docker-machine create -d virtualbox nome-da-vm

Se quisermos criar com mais recursos.

$ docker-machine create --driver virtualbox --virtualbox-memory=2048 --virtualbox-disk-size=30000 nome-de-outra-vm

Se não passados esses parâmetros os padrões adotados são 20000 MB de disco e 1024 MB de memória.

Para listar as VMs criadas:

$ docker-machine ls
NAME              ACTIVE   DRIVER       STATE     URL                         SWARM
nome-da-vm        *        virtualbox   Running   tcp://192.168.99.100:2376
nome-de-outra-vm           virtualbox   Running   tcp://192.168.99.101:2376

Para exportar as variáveis de ambiente em nosso shell:

$ $(docker-machine env nome-da-vm)

Para parar e retormar uma vm. Se não passarmos o nome da VM ele entenderá que é a VM ativa:

$ docker-machine stop nome-da-vm
$ docker-machine start nome-da-vm

Para mudar a VM ativa:

$ docker-machine active nome-de-outra-vm

Kitematic

Dois dias depois que escrevi a parte 4 desta série de posts, no dia 12 de março, o pessoal do Docker estava apresentando o Kitematic como alternativa para Mac OS. Acompanhei o meet up online de apresentação do Kitematic no dia 17 de março e vou passar minhas impressões pessoais a respeito.

O Kitematic é um GUI (Graphical User Interface) baseado no docker-machine, escrito em Javascript. Parecido com o Atom é baseado na engine do Google Chrome (da até para inspecionar elemento) e desta maneira pode ser portado para o Windows. Durante a parte das perguntas (Q&A) no meet up eles deixaram escapar que essa portabilidade já está no RoadMap deles (Além de diversas melhorias na integração com dockerhub).

Esse carinha facilita muito a criação e a manutenção de containers, e se tivermos uma orquestração via docker-compose, os container criados também aparecerão também na tela do Kitematic.

A interação se dá por botões simples e intuitivos. Temos a opção para entrar no console de um container que esteja rodando (por debaixo dos panos utiliza o comando docker exec -ti container /bin/bash), temos a opção de abrir no navegador a url, na verdade o ip, do container, temos a opção de alterar as configurações de execução de um containere outras opções.

Abrindo o Kitematic. A VM criada é iniciada por baixo dos panos: Booting VM

Criando container com base em imagens existentes no Dockerhub: Creating Containers

Iniciando o novo container: Starting new container

Opções de visualizar log e preview no navegador: Preview Log and in Browser

Configurações do container: General Settings

Configurações de exposição de portas: Port Settings

Configurações de volumes a serem montados: Volume Settings

DVM

Alternativa para subir o docker no Mac OS http://fnichol.github.io/dvm/ . Também é baseado numa VM rodando boot2docker e os containers dentro da VM.

Ferramentas para gerenciamento de docker containers

São ferramentas para gerenciar a criação e até orquestração de containers

Shipyard

É um container que quando iniciamos consegue gerenciar a criação de novos containers via navegador. Tem algumas ferramentas interessantes que permitem monitoramento e até orquestração. http://shipyard-project.com/ .

Docker-UI

Parecido com o Shipyard mas com menos recursos https://github.com/crosbymichael/dockerui .

Panamax

Também parecido com Shipyard te dá a opção de subir um sistema multi containers http://panamax.io/ .

Concluindo

Todas as ferramentas que tenho visto para usar containers em Mac OS e Windows esbarram em ter que rodar os containers sobre uma VM (boot2docker). E sempre que rodamos esses containers para conseguirmos acesso via web , logs, e acesso remoto temos que ter em mente que não adianta bater no ip de loopback (127.0.0.1). Temos que bater (ou apontar nossos virtual hosts para) endereço da VM.

O mundo docker está evoluindo muito e bem rápido, é bom acompanhar as novidades sempre no blog deles e nos meet ups das comunidades.

To Be Continued

Para finalizar a série no próximo artigo falaremos sobre clusterização usando Docker Swarm

Té +