Simplificando o Docker — parte 1

Primeiramente eu queria dizer que não quero ofender ninguém e dizer que o que li sustentou o que eu sei hoje. Faz-me uma pessoa que não é especialista no Docker, mas consigo “me virar” com ele .Ofender no sentido de falar que outros tutoriais não prestam, longe disso, eu apenas queria ter lido algo mais simples kkk.

Vamos lá. O objetivo de eu escrever em parte é consolidar o que eu aprendi, já que se eu não conseguir passar para ninguém deve ser sinal que na verdade eu não sei :(. Então escrever isto é meio que um desafio, apesar do texto não ser complexo. Ao menos eu tentei deixar o mais simples possível. Outra parte é querer contribuir.

Outra coisa que eu queria é ser direto ao ponto. Você pode ler 5.000 tutoriais e livros na Internet sobre história, comparação com Vagrant e VMs, falando de LXC etc, falando do “na minha máquina funciona”. Eu não quero falar disto senão fugirei do meu objetivo que é ser simples e ir direto ao ponto.

Não vou falar também da instalação do Docker (depende do SO, se precisar busque no Google por exemplo por favor. Ex: https://www.google.com/search?q=docker+install&rlz=1C1GCEU_pt-BRBR879BR879&oq=docker+install&aqs=chrome..69i57j0l9.3543j0j4&sourceid=chrome&ie=UTF-8) e da criação do usuário no Docker Hub, um local onde você pode hospedar 1 imagem privada e diversas públicas. Veja por favor o http://hub.docker.com se precisar.

Outra coisa é que vou dividir em 4 partes este tutorial, porque se eu fizer em uma só vou demorar e vai ficar muito grande. Já temos 5 parágrafos e nem começamos ainda kkk.

Uma coisa a se ter em mente é que a ordem das coisas em um comando pode fazer ele não funcionar. Exemplo:

> sudo docker run nginx –d –p 8000:80 (isto não funciona)

> sudo docker run –d –p 8000:80 nginx (isto funciona)

Vamos fazer uma aplicação de um site simples, bem simples mesmo. Primeiro vamos conectar no container e vamos fazer as coisas por dentro dele.

Depois vamos criar um Dockerfile e vamos criar tal container por ele.

Vamos fazer o básico: um container com um Nginx simples:

> sudo docker run –d –p 8000:80 nginx

-d: para ser um daemon. Assim o container não nascerá e morrerá

-p x:y: Mapeamento de portas. A 80 do container estará disponível na máquina pela 8000

nginx: a imagem base. De onde ela saiu? Do registry do Docker.

Resultado. Tadããã!!!!

Vamos ver um docker ps:

> sudo docker ps

Legal, o container apareceu no “docker ps”

Agora vamos matar o container e ver um “docker ps” novamente. Para isto vamos fazer um docker kill no CONTAINER ID que apareceu na primeira coluna do comando anterior:

> sudo docker kill bb8bc0f925290

> sudo docker ps

Legal, né? Veja a imagem abaixo:

E no navegador já não temos resposta na porta 8000:

Pode subir em outras portas que funcionará, veja as imagens abaixo:

Uma vez li uma analogia de imagem é a receita, como se fosse uma classe. E o container é como se fosse um objeto, ele é feito “a partir da receita da classe”. E você pode criar vários objetos da classe.

Vamos subir o container novamente e entrar nele (tendo disponível um shell dele):

> sudo docker run –it –p 8009:80 nginx /bin/bash

Aí tivemos um problema. O Nginx não iniciou sozinho. Eu tive que iniciar via service:

> service nginx start

Veja que eu não usei o “sudo”

A imagem do terminal é a mesma da que está acima.

E do navegador está abaixo:

Legal, mas agora eu quero mudar a página apresentada. Bem, vamos lá. Se for bem simples, você pode fazer no container mesmo. Para isto precisará estar “logado” no container (da mesma forma que você esteve logado nele para rodar o comando “service”).

Primeiro você pode ver que o container não tem vi, vim, pico, nano. Aaaa, vou instalar via apt-get. Então, não vai funcionar no caso de nenhum destes nesta imagem. Nem o less tem. Tem o cat…

Vamos então dar um:

cat /etc/nginx/conf.d/default.conf

Vimos que o root está apontando para o /usr/share/nginx/html

Então vamos fazer um:

> cd /usr/share/nginx/html

> head -23 index.html > index.html

> echo “<h1>oi</h1>” >> index.html

> echo “</body></html>” >> index.html

Com o head pego as primeiras linhas do index.html. Depois acrescento (>>) o “oi” e no final fecho as tags restantes. Resultado:

Legal, agora quero parar este container e já subi-lo com esta alteração. Então precisaremos do commit:

Primeiro vamos pegar o ID com um “docker ps”:

> sudo docker ps

Depois vamos fazer o commit no CONTAINER_ID

> sudo docker commit f6509527b9b9 87878786/com-oi

O “com-oi” é obviamente um label que eu inventei. O 87878786 é meu ID no Docker Hub. Podemos “commitar” sem ele, mas na hora de subir a imagem dará problema.

Legal, falta agora saber como eu usarei isto. Eu não enviarei a imagem para o Hub inicialmente. Vou usá-la primeiro.

Se eu simplesmente subir um novo container da imagem nginx não funcionará. O resultado abaixo:

Como não funcionou? Está aí na imagem! Mas cadê o “oi”?

No comando abaixo coloquei o “head -2” apenas para não aparecer várias imagens fora de contexto, ok? Veja que aparece uma nova imagem (“classe”) na lista. Se temos uma “classe”, podemos criar um “objeto”?

Com um “docker run”!

> sudo docker run -p 8077:80 -it 87878786/com_oi /bin/bash

Agora seria interessante hospedar a imagem no docker hub:

> docker login

E depois fazer um “push”.

> docker push 87878786/com_oi

Na imagem acima você pode ver 2 coisas:

  • O resultado dos comandos acima;
  • Que de vez em quando eu esqueço de usar o sudo.

Olhe o “87878786” outra vez no “docker push” :).

Já podemos ver a imagem no Hub:

Por agora encerraremos. Em breve enviarei a segunda parte. Obrigado!

Programador do CAC/COE da Riachuelo

Programador do CAC/COE da Riachuelo