我想将 Docker-Compose 文件中定义的两个 Docker 容器相互连接(
app
和 db
)。其中之一 (app
) 也应该连接到 host
网络。
容器应连接到通用的用户定义网络(
appnet
或 default
)以使用 docker 网络中的嵌入式 DNS 功能。
app
还需要直接连接到主机网络,以接收docker主机物理网络中的以太网广播(网络层2)。
在 compose 中同时使用指令
network_mode: host
和 networks
会导致以下错误:
ERROR: 'network_mode' and 'networks' cannot be combined
在服务中指定网络名称
host
而不在网络中定义它(因为它已经存在),会导致:
ERROR: Service "app" uses an undefined network "host"
下一步尝试:显式定义两个网络,并且不要在服务级别使用
network_mode: host
属性。
version: '3'
services:
app:
build: .
image: app
container_name: app
environment:
- MONGODB_HOST=db
depends_on:
- db
networks:
- appnet
- hostnet
db:
image: 'mongo:latest'
container_name: db
networks:
- appnet
networks:
appnet: null
hostnet:
external:
name: host
上述撰写文件产生错误:
ERROR: for app network-scoped alias is supported only for containers in user defined networks
如何在 Docker-Compose 中一起使用
host
网络和任何其他用户定义的网络(或默认网络)?
TL;博士,你不能。主机网络关闭该容器的 docker 网络命名空间。您不能同时打开和关闭它。
相反,使用已发布的端口或可以作为卷共享的 unix 套接字连接到数据库。例如。以下是发布端口的方法:
version: "3.3"
services:
app:
build: .
image: app
container_name: app
environment:
- MONGODB_HOST=db
db:
image: mongo:latest
container_name: db
ports:
- "127.0.0.1:27017:27017"
自 Docker 18.03+ 起,人们可以使用
host.docker.internal
从容器内访问主机。无需添加host
网络或将其与用户定义的网络混合。
要使用主机网络,您不需要定义它。只需使用“ports”关键字来定义您想要在主机网络中公开的服务端口。