我正在尝试实现以下设置:
我有一个中央堆栈包含我的nginx-代理东西。这个堆栈声明了一个网络(我们称之为nginx_proxy_net
)
接下来,我要设置2 叠2 人份WordPress的安装,每个组件都是完全独立的,包含自己的wordpress
服务和mysql
服务。两者都wordpress
使用nginx_proxy_net
网络。
当我尝试启动我的 2 个堆栈时,发生了以下情况:
- 第一个 wordpress 堆栈启动成功。到目前为止一切正常
- 第二个 wordpress 堆栈拒绝启动,因为端口 3306(mysql)已被使用。错误是:
Error response from daemon: rpc error: code = 3 desc = port '3306' is already in use by service 'mywp1_mysql' (qzcqsfvoj3ga2nte11rj3qgum) as an ingress port
我理解每个导出的端口都绑定在路由网格,我还了解到您可以将服务链接到多个网络上。因此,我尝试为每个堆栈创建一个网络,这样,在每个堆栈网络上,都有一个 MySQL 和一个 Apache/Wordpress。
这是我的 Wordpress 堆栈mywp1 docker-compose.yml
:
version: "3"
services:
web:
depends_on:
- mysql
image: wordpress:4.8-apache
depends_on:
- mysql
ports:
- 79:80
volumes:
- ./data/wordpress:/var/www/html
networks:
- mywp1_webnet
- nginx-proxy
mysql:
image: mysql
ports:
- 3306:3306
volumes:
- ./data/mysql:/var/lib/mysql
deploy:
placement:
constraints: [node.role == manager]
networks:
- mywp1_webnet
networks:
mywp1_webnet:
nginx-proxy:
external:
name: nginx_proxy_default
这是mywp2
version: "3"
services:
web:
depends_on:
- mysql
image: wordpress:4.8-apache
depends_on:
- mysql
ports:
- 78:80
volumes:
- ./data/wordpress:/var/www/html
networks:
- mywp2_webnet
- nginx-proxy
mysql:
image: mysql
ports:
- 3306:3306
volumes:
- ./data/mysql:/var/lib/mysql
deploy:
placement:
constraints: [node.role == manager]
networks:
- mywp2_webnet
networks:
mywp2_webnet:
nginx-proxy:
external:
name: nginx_proxy_default
我对 Docker 不是很熟悉,所以也许我要问一些非常愚蠢的问题:是否可以公开我的端口仅有的在我的堆栈网络上,而不是在入口上?我希望尽可能保留默认设置。
这里的问题是:是否可以保留两个 mysql 实例的默认端口,而不互相干扰?
非常感谢,祝你有美好的一天
亚历克斯
答案1
您不需要在 mywp* compose 文件中发布端口。您可以使用反向代理访问网站,并且不应从容器外部访问数据库。Nginx-proxy 适用于单节点集群,不确定它是否已针对 Swarm 模式进行了更新,因此您可能需要考虑使用像 traefik 这样的 Swarm 感知代理。
如果出于某种原因,您需要从 Swarm 集群外部直接连接到数据库,那么您需要为每个应用程序分配自己的端口。docker 外部不支持在同一端口上运行多个应用程序,因此 docker 内部也不支持。