我创建了一个swarm并加入了一个节点,非常好,一切正常
docker swarm init --advertise-addr 192.168.99.1
docker swarm join --token verylonggeneratedtoken 192.168.99.1:2377
我在swarm管理器上创建了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已发布= 5432,target = 5432
所有服务启动都很好,但如果我用我的应用程序自定义php图像,并配置nginx来监听php fpm套接字我找不到通信这三种服务的方法。即使我使用“docker exec -it service-id bash”访问服务并尝试ping容器名称或主机名(我甚至试图卷曲它们)。
我想说的是我不知道如何配置nginx连接到fpm,因为我不知道一个容器如何使用swarm与另一个容器进行通信。使用docker-compose或docker run很简单,就像使用links选项一样。我已经阅读了所有文档,在试用和错误上花了好几个小时,而我无法绕过这个。我已经阅读了有关路由网格的内容,希望能够获得已发布的端口,并且它确实对外界产生了影响,但我无法想象它为内部容器发布的愿望ip,也不能是随机ip因为这会导致管理我的应用配置问题,甚至是nginx配置。
答案 0 :(得分:2)
要让多个容器相互通信,它们接下来要在用户创建的网络上运行。使用swarm模式,您希望使用覆盖网络,以便容器可以在多个主机上运行。
docker network create -d overlay mynet
然后使用该网络运行服务:
docker service create --network mynet ...
更简单的解决方案是使用compose.yml文件来定义每个服务。默认情况下,堆栈中的服务部署在自己的网络上:
docker stack deploy -c compose.yml stack-name
答案 1 :(得分:1)
或者你可以制作一个Docker-compose,然后用它们制作一个docker堆栈。
答案 2 :(得分:0)
在同一图像中组合php_fpm和nginx更容易,更可靠。我知道这违反了单一应用程序图像的官方方式,但对于像php_fpm + nginx这样的情况,你必须同时返回一个请求,这是最好的情况。我在这里有一个WIP样本:https://github.com/BretFisher/php-docker-good-defaults