如题. 容器之间可以通过 service name 通信,依赖于 容器启动时自动注册了 service name 为条目的 dns 记录. 那么为什么 允许不同项目的 service name 相同呢?
相同自定义网络下, 通过 container name 也是可以通信的, nslookup 也能查到 dns 记录, 是否使用 container name 作为通信主机名更好? 毕竟 container name 不允许重复?
如果是 k8s 编排容器, 一般是使用什么作为主机名通信?
![]() |
1
importmeta 50 天前
我自己会手动加一个 container_name:
|
2
julyclyde 50 天前
dns 127.0.0.11 应该是一个假服务器吧,per service 的
|
![]() |
3
coosir 49 天前
因为实际的容器名会是两者组合 projectName_serviceName ,不存在实际的重复
|
4
ByteCat 49 天前
只有 compose 内部网络可以通过 service name 访问,实际上的容器名会加上 project name ,而且默认并不在一个网络底下,完全没有影响
|
5
kyonn OP |
6
huihuimoe 49 天前 via iPhone
@kyonn 因为当初的设计,docker compose 设计是部署在 docker swarm 上的,都默认 service 不会只有一个 instance ,数量是可以 scale 的
|
9
kyonn OP @twofox 一般不会每个容器独占一个网络. 大部分容器可能都在一个网络下, 不同容器都可能用了某个数据库容器, 这时候如果出现 servcie 同名就比较奇怪, 根据我的试验, 也能正确连接到复数个 db 中正确的那个, 其他的 db 实例上会出现鉴权错误的问题.
|
![]() |
11
COW 49 天前
因为 docker compose 本来就更适合于单机场景,通常一个 compose 文件一个网段,此时 service_name 是唯一的,不存在冲突。
```bash networks: net: driver: bridge external: false ipam: config: - subnet: 172.19.0.0/24 ... ... ``` 如果你不指定 container_name ,通常会加上 project_name 前缀,和 index 后缀,swarm 也类似,用户完全不需要关心 container_name ,swarm 随机生成。 至于为什么不建议指定 container_name ,主要是不利于 scale ,非常不灵活。话说回来,有 scale 需求的,一般都上 K8s 了。 |