具有相同容器的多个堆栈:“端口已用作入口端口”

具有相同容器的多个堆栈:“端口已用作入口端口”

我正在尝试实现以下设置:

我有一个中央堆栈包含我的nginx-代理东西。这个堆栈声明了一个网络(我们称之为nginx_proxy_net

接下来,我要设置2 叠2 人份WordPress的安装,每个组件都是完全独立的,包含自己的wordpress服务和mysql服务。两者都wordpress使用nginx_proxy_net网络。

当我尝试启动我的 2 个堆栈时,发生了以下情况:

  1. 第一个 wordpress 堆栈启动成功。到目前为止一切正常
  2. 第二个 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 内部也不支持。

相关内容