Запуск нескольких файлов docker-compose с обратным прокси-сервером nginx - PullRequest
1 голос
/ 01 апреля 2019

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

Я пытаюсь использовать docker для запуска на моем Mac нескольких приложений, основанных на PHP, MySQL и Apache, и все они будут использовать разные docker-compose.yml файлы (более подробно в посте, на который я ссылаюсь). У меня довольно много репозиториев, некоторые из которых взаимодействуют друг с другом, и не все из них имеют одинаковую версию PHP. Из-за этого я не думаю, что было бы разумно втиснуть более 20 отдельных репозиториев в один файл docker-compose.yml. Я хотел бы иметь отдельные файлы docker-compose.yml для каждого репозитория, и я хочу иметь возможность использовать запись /etc/hosts для каждого приложения, чтобы мне не нужно было указывать порт. Пример: я хотел бы получить доступ к 2 различным репозиториям, таким как http://dockertest.com и http://dockertest2.com (используя /etc/hosts записи), вместо того, чтобы указывать порт как http://dockertest.com:8080 и http://dockertest.com:8081.

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

Вот файл docker-compose.yml для приложения, которое я создал. По моему /etc/hosts у меня 127.0.0.1 dockertest.com

version: "3.3"
services:
  php:
    build: './php/'
    networks:
      - backend
    volumes:
      - ./public_html/:/var/www/html/
  apache:
    build: './apache/'
    depends_on:
      - php
      - mysql
    networks:
      - frontend
      - backend
    volumes:
      - ./public_html/:/var/www/html/
    environment:
      - VIRTUAL_HOST=dockertest.com
  mysql:
    image: mysql:5.6.40
    networks:
      - backend
    environment:
      - MYSQL_ROOT_PASSWORD=rootpassword
  nginx-proxy:
    image: jwilder/nginx-proxy
    networks:
      - backend
    ports:
      - 80:80
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
networks:
  frontend:
  backend:

1 Ответ

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

Я бы предложил извлечь nginx-proxy в отдельный docker-compose.yml и создать хранилище для конфигурации "обратный прокси" со следующим:

Файл с дополнительным содержимым для добавления в /etc/hosts

127.0.0.1 dockertest.com
127.0.0.1 anothertest.com
127.0.0.1 third-domain.net

И docker-compose.yml, который будет иметь только обратный прокси

version: "3.3"
services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    ports:
      - 80:80
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro

Далее, как вы уже упоминали, создайте docker-compose.yml для каждого из ваших репозиториев, которые действуют как конечные точки сети. Вам нужно будет добавить VIRTUAL_HOST env var к сервисам, которые обслуживают ваши приложения (например, Apache).

Контейнер nginx-proxy может работать в «постоянном режиме», поскольку он занимает небольшую площадь. Таким образом, всякий раз, когда вы запускаете новый контейнер с VIRTUAL_HOST env var, конфигурация nginx-proxy будет автоматически обновляться для включения нового локального домена. (Вам все равно придется обновить /etc/hosts новой записью).


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

# nginx-proxy/docker-compose.yml
version: "3.3"
services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    ports:
      - 80:80
    networks:
      - reverse-proxy
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
networks:
  reverse-proxy:
# service1/docker-compose.yml

version: "3.3"
services:
  php1:
    ...
    networks:
      - backend1
  apache1:
    ...
    networks:
      - nginx-proxy_reverse-proxy
      - backend1
    environment:
      - VIRTUAL_HOST=dockertest.com
  mysql1:
    ...
    networks:
      - backend1
networks:
  backend1:
  nginx-proxy_reverse-proxy:
    external: true
# service2/docker-compose.yml

version: "3.3"
services:
  php2:
    ...
    networks:
      - backend2
  apache2:
    ...
    networks:
      - nginx-proxy_reverse-proxy
      - backend2
    environment:
      - VIRTUAL_HOST=anothertest.com
  mysql2:
    ...
    networks:
      - backend2
networks:
  backend2:
  nginx-proxy_reverse-proxy:
    external: true

Сеть reverse-proxy, созданная в nginx-proxy/docker-compose.yml, упоминается как nginx-proxy_reverse-proxy в других файлах создания docker, потому что всякий раз, когда вы определяете сеть - ее окончательное имя будет {{folder name}}_{{network name}}


Если вы хотите взглянуть на решение, которое использует расширение прокси браузера вместо /etc/hosts, посмотрите mitm-proxy-nginx-companion

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...