我有一个 docker swarm 配置,在其中部署了两个堆栈(main
和mon
),我可以在一个堆栈中公开一个端口,并且可以从另一个堆栈引用它。但是,我试图找到一种不这样做的方法,而是让它使用 127.0.0.11 DNS 访问它。
我mon
有一个名为grafana
使用https://docs.docker.com/docker-cloud/apps/service-links/#discovering-services-or-containers-on-another-stack这表明我可以使用堆栈名称来引用它,但当我尝试它时它不起作用,ping grafana.mon
只是返回无效的主机名。
答案1
要做到这一点,你只需要让它使用同一个网络,然后它们就会可见。在我的例子中,我定义了一个名为 的网络public
,它被我的所有堆栈在外部引用
docker network create -d overlay --attachable public
从那里在我的docker-compose.yml文件中我有
networks:
public:
external:
name: public
要访问它,只需使用服务名称。
答案2
您需要允许两个堆栈通过覆盖网络类型进行连接,然后允许两个堆栈使用(至少在所需的服务上)在两个堆栈外部创建的覆盖网络。
覆盖网络应该在堆栈启动之前创建,以便需要连接的服务可以“附加”到它。
像这样创建网络
docker network create --driver overlay --attachable
然后在你的环境文件中引用服务名称,你可以检查你的服务调用了什么名称
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
vkz5vccbmce7 foo-stack_por-service replicated 1/1 por-service:1.0.0 *:33065->3306/tcp
sjpnrkm1iiha foo-stack_vic-service replicated 1/1 vic-service:1.0.0 *:8081->80/tcp
0capavl31oab bar-stack_tar-service replicated 1/1 tar-service:1.0.0 *:33066->3306/tcp
9vohh24jt6hy bar-stack_zen-service replicated 1/1 zen-service:1.0.0 *:8082->80/tcp
现在从 NAME 列获取服务名称。例如:bar-stack_tar-服务
请注意,您的服务以部署时提供的堆栈名称为前缀
docker stack ls
NAME SERVICES ORCHESTRATOR
foo-stack 2 Swarm
bar-stack 2 Swarm