Как подключить контейнеры Docker?

Sep 23 2020

В «Что такое контейнер?» то dockerдокументы показывают следующее изящное изображение:

Для моего сценария у меня есть только приложение A и приложение B; обозначим их Алисой и Бобом. Как вообще и в частности общаются Алиса и Боб? По принципу KISS, конкретно использую MySQLи BaseXиз docker hub.

Подразумевается, что xqueryфайл находится на хосте, который затем отправляется в BaseXконтейнер для выполнения. Это конкретный запрос SQL, поэтому MySQLнужно будет запросить результат у контейнера.

Это требует переадресации портов или других сетевых подходов? Объемы? Требует ли это дополнительное создание сообщения файл , состоящий из, в свою очередь, MySQLи BaseX?

Несомненно, есть много возможных подходов. Что наиболее прагматично с точки зрения обучения? Концептуально легкий, с постепенным обучением.

Один подход, похоже, использует мостовую сеть:

Воспользовавшись тем, что контейнеры могут видеть друг друга.

Мне кажется, это не связано с RESTполноценными веб-сервисами.


Если посмотреть на связанные вопросы, это может коснуться обратного прокси.

Ответы

1 K8sN0v1c3 Sep 23 2020 at 10:01

Я все еще новичок в игре Docker, но у меня есть несколько небольших проектов, и я делаю именно то, о чем вы спрашиваете. Благодаря моему собственному опыту проб и ошибок (в основном ошибок ...) я бы предложил использовать docker-compose.yml с вашей сетью, настроенной на статические внутренние IP-адреса, чтобы каждый контейнер имел предсказуемые, повторяемые результаты и IP-адреса, которые вы можете настроить для своих контейнеров. общаться.

Я не знаком, BaseXно у меня есть примерная ситуация с использованием docker-compose version: "3.7"здесь, которая может легко запускать несколько приложений и / или быть добавлена ​​или перепрофилирована в соответствии с вашей гипотетической.

В этом примере docker-compose есть следующее:

  • Отдельный контейнер для заполнения моего app-volumeтома содержимым публичного репозитория GitHub.

  • Контейнер веб-сервера Apache с включенным PHP-FPM для «выборочного бэкэнда», который создается из файла Docker в каталоге ~ / dockerbuild.

  • Контейнер веб-сервера nginx, используемый в качестве обратного прокси-сервера для передачи всего PHP в Apache (но обслуживает и кеширует почти все остальное).

  • Контейнер MariaDB в смеси для БД приложения, который я заполняю файлом mysqldump после сборки приложения.

Это уменьшенная версия моего docker-compose.yml, поэтому обратите внимание, что вы можете добавить множество вещей, таких как healthcheck:и command:в соответствии с вашими потребностями.

Вы выполняете with docker-compose up -d --buildкак для сборки, так и для запуска приложения в одной команде (но вы, вероятно, захотите создать свой собственный файл ba (.sh), который вы будете выполнять впоследствии, также для этих важных штрихов).

Обратите внимание на static-network. И хотя в этом примере я использую именованные тома, это просто мое предпочтение.

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

Моя команда очистки, когда я отключаю приложение, выглядит некрасиво, но ее не так сложно читать, и она выглядит примерно так: 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;

Я думаю, что каждое «независимое приложение» может (и, вероятно, должно) иметь свои собственные файлы docker-compose и / или Dockerfiles, но вы можете найти синергию с некоторыми файлами Docker, для которых вы можете создавать собственные command:инструкции (например, пример git_repo_clone), которые будут использоваться и общий для нескольких «приложений».