Conectar Containers com Link

DockerBeginner
Pratique Agora

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

Resultado Esperado

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

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

    • 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 o container em /app.
    • Instale os pacotes necessários.
    • Exponha a porta 80 para o mundo exterior.
    • Defina uma variável de ambiente (embora não a usemos neste exemplo, mantenha a instrução).
    • Execute app.py quando o container iniciar.

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

    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 construir a imagem my-app.

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

    Aplicação web rodando no navegador

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_app adicional que se conecte aos containers Apache e MySQL.
  • Instale o cliente MySQL dentro do my_app antes 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:

  1. Inicie um container Apache chamado my_apache baseado na imagem httpd, mapeando a porta do host 80 para a porta do container 80.

    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 container MySQL chamado my_mysql, definindo a variável de ambiente MYSQL_ROOT_PASSWORD como password, 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 container my_app que se conecte aos containers MySQL e Apache. Nota: A conexão é visível na configuração do container. Você pode inspecioná-la 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 container my_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_app2 com ambos os links e estas variáveis de ambiente: DB_HOST=mysql, DB_USER=root, DB_PASSWORD=password e APACHE_HOST=apache.
  • Instale o curl dentro do 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 em sua máquina.

Resultado Esperado

  1. Inicie um container Apache e um container MySQL conforme descrito na Etapa 2.

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

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