隔离 jwilder/nginx-proxy 网络上的容器
Isolate containers on the jwilder/nginx-proxy network
我正在使用 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
。但是 App 1 仍然能够连接到我想阻止的 app_2_db
。
有没有办法在他们的 docker-composer.yaml 文件中隔离所有服务并仍然使用 nginx 代理?
Docker version 18.09.0, build 4d60db4
docker-compose version 1.21.2, build a133471
您只能将 app(nginx) 容器从您的应用程序连接到 nginx-proxy
网络。唯一需要的编辑应该在应用程序的 docker-compose:
version: '3'
services:
app:
networks:
- default
- nginx-proxy
networks:
nginx-proxy:
external: true
这样 app
服务将同时连接到 nginx-proxy 和默认网络。 (如果省略网络密钥,服务始终连接到默认网络)
只要没有容器可以看到(在它连接的所有网络中)具有相同服务名称的两个容器,那么将服务名称解析为容器 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
这样在每个 "proxy" 网络中只有一个(如果您不使用 docker-compose 缩放)应用程序容器和 nginx-proxy 容器。
更多阅读:
我正在使用 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
。但是 App 1 仍然能够连接到我想阻止的 app_2_db
。
有没有办法在他们的 docker-composer.yaml 文件中隔离所有服务并仍然使用 nginx 代理?
Docker version 18.09.0, build 4d60db4
docker-compose version 1.21.2, build a133471
您只能将 app(nginx) 容器从您的应用程序连接到 nginx-proxy
网络。唯一需要的编辑应该在应用程序的 docker-compose:
version: '3'
services:
app:
networks:
- default
- nginx-proxy
networks:
nginx-proxy:
external: true
这样 app
服务将同时连接到 nginx-proxy 和默认网络。 (如果省略网络密钥,服务始终连接到默认网络)
只要没有容器可以看到(在它连接的所有网络中)具有相同服务名称的两个容器,那么将服务名称解析为容器 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
这样在每个 "proxy" 网络中只有一个(如果您不使用 docker-compose 缩放)应用程序容器和 nginx-proxy 容器。
更多阅读: