Conectar contêineres com Link

DockerBeginner
Pratique Agora

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-app existente que deseja conteinerizar.

Dicas

  • Defina as entradas da imagem antes de criar e executar o contêiner.

Resultado esperado

  1. Crie os arquivos necessários para o desafio:

    Crie um novo arquivo chamado Dockerfile no caminho /home/labex/project/ com o conteúdo a seguir:

    • Use python:3.7-slim como imagem base.
    • Defina o diretório de trabalho como /app.
    • Copie o conteúdo do diretório atual para /app dentro do contêiner.
    • Instale os pacotes necessários.
    • Exponha a porta 80 para acesso externo.
    • Defina uma variável de ambiente. Embora ela não seja usada neste exemplo, mantenha essa instrução.
    • Execute app.py quando o contêiner for iniciado.

    Crie um arquivo chamado app.py no 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.txt no diretório do projeto /home/labex/project/ com o conteúdo a seguir:

    webssh==1.6.2
    
    labex: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
    
  2. Use o comando docker build para criar a imagem my-app.

    labex:project/ $ docker images | grep my-app
    my-app latest 266edf714faf 30 seconds ago 170MB
    
  3. Inicie um novo contêiner usando a imagem my-app e 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/tcp
    
  4. Abra um navegador e acesse http://localhost:8080 para verificar se a aplicação está sendo executada corretamente.

    Aplicação web em execução no navegador

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_app adicional vinculado aos contêineres Apache e MySQL.
  • Instale o cliente MySQL dentro de my_app antes 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:

  1. Inicie um contêiner Apache chamado my_apache com base na imagem httpd, mapeando a porta 80 do host para a porta 80 do 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/tcp
    
  2. Inicie um contêiner MySQL chamado my_mysql, definindo a variável de ambiente MYSQL_ROOT_PASSWORD como password e usando a imagem mysql.

    labex:project/ $ docker ps | grep mysql
    0cb864cf97c6 mysql "docker-entrypoint.s…" 42 seconds ago Up 35 seconds 3306/tcp, 33060/tcp my_mysql
    
  3. Inicie um contêiner my_app vinculado aos contêineres MySQL e Apache. Observação: o vínculo fica visível na configuração do contêiner. Você pode inspecioná-lo com docker 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_app
    
  4. Use o comando docker exec para acessar a interface de linha de comando do MySQL a partir do contêiner my_app. Será necessário adaptar o comando se você tiver criado os vínculos de outra forma.

    Instale o cliente MySQL dentro de my_app e 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_app2 com os dois vínculos e estas variáveis de ambiente: DB_HOST=mysql, DB_USER=root, DB_PASSWORD=password e APACHE_HOST=apache.
  • Instale curl dentro de my_app2 antes de testar a conexão com o Apache, pois a imagem my-app nã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

  1. Inicie um contêiner Apache e um contêiner MySQL conforme descrito na etapa 2.

  2. Inicie um contêiner de aplicação personalizada chamado my_app2 que 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_app2
    
  3. Entre em my_app2, instale curl e execute curl 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!

✨ Verificar Solução e Praticar✨ Verificar Solução e Praticar✨ Verificar Solução e Praticar