我有 2 个不同的组件/图像和以下 docker-compose 文件。
version: '3'
services:
my_service:
image: my_service:latest
restart: always
environment:
- DUMMY=dummy
ports:
- "8071:8071"
command: ""
healthcheck:
test: ["CMD-SHELL", "[ -f /usr/local/bin ]"]
interval: 30s
timeout: 30s
retries: 3
container_name: my-service-container
networks:
- my_net
my_ui:
image: my_ui:latest
depends_on:
- my_service
restart: always
ports:
- "8080:8080"
command: ""
networks:
- my_net
networks:
my_net:
driver: bridge
“my_ui”组件是一个 ui(角度代码),它从“my_service”组件调用服务。 当我使用“真实”主机名(所有部署都在那里的服务器)调用时,它可以工作,即
例如
主机名(Linux):real.host.name
Docker 安装并运行在上面的主机上。我在上面的主机上运行了 docker-compose up,这样我的 dontainer 就可以启动并运行了。
在另一台机器或主机上,我通过邮递员调用以下代码,它可以工作。
(POST 请求,根据需要具有原始正文等)。
http://real.host.name:8071/api/auth/login
上述调用有效。但是,我想对此类调用使用 docker 服务名称,以便顺利部署到多个主机/环境。
当我尝试以下操作时,它不起作用:
http://my_service:8071/api/auth/login
失败
Failed to load resource: net::ERR_NAME_NOT_RESOLVED
当我去“my_ui”时
docker exec -it rm <container name of my_ui> /bin/bash
$ ping my_service
以上工作正常,即 ping 很好。但是,当我发出 http 请求时,它无法识别“my_service”主机。
有人可以帮忙吗?
答案 0 :(得分:-1)
我认为在使用桥接模式时,服务名称解析纯粹是内部的,这就是为什么您可以使用其名称从容器中 ping 服务,但在从主机 ping 时无法获得 ICMP 回复。
因此 my_ui 容器能够从 Docker 桥接网络向 my_service 容器发出请求,但不能从主机发出请求(至少不能通过服务名称解析)。
如果您担心无论是否来自不同的主机,您都希望能够使用相同的服务,我建议在此类用例中使用 Swarm 模式下的 Docker。这样,您就可以基于端口而不是服务名称来使用相同的服务。
我去年写了一篇关于 Docker Swarm 的分步指南,如果你感兴趣的话 :) https://pat-laboratory.com/2020/11/03/docker-swarm-introduction-workshop/
让我知道这是否有帮助,或者我是否完全没有理解你的问题!