使用 Traefik 仅在内部网络上公开 Docker 数据库服务
Exposing a Docker database service only on the internal network with Traefik
假设我在我的 docker-compose.yml
中定义了两个服务 "frontend" 和 "db",它们被部署到 Docker 集群,即它们也可能 运行在不同的堆栈中。使用此设置,Traefik 会自动为每个堆栈生成前端和后端,这很好。
现在我在 Jenkins 管道中临时有另一个 Docker 容器 运行ning,它应该能够访问特定堆栈中的 db
服务。我的第一个想法是通过将 db
服务添加到 cluster-global-net
网络来公开它,以便 Traefik 可以生成到 bakend 的前端路由。这基本上有效。
但我想对 "the public" 隐藏数据库服务,同时仍然能够使用内部 "default" 通过其堆栈或服务名称将另一个 Docker 容器连接到它网络。
这能以某种方式完成吗?
version: '3.6'
networks:
default: {}
cluster-global-net:
external: true
services:
frontend:
image: frontend_image
ports:
- 8080
networks:
- cluster-global-net
- default
deploy:
labels:
traefik.port: 8080
traefik.docker.network: cluster-global-net
traefik.backend.loadbalancer.swarm: 'true'
traefik.backend.loadbalancer.stickiness: 'true'
replicas: 1
restart_policy:
condition: any
db:
image: db_image
environment:
- MYSQL_ALLOW_EMPTY_PASSWORD=false
- MYSQL_DATABASE=db_schema
- MYSQL_USER=db_user
- MYSQL_PASSWORD=db_pass
ports:
- 3306
volumes:
- db_volume:/var/lib/mysql
networks:
- default
restart: on-failure
deploy:
labels:
traefik.port: 3306
traefik.docker.network: default
您需要的是一个部署了它们的网络,但其他任何人都看不到它。
为此,创建一个网络,将其添加到您的数据库服务和前端,以及您的临时服务。事实上,删除 db 上的 traefik 标签,因为这里不再需要它们。
EG :
...
networks:
default: {}
cluster-global-net:
external: true
db-net:
external: true
services:
frontend:
image: frontend_image
networks:
- cluster-global-net
- default
- db-net
deploy:
...
db:
image: db_image
...
networks:
- default
- db-net
restart: on-failure
#no labels
docker network create db-net
docker stack deploy -c <mycompose.yml> <myfront>
docker service create --network db-net <myTemporaryImage> <temporaryService>
然后temporaryService和前端可以通过db:3306
到达db
顺便说一句:你不需要为前端打开端口,因为 traefik 会在内部访问它 (trafik.port)。
EDIT : 新示例,网络从撰写文件创建。
...
networks:
default: {}
cluster-global-net:
external: true
db-net: {}
services:
frontend:
image: frontend_image
networks:
- cluster-global-net
- default
- db-net
deploy:
...
db:
image: db_image
...
networks:
- default
- db-net
restart: on-failure
#no labels
docker stack deploy -c <mycompose.yml> someStackName
docker service create --network someStackName_db-net <myTemporaryImage> <temporaryService>
假设我在我的 docker-compose.yml
中定义了两个服务 "frontend" 和 "db",它们被部署到 Docker 集群,即它们也可能 运行在不同的堆栈中。使用此设置,Traefik 会自动为每个堆栈生成前端和后端,这很好。
现在我在 Jenkins 管道中临时有另一个 Docker 容器 运行ning,它应该能够访问特定堆栈中的 db
服务。我的第一个想法是通过将 db
服务添加到 cluster-global-net
网络来公开它,以便 Traefik 可以生成到 bakend 的前端路由。这基本上有效。
但我想对 "the public" 隐藏数据库服务,同时仍然能够使用内部 "default" 通过其堆栈或服务名称将另一个 Docker 容器连接到它网络。
这能以某种方式完成吗?
version: '3.6'
networks:
default: {}
cluster-global-net:
external: true
services:
frontend:
image: frontend_image
ports:
- 8080
networks:
- cluster-global-net
- default
deploy:
labels:
traefik.port: 8080
traefik.docker.network: cluster-global-net
traefik.backend.loadbalancer.swarm: 'true'
traefik.backend.loadbalancer.stickiness: 'true'
replicas: 1
restart_policy:
condition: any
db:
image: db_image
environment:
- MYSQL_ALLOW_EMPTY_PASSWORD=false
- MYSQL_DATABASE=db_schema
- MYSQL_USER=db_user
- MYSQL_PASSWORD=db_pass
ports:
- 3306
volumes:
- db_volume:/var/lib/mysql
networks:
- default
restart: on-failure
deploy:
labels:
traefik.port: 3306
traefik.docker.network: default
您需要的是一个部署了它们的网络,但其他任何人都看不到它。
为此,创建一个网络,将其添加到您的数据库服务和前端,以及您的临时服务。事实上,删除 db 上的 traefik 标签,因为这里不再需要它们。
EG :
...
networks:
default: {}
cluster-global-net:
external: true
db-net:
external: true
services:
frontend:
image: frontend_image
networks:
- cluster-global-net
- default
- db-net
deploy:
...
db:
image: db_image
...
networks:
- default
- db-net
restart: on-failure
#no labels
docker network create db-net
docker stack deploy -c <mycompose.yml> <myfront>
docker service create --network db-net <myTemporaryImage> <temporaryService>
然后temporaryService和前端可以通过db:3306
到达db顺便说一句:你不需要为前端打开端口,因为 traefik 会在内部访问它 (trafik.port)。
EDIT : 新示例,网络从撰写文件创建。
...
networks:
default: {}
cluster-global-net:
external: true
db-net: {}
services:
frontend:
image: frontend_image
networks:
- cluster-global-net
- default
- db-net
deploy:
...
db:
image: db_image
...
networks:
- default
- db-net
restart: on-failure
#no labels
docker stack deploy -c <mycompose.yml> someStackName
docker service create --network someStackName_db-net <myTemporaryImage> <temporaryService>