问题描述
在使用Docker Compose时遇到一个问题,他希望能够隔离两个容器化的服务A和B的网络通信。另外,还有一个共享服务C,该服务不与A或B隔离,并且可以与它们中的任何一个进行通信。
他尝试通过以下的docker-compose.yaml
文件来实现这个目标:
version: "3.3"
services:
C:
build: C
depends_on:
- A
- B
expose:
- 8080
networks:
- A
- B
A:
build: A
expose:
- 8080
networks:
- A
B:
build: B
expose:
- 8080
networks:
- B
networks:
A:
internal: true
B:
internal: true
通过这个配置,C可以通过A:8080和B:8080连接到A和B,并且A和B被隔离,符合需求。然而,A和B无法通过C:8080连接到C。当从配置中移除网络选项后,所有服务都可以互相通信。用户想知道他做错了什么。
解决方案
在你的配置中,服务C的问题可能出现在服务C的网络设置上。以下是可能的解决方案:
确保服务C的监听地址正确
在你的配置中,服务C的容器似乎在localhost:8080
上进行监听。然而,容器内的localhost并不是指向容器本身,而是指向容器的局部环境。你应该将服务C绑定到C:8080
,以便在容器内部的网络中让其它容器能够访问。
理解服务监听配置
服务A和B的配置中绑定到localhost:8080
是有效的,因为Docker会自动将这些绑定映射到容器的IP地址。但对于服务C,Docker可能不会自动执行相同的映射,因为C可能位于不同的网络子网(由于internal: true
)。
更新服务C的监听配置
在服务C的配置中,确保将监听地址绑定到C:8080
,以便能够在容器内部的网络中访问。这样,A和B将能够通过C:8080连接到C。
version: "3.3"
services:
C:
build: C
depends_on:
- A
- B
expose:
- 8080
networks:
- A
- B
A:
build: A
expose:
- 8080
networks:
- A
B:
build: B
expose:
- 8080
networks:
- B
networks:
A:
internal: true
B:
internal: true
通过将服务C的监听地址配置为C:8080
,你应该能够让A和B通过C:8080连接到C。确保在更新配置后重新构建和部署你的容器化服务。
如果你遇到进一步的问题,可以检查服务C是否正确监听容器内部的网络地址,以及容器之间的网络通信是否受到正确的网络配置影响。