【问题标题】:docker swarm container communicationdocker swarm 容器通信
【发布时间】:2018-10-17 15:16:57
【问题描述】:

我创建了一个 swarm 并加入了一个节点,非常好,一切正常

docker swarm init --advertise-addr 192.168.99.1

docker swarm join --token verylonggeneratedtoken 192.168.99.1:2377

我在 swarm manager 上创建了 3 个服务

docker service create --replicas 1 --name nginx nginx --publish published=80,target=80

docker service create --replicas 1 --name php php:7.1-fpm published=9000,target=9000

docker service create --replicas 1 --name postgres postgres:9.5 published=5432,target=5432

所有服务都可以正常启动,但是如果我用我的应用程序自定义 php 映像,并配置 nginx 以侦听 php fpm 套接字,我找不到与这三个服务通信的方法。即使我使用“docker exec -it service-id bash”访问服务并尝试 ping 容器名称或主机名(我什至尝试 curl 它们)。

我想说的是我不知道如何配置 nginx 以连接到 fpm,因为我不知道一个容器如何使用 swarm 与另一个容器通信。使用 docker-compose 或 docker run 就像使用链接选项一样简单。我已经阅读了所有文档,花了几个小时反复试验,但我无法理解这一点。我已经阅读了有关路由网格的信息,希望将发布端口并且它确实对外部世界有用,但我无法在希望 ip 它为内部容器发布,也不能是随机 ip会导致管理我的应用程序配置的问题,甚至是 nginx 配置。

【问题讨论】:

    标签: docker docker-swarm


    【解决方案1】:

    要让多个容器相互通信,它们接下来要在用户创建的网络上运行。使用 swarm 模式,您希望使用覆盖网络,以便容器可以在多个主机上运行。

    docker network create -d overlay mynet
    

    然后使用该网络运行服务:

    docker service create --network mynet ...
    

    更简单的解决方案是使用 compose.yml 文件来定义每个服务。默认情况下,堆栈中的服务部署在自己的网络上:

    docker stack deploy -c compose.yml stack-name
    

    【讨论】:

      【解决方案2】:

      或者你可以只制作 1 个 Docker-compose,然后用它们制作一个 docker 堆栈。

      【讨论】:

        【解决方案3】:

        将 php_fpm 和 nginx 组合在同一个镜像中更容易、更可靠。我知道这违背了单应用程序图像的官方方式,但是对于像 php_fpm+nginx 这样你必须同时返回请求的情况,这是最好的情况。我这里有一个 WIP 样本:https://github.com/BretFisher/php-docker-good-defaults

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-07
          相关资源
          最近更新 更多