Introdução
O Docker é uma ferramenta poderosa para implantar aplicações, mas pode parecer complexo inicialmente. Este desafio irá guiá-lo através da conexão de contêineres Docker para criar uma aplicação multi-contêiner. Começaremos com exemplos simples e progrediremos gradualmente para uma aplicação mais complexa. Mesmo que você seja novo no Docker, achará fácil acompanhar. Exploraremos como fazer com que os contêineres se comuniquem entre si, o que é um aspecto fundamental para construir aplicações robustas com o Docker.
Criar uma Imagem com Dockerfile
Antes de podermos conectar contêineres, precisamos ter pelo menos uma aplicação conteinerizada. Nesta etapa, você criará um Dockerfile para sua imagem my-app. Este Dockerfile definirá o ambiente e a aplicação a ser executada dentro do contêiner.
Tarefa
O objetivo desta etapa é criar um Dockerfile para sua imagem my-app.
Requisitos
- O Docker deve estar instalado em sua máquina.
- Você deve ter uma aplicação
my-appexistente que deseja conteinerizar.
Exemplo de Resultado
Crie os arquivos necessários para o desafio:
Crie um novo arquivo chamado
Dockerfileno caminho/home/labex/project/com o seguinte conteúdo:- Use
python:3.7-slimcomo imagem base. - Defina o diretório de trabalho como
/app. - Copie o conteúdo do diretório atual para o contêiner em
/app. - Instale os pacotes necessários.
- Exponha a porta
80para o mundo exterior. - Defina uma variável de ambiente (embora não a utilizemos neste exemplo, mantenha a instrução).
- Execute
app.pyquando o contêiner iniciar.
Crie um arquivo chamado
app.pyem seu diretório de projeto/home/labex/project/com o seguinte conteúdo:import os os.system("wssh --address='0.0.0.0' --port=80")Crie um arquivo chamado
requirements.txtem seu diretório de projeto/home/labex/project/com o seguinte conteúdo:webssh==1.6.2labex:project/ $ pwd /home/labex/project labex:project/ $ ll total 12K -rw-r--r-- 1 labex labex 59 Jan 24 15:21 app.py -rw-r--r-- 1 labex labex 163 Jan 24 15:19 Dockerfile -rw-r--r-- 1 labex labex 14 Jan 24 15:21 requirements.txt- Use
Use o comando
docker buildpara construir a imagemmy-app.labex:project/ $ docker images | grep my-app my-app latest 266edf714faf 30 seconds ago 170MBInicie um novo contêiner usando a imagem
my-appe observe o mapeamento de portas.labex:project/ $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 11f06f08d2d3 my-app "python app.py" 4 seconds ago Up 4 seconds 0.0.0.0:8080- hopeful_elgamal > 80/tcpAbra um navegador web e navegue até
http://localhost:8080para verificar se sua aplicação está sendo executada corretamente.
Conectando Dois Contêineres Docker
Agora que temos uma aplicação conteinerizada, vamos prosseguir para a conexão de contêineres. Nesta etapa, aprenderemos como conectar dois contêineres Docker, permitindo que eles se comuniquem entre si. Este processo é fundamental para criar aplicações multi-serviço dentro do Docker.
Tarefa
Conecte um contêiner de servidor web Apache com um contêiner de banco de dados MySQL.
Requisitos
- Você precisará de dois contêineres Docker: um rodando Apache e outro rodando MySQL.
- O Docker deve estar instalado em sua máquina.
Dica
- Lembre-se de abrir um novo terminal para iniciar esta etapa, para que não haja conflito com o contêiner anterior.
Exemplo de Resultado
Acesse o MySQL a partir do contêiner Apache:
Inicie um contêiner Apache chamado
my_apachebaseado na imagemhttpd, mapeando a porta do host80para a porta do contêiner80.labex:project/ $ docker ps | grep my_apache a91a93216e84 httpd "httpd-foreground" 52 seconds ago Up 47 seconds 0.0.0.0:80- my_apache > 80/tcpInicie um contêiner MySQL chamado
my_mysql, definindo a variável de ambienteMYSQL_ROOT_PASSWORDcomopassword, usando a imagemmysql.labex:project/ $ docker ps | grep mysql 0cb864cf97c6 mysql "docker-entrypoint.s…" 42 seconds ago Up 35 seconds 3306/tcp, 33060/tcp my_mysqlConecte o contêiner Apache ao contêiner MySQL. Nota: Para esta etapa, não é esperado nenhum output de comando direto, mas a conexão estará visível nas variáveis de ambiente do contêiner. Você pode inspecionar o contêiner com o comando
docker inspect my_apache.labex:project/ $ docker ps | grep my_app 859c201b7267 my-app "python app.py" 53 seconds ago Up 52 seconds 80/tcp my_appUse o comando
docker execpara acessar a interface de linha de comando do MySQL a partir do contêinermy_app(você precisará adaptar o comando se tiver conectado de forma diferente).Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.3.0 MySQL Community Server - GPL Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]>
Conectando Múltiplos Contêineres Docker e Usando Variáveis de Ambiente
Com base na etapa anterior, esta parte adiciona duas novas ideias: um contêiner de aplicação que se conecta a ambos os serviços e o contêiner que recebe as configurações de conexão através de variáveis de ambiente. Na Etapa 2, você apenas provou que contêineres conectados podem alcançar um ao outro. Nesta etapa, você deve iniciar o my_app2 com ambas as opções --link e as variáveis de ambiente que descrevem os hosts MySQL e Apache.
Tarefa
Inicie três contêineres: um rodando Apache, um rodando MySQL e um rodando uma aplicação personalizada. A aplicação personalizada deve ser capaz de acessar tanto o MySQL quanto o Apache.
Requisitos
- Você precisará de três contêineres Docker: Apache, MySQL e uma aplicação personalizada.
- Inicie o
my_app2com ambos os links e estas variáveis de ambiente:DB_HOST=mysql,DB_USER=root,DB_PASSWORD=passwordeAPACHE_HOST=apache. - Instale o
curldentro domy_app2antes de testar a conexão com o Apache, pois a imagemmy-appnão o inclui por padrão. - O Docker deve estar instalado em sua máquina.
Exemplo de Resultado
Inicie um contêiner Apache e um contêiner MySQL conforme descrito na Etapa 2.
Inicie um contêiner de aplicação personalizada chamado
my_app2que possa acessar tanto o MySQL quanto o Apache.labex:project/ $ docker ps | grep app2 8945b42659a6 my-app "python app.py" 15 seconds ago Up 15 seconds 80/tcp my_app2Entre no
my_app2, instale ocurle executecurl http://apache/para confirmar que o contêiner Apache conectado está acessível.<html> <body> <h1>It works!</h1> </body> </html>
Resumo
Neste desafio, você aprendeu como conectar contêineres Docker para criar aplicações multi-contêiner. Progredimos de um único contêiner para pares conectados e, finalmente, para uma configuração de três contêineres. Agora você tem uma compreensão de como aproveitar as conexões de contêineres e o comando docker exec para permitir a comunicação entre diferentes serviços, permitindo que você construa aplicações mais complexas. Continue experimentando e divirta-se!



