Docker - Повторное использование docker - компоновка конфигураций для разных проектов - PullRequest
0 голосов
/ 05 августа 2020

У меня есть большой проект Docker с файлами Dockerfiles для nginx, apache2, varnish, redis, настроенный и хорошо работающий после нескольких недель изменений и тестирования.

Я сейчас нахожусь в точке, где настраиваю проекты для использования docker -compose и override.yml файлы для легкой настройки:

Я пытаюсь использовать одну и ту же настройку docker -compose для нескольких проектов (веб-сайтов)

Обычный запуск (с использованием docker-compose.yml and optional docker-compose.override.yml) docker-compose up -d

Пользовательский запуск (с использованием специальных файлов c docker -compose) docker-compose -f docker-compose.yml -f custom/docker-compose.website1.yml up -d

Оба этих метода запускаются нормально: docker-compose ps

Игнорируйте тот факт, что они Exit 0 - я остановил их, используя docker-compose stop, the containers work fine nginx -proxy / usr / bin / supervisord Exit 0 redis-cache / usr / bin / supervisord Exit 0 varni sh -cache / usr / bin / supervisord Exit 0 web-server-apache2 / usr / bin / supervisord Exit 0

Теперь мне нужен второй проект ( веб-сайт) для использования того же докера / docker - настройка конфигурации:

docker-compose -f docker-compose.yml -f anothercustomfolder/docker-compose.website2.yml up -d

К моему удивлению docker -compose воссоздали контейнеры и не создают новый набор контейнеров:

См. Раздел «Текущая настройка», чтобы узнать, как я настраиваю вещи.

  Creating network "delete-network-frontend" with the default driver
  Recreating nginx-proxy        ... done
  Recreating varnish-cache      ... done
  Recreating web-server         ... done
  Recreating redis-cache        ... done

При запуске docker-compose ps во второй папке настройки:

Обратите внимание, что имена не такие, как указано выше (это вторая настройка теста)

         Name                       Command          State                Ports
  ------------------------------------------------------------------------------------------------
  nginx-proxy-delete       /usr/bin/supervisord   Up      0.0.0.0:443->443/tcp,
                                                          0.0.0.0:80->80/tcp
  redis-cache-delete       /usr/bin/supervisord   Up      0.0.0.0:6379->6379/tcp
  varnish-cache-delete     /usr/bin/supervisord   Up      0.0.0.0:6081->6081/tcp,
                                                          0.0.0.0:6082->6082/tcp
  web-server-              /usr/bin/supervisord   Up      0.0.0.0:8080->8080/tcp
  apache2-delete

Похоже, что docker -compose выполнил две вещи: 1. Воссоздал (заменил) контейнеры проекта 1, использовал имена контейнеров проекта 1, чтобы указать, что они были «воссозданы», и 2. Удалите контейнеры проекта 1, переименовав его. для проецирования 2 контейнеров.

