PARTE 1 Docker - Containers em Linux [Artigo]
Uma coisa extremamente importante é como acessar o
container.
Digo isso do ponto de vista da aplicação. Até o momento, instalamos o
Docker aprendemos a subir container parar container, entre outros comandos. Porém, um comando muito importante ficou pendente, como por exemplo, instalamos um Apache dentro de um container. Como acessar o Apache desse container?
Para isso utilizaremos um parâmetro muito útil no gerenciamento de containers, que é o parâmetro "-p" (publish). Esse parâmetro faz com que você consiga "bindar" a porta do seu DockerHost com a porta do seu container. Caso não tenha ficado muito claro, vamos à prática para facilitar o entendimento.
Primeiro, rode um container;
# docker run -ti debian
Após o comando, muito provavelmente você já vai estar dentro do container no seu terminal e vai ter algo parecido com:
root@30b05a28c14e:/#
Agora, dentro do container, instale o Apache;
root@30b05a28c14e:/#
apt-get install apache2
Inicie o serviço;
root@30b05a28c14e:/#
/etc/init.d/apache2 start
Até o momento, caso você tenha efetuado o teste de colocar o IP do container no navegador do seu DockerHost, você viu que de fato o Apache está funcionando no seu container. Porém, caso você tenha tentado acessar o Apache que está rodando no seu container através de outro host, muito provável que nem pingar no container você consiga.
Isso acontece, pois ainda não definimos em qual porta o container deve escutar. Rode o comando
docker ps e veja o status da sua porta:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
30b05a28c14e debian "/bin/bash" About an hour ago Up 42 seconds insane_chandrasekhar
Veja que não existe configuração alguma para as portas do container.
Porém, a forma (por enquanto) de acessar um container é através do IP do DockerHost, sendo assim, temos que fazer um redirecionamento de portas, de forma que se você acessar o IP do DockerHost em uma porta especifica, será redirecionado automaticamente ao container. Por sorte, como tudo no Docker, isso é feito de forma simples, não vamos precisar de várias regras de IPtables para isso; toda essa parte "burocrática", o Docker fica encarregado de fazer.
Antes disso, vamos salvar essa imagem de container, pois já instalamos o Apache nela e para facilitar o processo sem ter que subir outro container e ter que reinstalar o Apache, vamos salvar essa imagem para continuar de onde paramos.
Para isso, vamos utilizar o
commit, que é um comando do Docker que serve para salvar uma imagem:
# docker commit -m "lab de container" 30b05a28c14e apache_lab:1.0
Após rodar esse comando, rode o comando:
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
apache_lab 1.0 b994948dbab5 About an hour ago 193.9 MB
debian latest 1b01529cc499 4 weeks ago 125.1 MB
graylog2/allinone latest 37344ed703dc 5 months ago 870.3 MB
Veja que foi gerada uma imagem baseada no container que criamos com a imagem do Debian, porém, essa imagem já vem com o Apache instalado, pois já fizemos isso.
A pergunta é: qual a vantagem em fazer isso? A vantagem é que ao iniciar um outro container baseado nessa imagem "comitada", não vamos ter que reinstalar o Apache, o que torna o processo mais rápido,. Economizar tempo hoje em dia, a meu ver, é muito bom.
Agora, pense que você precisa sempre estar testando um cenário especifico, toda vez é a mesma coisa, com containers você pode continuar da onde parou, o que dependendo do cenário, o ganho de tempo é gigantesco. Vamos iniciar um container baseado nessa imagem que acabamos de efetuar um "commit":
# docker run -ti -p 8081:80 apache_lab:1.0
Obviamente, o serviço do apache desse container vai estar parado, então, inicie o serviço:
root@7155da1ddf08:/#
/etc/init.d/apache2 start
Bom, agora saia do container sem matar ele e após, o seu terminal estar no DockerHost, rode o comando abaixo:
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7155da1ddf08 apache_lab:1.0 "/bin/bash" 2 days ago Up 5 minutes 0.0.0.0:8081->80/tcp thirsty_noether
Agora, veja a diferença entre essa saída do
docker ps baseado com a última vez que executamos o comando. Observe a coluna "PORTS". Agora sim, nosso container está acessível. Ele possui uma porta onde ele fica escutando o tempo todo.
Para validar o teste, jogue no seu navegador o
ip-do-seu-DockerHost:8081 e veja que vai abrir a tela inicial do Apache. Para que possa ficar mais fácil de entender, detalhando o último comando que executamos para subir esse container:
- doker run -ti → Inicia um container com um terminal interativo.
- -p 8081:80 → -p "publisher" faz com que você consigar "bindar" a porta do seu DockerHost com a porta do Container, lembrando que a lógica é 8081: Porta do DockerHost, 80 porta do container. Como o exemplo anterior mostra, ao bater na porta do DockerHost na porta 8081 você será redirecionado para a porta 80 do container em questão.
- apache_lab:1.0 → Nome da imagem que efetuamos um "commit".
Bom, agora com esse exemplo, não preciso ficar batendo muito nessa tecla, suba seus labs com os serviços, ou aplicação em container, e vá migrando seus labs aos poucos para o Docker. Conforme você vai utilizando, mais prática vai pegando e cada vez mais o seu dia-a-dia vai se tornando mais dinâmico no que se refere a labs e compartilhar cenário com outros colaboradores, enfim...
Uma dica que eu recomendo, é fazer o seu lab em VM? Ok, agora tente refazer ele em container.
Após finalizado, reinicie o procedimento do zero e veja na prática onde está a vantagem.
Sendo assim, podemos começar a brincar mais com o gerenciamento de imagens, no Docker. Para isso, devemos iniciar com uma pergunta...