我正在构建包含两个容器的docker-compose服务。这些容器之一(节点)旨在支持自动发现机制,并且需要成为主机LAN的一部分(因为我需要LAN路由器处理多播UDP程序包,而不是内置docker路由器)。
尽管docker-compose.yml中的“ network_mode:host”完美地完成了这个工作,但我还需要该服务也可以通过默认的docker-compose网络以其主机名提供给第二个容器( qtcore ) (例如:http:// node:37326)。如果将network_mode设置为“ host”,这似乎是不可能的。
我的docker-compose.yml当前看起来像这样:
version: '3.7'
services:
qtcore:
image: yansidorovtesseris/qtcore
build: .
container_name: qtcore
depends_on:
- node
env_file: defaults.env
ports:
- "8000:8000"
node:
image: yansidorovtesseris/komodo
container_name: node
env_file: node.env
ports:
- "37326:37326"
- "1900:1900"
network_mode: host
volumes:
- $HOME/node_state:/komodo/.komodo/$AC_NAME
我尝试使用docker-compose文档(https://docs.docker.com/compose/compose-file/#host-or-none)中的示例 将主机网络连接为外部网络。考虑将主机和默认网络都添加到服务中。
version: '3.7'
services:
node:
...
networks:
hostnet: {}
...
networks:
hostnet:
external: true
name: host
但是当我尝试运行docker-compose时,我得到的只是以下错误:
ERROR: for node network-scoped alias is supported only for containers in user defined networks
答案 0 :(得分:1)
好的,在我看来,不可能将服务配置为同时使用“主机”和“桥接”选项。不过,如果有人指出相反的情况,我们将很高兴。
我想出了一个简单的解决方法,允许服务在主机LAN中作为一个docker-compose单元运行,但仍使用“ extra_hosts”(由hNczy建议)进行主机名查找。
它不是理想的,可能并不适合每种情况,但是它对我有用。
基本上,两个服务现在都在使用“ network_mode:host”,并且为“ qtcore”服务的“ extra_hosts”提供了绑定到127.0.0.1的“节点”名称。
version: '3.7'
services:
qtcore:
image: yansidorovtesseris/qtcore
build: .
container_name: qtcore
depends_on:
- node
env_file: defaults.env
network_mode: host
extra_hosts:
- "node:127.0.0.1"
ports:
- "8000:8000"
node:
image: yansidorovtesseris/komodo
container_name: node
env_file: node.env
ports:
- "37326:37326"
- "1900:1900"
network_mode: host
volumes:
- $HOME/node_state:/komodo/.komodo/$AC_NAME