Introdução
O Docker é uma ferramenta poderosa para implantar aplicações, mas pode parecer complexo no início. Neste desafio, você aprenderá a vincular contêineres Docker para criar uma aplicação com vários contêineres. Começaremos com exemplos simples e avançaremos gradualmente para uma aplicação mais complexa. Mesmo que você seja iniciante no Docker, este conteúdo será fácil de acompanhar. Você verá como fazer os contêineres se comunicarem entre si, um aspecto fundamental da criação de aplicações robustas com Docker.
Criar uma imagem com Dockerfile
Antes de vincular contêineres, precisamos ter pelo menos uma aplicação conteinerizada. Nesta etapa, você criará um Dockerfile para a imagem my-app. Esse Dockerfile definirá o ambiente e a aplicação que serão executados dentro do contêiner.
Tarefas
O objetivo desta etapa é criar um Dockerfile para a imagem my-app.
Requisitos
- O Docker deve estar instalado na sua máquina.
- Você deve ter uma aplicação
my-appexistente que deseja conteinerizar.
Dicas
- Defina as entradas da imagem antes de criar e executar o contêiner.
Resultado esperado
Crie os arquivos necessários para o desafio:
Crie um novo arquivo chamado
Dockerfileno caminho/home/labex/project/com o conteúdo a seguir:- Use
python:3.7-slimcomo imagem base. - Defina o diretório de trabalho como
/app. - Copie o conteúdo do diretório atual para
/appdentro do contêiner. - Instale os pacotes necessários.
- Exponha a porta
80para acesso externo. - Defina uma variável de ambiente. Embora ela não seja usada neste exemplo, mantenha essa instrução.
- Execute
app.pyquando o contêiner for iniciado.
Crie um arquivo chamado
app.pyno diretório do projeto/home/labex/project/com o conteúdo a seguir:import os os.system("wssh --address='0.0.0.0' --port=80")Crie um arquivo chamado
requirements.txtno diretório do projeto/home/labex/project/com o conteúdo a seguir: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 criar 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 e acesse
http://localhost:8080para verificar se a aplicação está sendo executada corretamente.
Vincular dois contêineres Docker
Agora que temos uma aplicação conteinerizada, vamos vincular contêineres. Nesta etapa, você aprenderá a vincular dois contêineres Docker para permitir a comunicação entre eles. Esse processo é essencial para criar aplicações com vários serviços no Docker.
Tarefas
Inicie contêineres de serviço Apache e MySQL. Em seguida, inicie um contêiner my_app vinculado aos dois serviços para testar a conexão com o MySQL a partir de my_app.
Requisitos
- Você precisará de dois contêineres Docker: um executando o Apache e outro executando o MySQL.
- Inicie um contêiner
my_appadicional vinculado aos contêineres Apache e MySQL. - Instale o cliente MySQL dentro de
my_appantes de testar a conexão com o banco de dados. - O Docker deve estar instalado na sua máquina.
Dicas
- Abra um novo terminal para iniciar esta etapa, evitando conflitos com o contêiner iniciado anteriormente.
Resultado esperado
Acesse o MySQL a partir do contêiner my_app depois de vinculá-lo aos dois serviços:
Inicie um contêiner Apache chamado
my_apachecom base na imagemhttpd, mapeando a porta80do host para a porta80do contêiner.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_PASSWORDcomopassworde 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 contêiner
my_appvinculado aos contêineres MySQL e Apache. Observação: o vínculo fica visível na configuração do contêiner. Você pode inspecioná-lo 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 contêinermy_app. Será necessário adaptar o comando se você tiver criado os vínculos de outra forma.Instale o cliente MySQL dentro de
my_appe conecte-se ao serviço MySQL vinculado: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)]>
Vincular vários contêineres Docker e usar variáveis de ambiente
Dando continuidade à etapa anterior, esta parte apresenta duas ideias novas: um contêiner de aplicação é vinculado aos dois serviços, e o contêiner recebe as configurações de conexão por meio de variáveis de ambiente. Na etapa 2, você apenas comprovou que os contêineres vinculados conseguem alcançar uns aos outros. Nesta etapa, você deve iniciar my_app2 com as duas opções --link e com as variáveis de ambiente que descrevem os hosts MySQL e Apache.
Tarefas
Inicie três contêineres: um executando o Apache, um executando o MySQL e um executando uma aplicação personalizada. A aplicação personalizada deve conseguir acessar o MySQL e o Apache.
Requisitos
- Você precisará de três contêineres Docker: Apache, MySQL e uma aplicação personalizada.
- Inicie
my_app2com os dois vínculos e estas variáveis de ambiente:DB_HOST=mysql,DB_USER=root,DB_PASSWORD=passwordeAPACHE_HOST=apache. - Instale
curldentro demy_app2antes de testar a conexão com o Apache, pois a imagemmy-appnão o inclui por padrão. - O Docker deve estar instalado na sua máquina.
Dicas
- Reutilize os contêineres de serviço da etapa 2. Se precisar confirmar os vínculos ou o ambiente, inspecione o novo contêiner da aplicação.
Resultado esperado
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 consiga acessar o MySQL e o Apache.labex:project/ $ docker ps | grep app2 8945b42659a6 my-app "python app.py" 15 seconds ago Up 15 seconds 80/tcp my_app2Entre em
my_app2, instalecurle executecurl http://apache/para confirmar que o contêiner Apache vinculado pode ser alcançado.<html> <body> <h1>It works!</h1> </body> </html>
Resumo
Neste desafio, você aprendeu a vincular contêineres Docker para criar aplicações com vários contêineres. Você avançou de um único contêiner para pares de contêineres vinculados e, por fim, para uma configuração com três contêineres. Agora você entende como usar vínculos entre contêineres e o comando docker exec para permitir a comunicação entre diferentes serviços, criando aplicações mais complexas. Continue experimentando e divirta-se!



