Como conectar contêineres Docker?

Sep 23 2020

Em "O que é um container?" os dockerdocumentos mostram a seguinte imagem bacana :

Para meu cenário, tenho apenas o aplicativo A e o aplicativo B; vamos designá-los como Alice e Bob. Como Alice e Bob se comunicam, de maneira geral e específica? Usando o princípio KISS, concretamente, estou usando MySQLe BaseXdo hub do docker.

A noção é para um xqueryarquivo que reside no host, que é então enviado ao BaseXcontêiner para execução. Esta consulta específica é realmente SQL, portanto, o MySQLcontêiner precisará ser consultado para obter o resultado.

Isso exige encaminhamento de porta ou outras abordagens de rede ? Volumes? Isso requer um arquivo de composição adicional composto por, por sua vez, MySQLe BaseX?

Sem dúvida, existem muitas abordagens possíveis. O que é mais pragmático, do ponto de vista do aprendizado? Conceitualmente leve, com uma curva de aprendizado gradual.

Uma abordagem parece utilizar a rede de ponte:

Aproveitando o fato de que os contêineres podem se ver .

Isso não me parece relacionado a RESTserviços completos da web.


Olhando para as questões relacionadas, isso pode tocar em um proxy reverso.

Respostas

1 K8sN0v1c3 Sep 23 2020 at 10:01

Ainda sou bastante novo no jogo Docker também, mas tenho alguns pequenos projetos que faço exatamente o que você está pedindo. Por meio de minha própria experiência com tentativa e erro (principalmente erro ...), sugiro usar um docker-compose.yml com sua rede definida para IPs internos estáticos para que cada contêiner tenha resultados previsíveis e repetíveis e IPs para que você possa configurar seus contêineres para se comunicar.

Não estou familiarizado, BaseXmas tenho um exemplo de situação usando docker-compose version: "3.7"aqui que poderia facilmente executar vários aplicativos e / ou ser adicionado ou reaproveitado para se ajustar à sua hipótese.

Este exemplo docker-compose tem o seguinte:

  • Um contêiner separado para preencher meu app-volumevolume com o conteúdo de um repositório público do GitHub.

  • Um contêiner do Apache Web Server com PHP-FPM habilitado para um "back-end seletivo" que é construído a partir de um Dockerfile no diretório ~ / dockerbuild.

  • Um contêiner de servidor web nginx usado como um proxy reverso para todas as coisas de PHP a serem passadas para o Apache (mas serve e armazena em cache quase todo o resto).

  • Um contêiner MariaDB na mistura para o banco de dados do aplicativo que preencho com um arquivo mysqldump após o aplicativo ser construído.

Esta é uma versão simplificada do meu docker-compose.yml, então observe que você pode adicionar uma variedade de coisas como healthcheck:e command:para atender às suas necessidades.

Você executa com docker-compose up -d --buildpara construir e iniciar seu aplicativo em um comando (mas provavelmente você deseja criar seu próprio arquivo ba (.sh) que será executado posteriormente, também para aqueles toques finais importantes).

Observe static-network. E embora eu esteja usando volumes nomeados no exemplo, essa é apenas uma preferência minha.

version: "3.7"

services:

  github_repo_clone:
    image: debian:latest
    container_name: github_repo_clone
    networks: 
      static-network:
        ipv4_address: 172.20.0.254

    command: bash -c "
        apt-get update && 
        apt-get install git -y &&
        rm -rf examplerepo &&
        git clone https://github.com/exampleuser/examplerepo.git &&
        rm -rf /var/www/vhosts/exampleuser/examplerepo &&
        mkdir -p /var/www/vhosts/exampleuser/examplerepo &&
        cp -rapv examplerepo/* /var/www/vhosts/exampleuser/examplerepo &&
        rm -rf examplerepo &&
        tail -f /dev/null
      "
    volumes:
     - app-volume:/var/www/vhosts

  apache_php-fpm_backend:
    container_name: debian-build-demo0
    build: ~/dockerbuild
    ports:
     - "8080:8080"
    networks:
      static-network:
        ipv4_address: 172.20.0.2
    volumes:
     - app-volume:/var/www/vhosts


  nginx_rp:
    image: nginx:latest
    container_name: nginx-build-demo0
    ports:
     - "80:80"
     - "443:443"
    networks:
      static-network:
        ipv4_address: 172.20.0.3
    volumes:
     - app-volume:/var/www/vhosts

  mariadb:
    restart: always
    image: mariadb:latest
    container_name: mariadb-build-demo0
    ports:
     - "3306:3306"
    networks:
      static-network:
        ipv4_address: 172.20.0.10
    environment:
     - MYSQL_ROOT_PASSWORD=4007p@$$w04d - MYSQL_USER=dbusernamegoeshere - MYSQL_PASSWORD=@p@$$w04d
     - MYSQL_DATABASE=dbnamegoeshere
    volumes:
     - app-volume:/var/www/vhosts
    healthcheck:
      test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
      timeout: 10s
      retries: 5

volumes:
  app-volume:
#    external: true

networks:
  static-network:
    driver: bridge
    ipam:
      driver: default
      config:
       - subnet: 172.20.0.0/16

Meu comando de limpeza quando desligo o aplicativo é meio feio, mas não terrivelmente difícil de ler e funciona mais ou menos assim: docker-compose down -v ; docker rmi -f dockerbuild_apache_php-fpm_backend:latest mariadb:latest nginx:latest debian:latest ; docker rmi -f $(docker images -q --filter "dangling=true") ; docker rmi -f $(docker images -q --filter label=stage=intermediate) ; docker volume prune -f;

Acho que cada "aplicativo independente" poderia (e provavelmente deveria) ter seu próprio docker-compose e / ou Dockerfiles, mas você pode encontrar sinergias com certos Dockerfiles para os quais você pode criar command:instruções personalizadas (como o exemplo git_repo_clone) para serem usados ​​& compartilhada em vários "aplicativos".