我有三个 docker-compose 文件。每个都包含一个服务,所有服务都跨越自己的网络,并且仅通过“外部”引用其他必要的网络。
建筑
允许使用以下通信外壳:
问题
不幸的是,如果我执行
docker exec frontend ping backend
它就会起作用!docker exec backend ping frontend
也一样。
我的设置有什么问题吗?
前端的 docker-compose.yaml:
services:
frontend:
image: alpine
container_name: frontend
networks:
- frontend_net
- service_net
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do echo alive; sleep 10m & wait $${!}; done;'"
networks:
frontend_net:
name: frontend_net
attachable: true
#internal: true
service_net:
external: true
服务的 docker-compose.yaml:
services:
service:
image: alpine
container_name: service
networks:
- service_net
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do echo alive; sleep 10m & wait $${!}; done;'"
networks:
service_net:
name: service_net
#internal: true
后端的 docker-compose.yaml:
services:
backend:
image: alpine
container_name: backend
networks:
- backend_net
- service_net
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do echo alive; sleep 10m & wait $${!}; done;'"
networks:
backend_net:
name: backend_net
attachable: true
#internal: true
service_net:
external: true
如果一切都已启动并运行,我的网络将如下所示:
# docker network list
NETWORK ID NAME DRIVER SCOPE
4b162b628e76 backend_net bridge local
f118e228948d bridge bridge local
b3bf160b09a3 frontend_net bridge local
45ff3d4f66d0 host host local
8eedcf91c792 none null local
a745922e2eea service_net bridge local
每个容器都可以连接到同一共享网络上的其他容器,在这种情况下,前端和后端共享服务网络。如果您想确保两个容器无法相互连接,请确保它们没有公共网络。
在这种情况下,我会从前端和后端删除服务网络。您可以将服务容器(不是一个好名字)放置在前端和后端网络上,或者仅为每个互连创建其他网络,以便服务容器无法访问这些网络上的其他容器。