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 containers Docker para criar uma aplicação multi-container. 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 containers 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 containers, 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 container.
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.
Resultado Esperado
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 container em
/app. - Instale os pacotes necessários.
- Exponha a porta
80para o mundo exterior. - Defina uma variável de ambiente (embora não a usemos neste exemplo, mantenha a instrução).
- Execute
app.pyquando o container iniciar.
Crie um arquivo chamado
app.pyno 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.txtno 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 container usando a imagem
my-appe observe o mapeamento de porta.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 Containers Docker
Agora que temos uma aplicação conteinerizada, vamos passar para a conexão de containers. Nesta etapa, aprenderemos como conectar dois containers Docker, permitindo que eles se comuniquem entre si. Este processo é fundamental para criar aplicações com múltiplos serviços dentro do Docker.
Tarefa
Inicie containers de serviço Apache e MySQL, depois inicie um container my_app que se conecte a ambos os serviços para que você possa testar a conexão MySQL de dentro do my_app.
Requisitos
- Você precisará de dois containers Docker: um rodando Apache e outro rodando MySQL.
- Inicie um container
my_appadicional que se conecte aos containers Apache e MySQL. - Instale o cliente MySQL dentro do
my_appantes de testar a conexão com o banco de dados. - 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 seu container anterior.
Resultado Esperado
Acesse o MySQL a partir do container my_app após conectá-lo a ambos os serviços:
Inicie um container Apache chamado
my_apachebaseado na imagemhttpd, mapeando a porta do host80para a porta do container80.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 container 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_mysqlInicie um container
my_appque se conecte aos containers MySQL e Apache. Nota: A conexão é visível na configuração do container. Você pode inspecioná-la comdocker inspect my_app.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 containermy_app(você precisará adaptar o comando se tiver conectado de forma diferente).Instale o cliente MySQL dentro do
my_app, depois conecte-se ao serviço MySQL conectado:labex:project/ $ docker exec -it my_app bash root@859c201b7267:/app## apt-get update && apt install -y default-mysql-client root@859c201b7267:/app## mysql -h mysql -uroot -ppassword 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 Containers Docker e Usando Variáveis de Ambiente
Com base na etapa anterior, esta parte adiciona duas novas ideias: um container de aplicação se conecta a ambos os serviços, e o container recebe configurações de conexão através de variáveis de ambiente. Na Etapa 2, você apenas provou que containers 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 containers: 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 containers 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.
Resultado Esperado
Inicie um container Apache e um container MySQL conforme descrito na Etapa 2.
Inicie um container 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 container Apache conectado está acessível.<html> <body> <h1>It works!</h1> </body> </html>
Resumo
Neste desafio, você aprendeu como conectar containers Docker para criar aplicações multi-container. Progredimos de um único container para pares conectados e, finalmente, para uma configuração de três containers. Agora você tem uma compreensão de como aproveitar as conexões de container 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!



