【发布时间】:2019-02-15 08:17:41
【问题描述】:
假设我在 docker-compose.yml 中定义了两个服务“frontend”和“db”,它们部署到 Docker swarm,即它们也可以在不同的堆栈中运行。有了这个设置,Traefik 会自动为每个堆栈生成前端和后端,这很好。
现在我在 Jenkins 管道中临时运行了另一个 Docker 容器,它应该能够访问特定堆栈中的 db 服务。我的第一个想法是通过将db 服务添加到cluster-global-net 网络来公开db 服务,以便Traefik 可以生成到bakend 的前端路由。这基本上有效。
但我想对“公众”隐藏数据库服务,同时仍然能够使用内部“默认”网络通过其堆栈或服务名称将另一个 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
【问题讨论】:
标签: docker docker-compose docker-swarm traefik