Docker 隔离jwilder/nginx代理网络上的容器

Docker 隔离jwilder/nginx代理网络上的容器,docker,docker-compose,jwilder-nginx-proxy,Docker,Docker Compose,Jwilder Nginx Proxy,我正在使用从单个服务器托管多个(web)应用程序。这非常有效,只是所有服务都可以相互通信,因为它们都在同一个网络上,这是代理工作所必需的 代理docker compose.yaml version: "3" services: nginx-proxy: image: jwilder/nginx-proxy:alpine container_name: nginx-proxy labels: - "com.github.jrcs.letsencrypt_

我正在使用从单个服务器托管多个(web)应用程序。这非常有效,只是所有服务都可以相互通信,因为它们都在同一个网络上,这是代理工作所必需的

代理
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
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
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
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
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
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
应用程序2
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
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
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
db
cache
实例。解决这个问题的唯一方法是为这些服务指定唯一的名称,如
app\u 1\u db
app\u 2\u 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

您只能将应用(nginx)容器从应用连接到
nginx代理
网络。只需在应用程序的docker compose中进行编辑:

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

networks:
  nginx-proxy:
    external: true
这样,
app
服务将同时连接到nginx代理和默认网络。(如果省略网络键,则服务始终连接到默认网络)

然后将服务名称解析为容器ip,只要容器无法看到(在其连接的所有网络中)具有相同服务名称的两个容器,就可以按预期工作


如果你想要更多的隔离,你可以为每个应用创建nginx代理网络。 因此,在您的nginx代理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

这样,在每个“代理”网络中,只有一个(如果您没有使用docker compose scaling)应用程序容器和nginx代理容器


更多阅读: