docker - Docker compose 服务名与外网冲突
问题描述
我正在尝试使用external networking连接在 docker-compose 上运行的两个本地开发项目。
从一方面来看,我有一个打算公开的第一个应用程序。Compose 包含 hosts:app
和rabbit
:
version: '3.4'
services:
app:
# ...
rabbit:
# ...
networks:
default:
driver: bridge
从另一面来看,我有第二个应用程序预计会看到第一个应用程序:
version: '3.4'
services:
app:
# ...
networks:
- paymentservice_default
- default
networks:
paymentservice_default:
external: true
到达主机rabbit.paymentservice_default
是可能的。
但是服务app
(第 1 次)与app
(第 2 次)冲突:
root@6db86687229c:/app# ping app.paymentservice_default
PING app.paymentservice_default (192.168.80.6) 56(84) bytes of data.
root@6db86687229c:/app# ping app
PING app (192.168.80.6) 56(84) bytes of data.
一般来说,从第二个组成角度来看,主机app
和app.paymentservice_default
共享相同的 IP 使得无法app.paymentservice_default
发现。
这里的问题是,我是否有正确的配置并且可以在不更改服务名称的情况下避免app
冲突?为什么会有这个约束?考虑到每个 docker-compose 配置都是跨项目共享的,并且可以在微服务世界中开发。
$ docker-compose --version
docker-compose version 1.17.1, build unknown
$ docker --version
Docker version 19.03.4, build 9013bf583a
谢谢你。
解决方案
我在Docker Playground上使用以下配置
paymentservice.docker-compose.yml
version: '3.4'
services:
app:
image: busybox
# keep container running
command: tail -f /dev/null
rabbit:
image: rabbitmq
networks:
default:
driver: bridge
其他.docker-compose.yml
version: '3.4'
services:
app:
image: busybox
# keep container running
command: tail -f /dev/null
networks:
- paymentservice_default
- default
networks:
paymentservice_default:
external: true
运行两个项目
$ COMPOSE_PROJECT_NAME=paymentservice docker-compose -f paymentservice.docker-compose.yml up -d
$ COMPOSE_PROJECT_NAME=other docker-compose -f other.docker-compose.yml up -d
显示 Docker IP
$ docker ps -q | xargs -n 1 docker inspect --format '{{ .Name }} {{range .NetworkSettings.Networks}} {{.IPAddress}}{{end}}' | sed 's#^/##';
我有
other_app_1 172.20.0.2 172.19.0.4
paymentservice_app_1 172.19.0.3
paymentservice_rabbit_1 172.19.0.2
我从使用ping paymentservice_app_1
(172.19.0.3)other_app_1
app.paymentservice_default
$ docker exec -it other_app_1 ping -c 1 app.paymentservice_default
PING app.paymentservice_default (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.258 ms
--- app.paymentservice_default ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.258/0.258/0.258 ms
我从使用ping other_app_1
(172.20.0.2)other_app_1
app
$ docker exec -it other_app_1 ping -c 1 app
PING app (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.054 ms
--- app ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.054/0.054/0.054 ms
如您所见,我可以paymentservice.docker-compose.yml
从第二个应用程序(的)访问第一个应用程序(的other.docker-compose.yml
)。
在另一个方向上也是如此。我从使用ping other_app_1
(172.19.0.4)paymentservice_app_1
app.paymentservice_default
$ docker exec -it paymentservice_app_1 ping -c 1 app.paymentservice_default
PING app.paymentservice_default (172.19.0.4): 56 data bytes
64 bytes from 172.19.0.4: seq=0 ttl=64 time=0.198 ms
--- app.paymentservice_default ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.198/0.198/0.198 ms
我从使用ping paymentservice_app_1
(172.19.0.3)paymentservice_app_1
app
$ docker exec -it paymentservice_app_1 ping -c 1 app
PING app (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.057 ms
--- app ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.057/0.057/0.057 ms
如您所见,我可以访问app
这两个项目的服务。如果我喜欢访问同一个项目的服务,我使用项目的默认网络。如果我想访问另一个项目的服务,我使用两个项目之间共享的外部网络。
注意:我建议通过使用命令行在项目之外创建共享网络来使这一点更加明确
docker network create shared-between-paymentservice-and-other
并在两个项目中将其声明为外部。
注意:
app
如果您在同一个(外部)网络(某种命名空间)中有 3 个具有相同服务名称(例如 )的项目,服务发现仍然存在限制。在这种情况下,重命名服务、使用多个外部网络、定义别名或使用完全不同的方法来发现/识别 Docker 容器可能是一个更好的主意。
后记
有没有这个要求?我试图重现你的问题,但我不确定我是否和你一样。例如,我不确定您在哪里运行ping
. root@6db86687229c
Docker 主机还是 Docker 容器?哪个容器?我认为它是服务的 Dockerapp
容器other.docker-compose.yml
。如果我遗漏了什么或误解了您的问题,请发表评论,我会更新我的答案。然后我可能会更详细地解释或提出另一个建议,如何在多个 Docker Compose 项目之间进行服务发现。
附录
清理
$ COMPOSE_PROJECT_NAME=other docker-compose -f other.docker-compose.yml down
$ COMPOSE_PROJECT_NAME=paymentservice docker-compose -f paymentservice.docker-compose.yml down
版本
$ docker --version
Docker version 20.10.0, build 7287ab3
$ docker-compose --version
docker-compose version 1.26.0, build unknown
推荐阅读
- swift - 如何映射到组合中的类型?
- html - 有没有办法在 NextJS 中按类名删除特定的 div?
- generics - 如何编写接受特征或指向特征的智能指针(Box、Rc 等)的通用代码?
- javascript - 点材料上的 ThreeJS alpha
- powershell - PowerShell 管道 ExpandProperty 到另一个 Select-Object
- java - 如果 arraylist 在 Firebase 中包含特定值,则返回子级
- python - 如何将熊猫的秒列作为浮点值转换为时间?
- java - 找不到适合 jdbc:postgresql://localhost:5432/postgres 的驱动程序
- solidity - 墨水基材中的结构映射
- docker - docker 重启后缺少 iptables 规则。如何永久保存?