Изолировать контейнеры в сети jwilder / nginx-proxy - PullRequest
0 голосов
/ 02 декабря 2018

Я использую jwilder / nginx-proxy для размещения нескольких (веб) приложений с одного сервера.Это прекрасно работает, за исключением того, что все сервисы могут взаимодействовать друг с другом, потому что все они находятся в одной сети, потому что это необходимо для работы прокси.

Прокси docker-compose.yaml

version: "3"

services:

  nginx-proxy:
    image: jwilder/nginx-proxy:alpine
    container_name: nginx-proxy
    labels:
      - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./data/certs:/etc/nginx/certs:ro
      - ./data/nginx/vhost.d:/etc/nginx/vhost.d
      - ./data/share/nginx/html:/usr/share/nginx/html
      - /var/run/docker.sock:/tmp/docker.sock:ro
    restart: always

  letsencrypt-proxy:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: letsencrypt-proxy
    depends_on:
      - nginx-proxy
    volumes:
      - ./data/nginx/vhost.d:/etc/nginx/vhost.d
      - ./data/share/nginx/html:/usr/share/nginx/html
      - ./data/certs:/etc/nginx/certs:rw
      - /var/run/docker.sock:/var/run/docker.sock:ro
    restart: always



networks:
  default:
    external:
      name: nginx-proxy

Приложение 1 docker-compose.yaml

version: "3"

services:

  app:
    image: nginx:latest
    depends_on:
      - db
      - cache
    expose:
      - 80
    volumes:
      - ./application:/var/www/html
    restart: always
    working_dir: /var/www/html
    environment:
      VIRTUAL_HOST: app1.example.com
      LETSENCRYPT_HOST: app1.example.com
      LETSENCRYPT_EMAIL: user@example.com

  cache:
    image: redis:alpine
    restart: always
    volumes:
      - cachedata:/data

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpasswd
      MYSQL_DATABASE: database_name
      MYSQL_USER: database_user
      MYSQL_PASSWORD: database_passwd
    volumes:
      - dbdata:/var/lib/mysql

networks:
  default:
    external:
      name: nginx-proxy

volumes:
  dbdata:
    driver: local
  cachedata:
    driver: local

Приложение 2 docker-compose.yaml

version: "3"

services:

  app:
    image: nginx:latest
    depends_on:
      - db
      - cache
    expose:
      - 80
    volumes:
      - ./application:/var/www/html
    restart: always
    working_dir: /var/www/html
    environment:
      VIRTUAL_HOST: app2.example.com
      LETSENCRYPT_HOST: app2.example.com
      LETSENCRYPT_EMAIL: user@example.com

  cache:
    image: redis:alpine
    restart: always
    volumes:
      - cachedata:/data

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpasswd
      MYSQL_DATABASE: database_name
      MYSQL_USER: database_user
      MYSQL_PASSWORD: database_passwd
    volumes:
      - dbdata:/var/lib/mysql

networks:
  default:
    external:
      name: nginx-proxy

volumes:
  dbdata:
    driver: local
  cachedata:
    driver: local

При этой настройке оба приложения будут использовать экземпляр приложения * 1 db и cache.Чтобы решить эту проблему, нужно дать этим службам уникальные имена, такие как app_1_db и app_2_db.Но затем приложение 1 все еще может подключаться к app_2_db, который я хотел бы предотвратить.

Есть ли способ изолировать все службы в их файле docker-composer.yaml и по-прежнему использовать прокси-сервер nginx?

Docker version 18.09.0, build 4d60db4
docker-compose version 1.21.2, build a133471

1 Ответ

0 голосов
/ 05 декабря 2018

Вы можете подключить только контейнер приложения (nginx) из своих приложений к сети nginx-proxy.Единственное необходимое редактирование должно быть в docker-compose приложения:

version: '3'
services:
  app:
    networks:
      - default
      - nginx-proxy

networks:
  nginx-proxy:
    external: true

Таким образом, служба app будет одновременно подключена к nginx-proxy и сетям по умолчанию.(Если вы опустите ключ сети, служба всегда подключается к сети по умолчанию)

Преобразование имен служб в ip-контейнеры будет работать, как и ожидалось, до тех пор, пока ни один контейнер не сможет увидеть (во всех сетях, к которым он подключен) два контейнера сто же имя службы.


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

version: "3"

services:
  nginx-proxy:
    networks: 
      - default
      - nginx-proxy_app1
      - nginx-proxy_app2

# letsencrypt-proxy service doesn't have to have networks key

networks:
  nginx-proxy_app1:
    external: true
  nginx-proxy_app2:
    external: true

, а в ваших приложениях:

version: '3'
services:
  app:
    networks:
      - default
      - nginx-proxy_app1

networks:
  nginx-proxy_app1:
    external: true

и

version: '3'
services:
  app:
    networks:
      - default
      - nginx-proxy_app2

networks:
  nginx-proxy_app2:
    external: true

Таким образом, в каждом«Прокси-сеть» есть только один (если вы не используете docker-compose scaling) контейнер приложения и контейнер nginx-proxy.


Дополнительные чтения:

...