Как создать 2 разных запущенных приложения с одним и тем же файлом docker-compose.yml? - PullRequest
0 голосов
/ 05 апреля 2019

У меня уже есть файл docker-compose.yml, подобный этому:

version: "3.1"

services:

memcached:
  image: memcached:alpine
  container_name: dl-memcached

redis:
  image: redis:alpine
  container_name: dl-redis

mysql:
  image: mysql:5.7.21
  container_name: dl-mysql
  restart: unless-stopped
  working_dir: /application
  environment:
    - MYSQL_DATABASE=dldl
    - MYSQL_USER=docker
    - MYSQL_PASSWORD=docker
    - MYSQL_ROOT_PASSWORD=docker
  volumes:
    - ./../:/application
  ports:
    - "8007:3306"

phpmyadmin:
  image: phpmyadmin/phpmyadmin
  container_name: dl-phpmyadmin
  environment:
    - PMA_ARBITRARY=1
    - PMA_HOST=dl-mysql
    - PMA_PORT=3306
    - MYSQL_USER=docker
    - MYSQL_PASSWORD=docker
    - MYSQL_ROOT_PASSWORD=docker
  restart: always
  ports:
    - 8002:80
  volumes:
    - /application
  links:
    - mysql

elasticsearch:
  build: phpdocker/elasticsearch
  container_name: dl-es
  volumes:
    - ./phpdocker/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
  ports:
    - "8003:9200"

webserver:
  image: nginx:alpine
  container_name: dl-webserver
  working_dir: /application
  volumes:
      - ./../:/application:delegated
      - ./phpdocker/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
      - ./logs:/var/log/nginx:delegated
  ports:
   - "9003:80"

php-fpm:
  build: phpdocker/php-fpm
  container_name: dl-php-fpm
  working_dir: /application
  volumes:
    - ./../:/application:delegated
    - ./phpdocker/php-fpm/php-ini-overrides.ini:/etc/php/7.2/fpm/conf.d/99-overrides.ini
    - ./../docker/php-fpm/certs/store_stock/:/usr/local/share/ca-certificates/
    - ./logs:/var/log:delegated # nginx logs
    - /application/var/cache 
  environment:
    XDEBUG_CONFIG: remote_host=host.docker.internal
    PHP_IDE_CONFIG: "serverName=dl"

node:
  build:
    dockerfile: dl/phpdocker/node/Dockerfile
    context: ./../
  container_name: dl-node
  working_dir: /application
  ports:
    - "8008:3000"
  volumes:
    - ./../:/application:cached
  tty: true

Моя цель состоит в том, чтобы две изолирующие среды работали одновременно на одном и том же сервере с одним и тем же файлом docker-compose? Интересно, возможно ли это?

Я хочу иметь возможность остановить и обновить один env. в то время как другой все еще работает и получает трафик.

Может быть, мне нужен другой подход в моем случае?

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Есть несколько проблем с тем, что вы пытаетесь сделать. Если ваша цель состоит в том, чтобы оставить позади балансировщик нагрузки, я думаю, что вместо того, чтобы пытаться запускать несколько экземпляров вашего проекта, лучшим решением будет использование функций масштабирования, доступных для docker-compose. В частности, если ваша цель состоит в том, чтобы поставить некоторые службы за балансировщиком нагрузки, вы, вероятно, не хотите использовать несколько экземпляров таких вещей, как ваша база данных.

Если вы объедините это с динамическим интерфейсным прокси-сервером, таким как Traefik , вы можете сделать настройку в значительной степени автоматической.

Рассмотрим очень простой пример, состоящий из внутреннего контейнера, на котором работает простой веб-сервер, и внешнего интерфейса traefik:

---
version: "3"

services:

  webserver:
    build:
      context: web
    labels:
      traefik.enable: true
      traefik.port: 80
      traefik.frontend.rule: "PathPrefix:/"

  frontend:
    image: traefik
    command:
      - --api
      - --docker
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    ports:
      - "80:80"
      - "127.0.0.1:8080:8080"

Если я начну так, я получу один бэкэнд и один фронтенд:

docker-compose up

Но я также могу попросить docker-compose масштабировать бэкэнд:

docker-compose up --scale webserver=3

В этом случае я получаю один интерфейс и три бэкэнд-сервера. Traefik автоматически обнаружит бэкэнды и проведет циклическое соединение между ними Вы можете скачать этот пример и попробовать его.

Предостережения

Есть несколько аспектов вашей конфигурации, которые необходимо изменить, чтобы эта работа работала (и на самом деле вам нужно будет изменить их, даже если вы создадите несколько экземпляров своего проекта, как вы предложили в своем вопрос).

Конфликтующие пути

Возьмем, к примеру, конфигурацию вашего webserver контейнера:

volumes:
    - ./logs:/var/log/nginx:delegated

Если вы запустите два экземпляра этой службы, оба контейнера будут монтировать ./logs на /var/log/nginx. Если они оба попытаются записать в /var/log/nginx/access.log, у вас будут проблемы.

Самое простое решение здесь - избежать монтирования привязки для таких вещей, как каталоги журналов (и любые другие каталоги, в которые вы будете писать), и вместо этого использовать именованные тома докера.

Жесткое кодирование имен контейнеров

В некоторых местах вы жестко задаете имя контейнера, например:

mysql:
  image: mysql:5.7.21
  container_name: dl-mysql

Это вызовет проблемы, если вы попытаетесь запустить несколько экземпляров этого проекта или несколько экземпляров контейнера mysql. Не устанавливайте статически имя контейнера.

Устаревший синтаксис ссылок

В вашей конфигурации используется устаревший синтаксис links:

links:
  - mysql

Не делай этого. В современном докере контейнеры в одной сети могут просто ссылаться друг на друга по имени. Другими словами, если ваша составная конфигурация имеет:

mysql:
  image: mysql:5.7.21
  restart: unless-stopped
  working_dir: /application
  environment:
    - MYSQL_DATABASE=dldl
    - MYSQL_USER=docker
    - MYSQL_PASSWORD=docker
    - MYSQL_ROOT_PASSWORD=docker
  volumes:
    - ./../:/application
  ports:
    - "8007:3306"

Другие контейнеры в вашем стеке компоновки могут просто использовать имя хоста mysql для ссылки на эту службу.

0 голосов
/ 05 апреля 2019

Вы не сможете запустить один и тот же файл компоновки на хосте, не изменив сопоставления портов, потому что это вызовет конфликт портов.Я бы порекомендовал создать базовый файл compose и использовать extends для переопределения сопоставлений портов для разных сред.

...