Текущая настройка

  • Я создал полный проект Dockerfile, настроенный с помощью docker -compose.yml и двух файлов переопределения docker -compose (docker-compose.website1.yml and docker -compose.website2.yml`).
  • Я сделал полную копию рабочего Dockerfile / docker -compose.yml project и создал новую папку: In other слова, оба они будут использовать те же настройки docker, но использовать разные docker -compose.yml переопределить файлы . /var/www/docker/site1 /var/www/docker/site2

Вопрос

TL; DR: как использовать рабочий проект docker-compose в одной и той же операционной системе для нескольких проектов ... без замены другого контейнеров проекта.

Я хочу иметь возможность видеть (использовать оба) одновременно, и, например, иметь возможность видеть это: Игнорируйте тот факт, что порты здесь одинаковые, я зная, что они не будут работать одновременно, я обновлю пользовательские файлы проекта docker -compose.yml, когда это сработает

docker-compose ps

               Name                       Command          State                Ports
  ------------------------------------------------------------------------------------------------
  nginx-proxy              /usr/bin/supervisord   Up      0.0.0.0:443->443/tcp,
                                                          0.0.0.0:80->80/tcp
  redis-cache              /usr/bin/supervisord   Up      0.0.0.0:6379->6379/tcp
  varnish-cache            /usr/bin/supervisord   Up      0.0.0.0:6081->6081/tcp,
                                                          0.0.0.0:6082->6082/tcp
  web-server-              /usr/bin/supervisord   Up      0.0.0.0:8080->8080/tcp
  apache2
  nginx-proxy              /usr/bin/supervisord   Up      0.0.0.0:443->443/tcp,
                                                          0.0.0.0:80->80/tcp
  redis-cache-delete       /usr/bin/supervisord   Up      0.0.0.0:6379->6379/tcp
  varnish-cache-delete     /usr/bin/supervisord   Up      0.0.0.0:6081->6081/tcp,
                                                          0.0.0.0:6082->6082/tcp
  web-server-              /usr/bin/supervisord   Up      0.0.0.0:8080->8080/tcp
  apache2-delete

Если кто-нибудь спросит: почему бы просто не поместить веб-сайты в один (один) контейнер ??

Если кто-то может спросить об этом, я знаю, что могу добавить несколько веб-сайтов в /etc/apache2/sites-enabled (или nginx) и добавить пользовательские файлы конфигурации, используя ADD в Dockerfile для каждого сайта, но с помощью этого метода я не может протестировать различные небольшие настройки .

Различные настройки, которые можно использовать, ссылаясь на другой другое изображение в 'override docker -compose files '

Например, я могу создать Dockerfile, который устанавливает все php7 .3 библиотеки, и запустить на нем Magento 2.3 , а затем создать еще один Dockerfile для test php7 .4, и есть еще один для запуска старого сайта Magento 1 на установке PHP5 .6 и т. Д. .

1 Ответ

0 голосов
/ 17 августа 2020

Благодаря совету Дэвида Мейза , я продолжал бороться с настройкой docker -compose для работы с несколькими проектами.

Информация основана на docker - compose v1.25.0 (июль 2020 г.)

Это обсуждение особенно важно, когда вы хотите повторно использовать (сохранить) свои контейнеры (запускать / останавливать, а не просто вверх / вниз - удаление)

Как изначально указывалось в моем вопросе - если вы попытаетесь создать контейнеры, используя docker-compose up -d, есть некоторые подводные камни, которые инструмент просто не поддерживает прямо сейчас.

Подводные камни

ОСОБЕННОСТИ ТЕКУЩЕГО DOCKER -КОМПЛЕКТНАЯ РЕАЛИЗАЦИЯ:

  1. Если вы просто используете переопределенный docker-compose*.yml с разными именами контейнеров (для каждого проекта) ) с файлами в той же папке

docker-compose up просто заменит существующие контейнеры, как описано в моем вопросе .

Вы можете сделать следующее: docker-compose -p CUSTOM_PROJECT_NAME -f file1.yml -f file2.yml up -d, но:

Само по себе это бесполезно - эти контейнеры будут работать только до тех пор, пока вы не захотите их остановить. Как только вы захотите выполнить docker-compose start (перезапустить существующий набор контейнеров) , он просто завершится с ошибкой с Error: No containers to start

Если вы используете две разные папки с одним и тем же проектом docker -compose (ie клонированный проект): например, ./dc-project1 ./dc-project2, но используя поле container_name внутри docker-compose.*.yml file :

При попытке запустить docker-compose -f f1.yml -f f2.yml up -d внутри ./dc-project1 и то же внутри ./dc-project2 папки, вы получите следующую ошибку: You have to remove (or rename) that container to be able to reuse that name .

Подобные проблемы с вашей сетью Docker будут возникать с docker -compose, когда вы используете замещенные файлы: Удалено большинство пользовательских настроек, чтобы сделать настройки сети более понятными :

Сеть будет правильно подключена из вашего замещенного файла на docker-compose up, , но как только вы захотите docker-compose start, она выполнит поиск по умолчанию сетевое имя: по умолчанию docker-compose.yml или даже файл docker-compose.override.yml, если он существует. Другими словами - он игнорирует ваши пользовательские файлы замены docker (см. Пример ниже):

docker-compose.yml:

   networks:
      network_frontend:
          name: stage6-network-frontend

customfolder/docker-compose.custom.yml:

   networks:
      network_frontend:
          name: magento2.3-network-frontend

РЕШЕНИЕ

Пример

Цель: заставить docker-compose start/stop правильно работать с несколькими настройками (также известными как projects / sites / tools), используя тот же проект docker -compose .

Предположим, у вас есть следующие файлы docker -compose:

** Главный файл: ** docker-compose.yml:

   web_server:
       image: current_timezone/full-supervisord-web-server/php7.3:1.00
       container_name: web-server-apache2
       networks:
         - network_frontend
       build:
         context: "./all-services/"
         dockerfile: ./web-server/Dockerfile.webserver.apache2
         args:
       volumes:
         - website_data:/var/www/html
       ports:
         - "8080:8080"

   networks:
     network_frontend:
       driver: bridge
       ipam:
         driver: default
         config:
           - subnet: 172.100.0.0/16
       name: stage6-network-frontend
       driver_opts:
         # Custom name for host-side network : for instance on Ubuntu : ip addr | ifconfig
  com.docker.network.bridge.name: docker-custom # Seems limit of 15 characters only

, а затем файл переопределения : customfolder/magento2.override.yml:

     web_server:
       container_name: web-server-apache2-magento2.3.5
       networks:
         - network_frontend
       build:
         args:
       volumes:
         - website_data:/var/www/html
       ports:
         - "8080:8080"

   networks:
     network_frontend:
       driver: bridge
       ipam:
         driver: default
         config:
           - subnet: 172.100.0.0/16
       driver_opts:
         # Custom name for host-side network : for instance on Ubuntu : ip addr | ifconfig
  com.docker.network.bridge.name: d-glo-femag2_35 # Seems limit of 15 characters only
       name: glo-magento2.3-network-frontend

Сделайте следующее:

  1. Скопируйте проект полный Docker (файлы Dockerfiles / ADDs / docker -compose.yml и c) в новую отдельную папку:

    /var/docker/project1 /var/docker/project2

  2. Убедитесь, что записи container_name в вашем override docker -compose.yml уникальны для двух проектов.

  3. В проекте project1 запустите docker-compose -f docker-compose.yml -f customfolder/magento2.override.yml up -d && docker-compose stop, перейдите к project2 и сделайте то же самое.

Использование флага -p, как предложил Дэвид Мейз, не работает само по себе, JSON файлы по-прежнему исходят как ./foldername на docker-compose start/stop

Поскольку сети имеют аналогичные проблемы на start/stop, прежде чем вы сможете правильно использовать свое собственное имя, определенное в вашем файле переопределения, .... к сожалению, вам необходимо обновить основную базу docker-compose.yml в замещенный файл!

Расширенное объяснение: невозможно вызвать правильное пользовательское сетевое имя из docker-compose start, поэтому, поскольку docker -compose игнорирует переопределенные файлы на start, вам необходимо обновить базовый файл docker-compose.yml или docker-compose.override.yml с вашим собственным сетевым именем.

Если вы не обновляли имена перед использованием up -d, вам нужно будет заменить содержимое каждого /var/lib/docker/containers/*/config.v2.json.

Например, вы могли бы сделать это: вы должны остановить docker сначала

  sudo service docker stop
  find /var/lib/docker/containers/ -type f -name "config.v2.json" -exec sed -i "s|wrong-network-name|overridden-network-name|g" '{}' \;
  sudo service docker start
ЕСЛИ все сделано правильно, у вас должно быть уникальных имен контейнеров, и теперь к каждой папке можно будет получить доступ отдельно, без нарушения контейнеров друг друга: docker-compose start, docker-compose stop, docker-compose ps

ПРИМЕЧАНИЕ: вам все равно нужно перейти в отдельную папку для выполнения этих команд

...