首页 > 解决方案 > 如何在 docker-compose 中将主机网络与默认网络结合起来

问题描述

我正在构建包含两个容器的 docker-compose 服务。其中一个容器(node)旨在支持自动发现机制,并且需要成为主机 LAN 的一部分(因为我需要由 LAN 路由器而不是内置的 docker 路由器处理多播 UDP 包)。

虽然 docker-compose.yml 中的“network_mode: host”完美地解决了这个问题,但我需要通过默认的docker -compose 网络(例如:http:// /节点: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

标签: dockerdocker-compose

解决方案


好吧,在我看来,将服务配置为同时使用“主机”和“桥接”选项是不可能的。不过,如果有人指出相反的情况,我会很高兴。
我想出了一个简单的解决方法,允许服务在主机 LAN 中作为一个 docker-compose 单元运行,同时使用“extra_hosts”(由 hNczy 建议)进行主机名查找。
它并不理想,可能不适合每种情况,但它对我有用。
基本上,两个服务现在都在使用“network_mode:host”,并且“qtcore”服务的“extra_hosts”提供了绑定到 127.0.0.1 的“node”名称。

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

推荐阅读