【问题标题】:Isolate containers on the jwilder/nginx-proxy network在 jwilder/nginx-proxy 网络上隔离容器
【发布时间】:2018-12-02 12:13:49
【问题描述】:

我正在使用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 的 de dbcache 实例。解决此问题的唯一方法是为这些服务提供唯一名称,例如 app_1_dbapp_2_db。但是 App 1 仍然能够连接到我想阻止的 app_2_db

有没有办法隔离 docker-composer.yaml 文件中的所有服务并仍然使用 nginx 代理?

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

【问题讨论】:

    标签: docker docker-compose jwilder-nginx-proxy


    【解决方案1】:

    您只能将 app(nginx) 容器从您的应用程序连接到 nginx-proxy 网络。唯一需要的编辑应该在应用程序的 docker-compose 中:

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

    这样app 服务将同时连接到 nginx-proxy 和默认网络。 (如果省略networks key,服务总是连接到默认网络)

    只要没有容器可以看到(在它连接的所有网络中)两个具有相同服务名称的容器,那么将服务名称解析为容器 ip 就可以正常工作。


    如果您想要更多的隔离,您可以为每个应用程序创建 nginx-proxy 网络。 因此,在您的 nginx-proxy docker-compose 中,您将拥有:

    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 缩放)应用容器和 nginx-proxy 容器。


    更多阅读:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-03
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      • 2018-03-08
      相关资源
      最近更新 更多