使用host网络模式时,如何为Docker同级容器设置别名?
我用Docker Compose运行HomeAssistant和Mosquitto两个容器,配置如下:
version: '3' services: homeassistant: user: 999:994 container_name: homeassistant image: "ghcr.io/home-assistant/home-assistant:stable" volumes: - ./config:/config - /etc/localtime:/etc/localtime:ro - /run/dbus:/run/dbus:ro privileged: true network_mode: host depends_on: - mosquitto mosquitto: user: 999:994 container_name: mosquitto image: eclipse-mosquitto restart: unless-stopped ports: - 1883:1883 - 9001:9001 volumes: - /opt/mosquitto/config:/mosquitto/config - /opt/mosquitto/data:/mosquitto/data - /opt/mosquitto/log:/mosquitto/log stdin_open: true tty: true
现在想在HomeAssistant容器里用mosquitto这个别名访问Mosquitto容器,但因为HomeAssistant用了network_mode: host,Docker的服务别名解析失效了;如果去掉host网络配置,别名访问正常,但又需要保留host网络的功能。请问怎么配置才能兼顾两者?
可行解决方案
方案1:给HomeAssistant容器添加hosts映射
由于HomeAssistant使用host网络,它的网络栈和宿主机完全一致,而Mosquitto容器已经把端口映射到了宿主机,我们可以直接在HomeAssistant的容器配置里添加hosts映射,强制把mosquitto解析到宿主机IP:
修改HomeAssistant的服务配置,新增extra_hosts字段:
homeassistant: # 其他原有配置保持不变 extra_hosts: - "mosquitto:127.0.0.1" # 也可以填宿主机的局域网IP,比如192.168.1.100
配置完成后,HomeAssistant容器内执行ping mosquitto会直接解析到宿主机IP,从而访问到已映射端口的Mosquitto容器。
方案2:让两个容器共享自定义桥接网络+host网络
Docker支持容器同时连接多个网络,我们可以创建一个自定义桥接网络,让Mosquitto加入该网络,同时让HomeAssistant在保留host网络的基础上,额外连接这个自定义网络,这样HomeAssistant既能保留host网络的功能,又能通过自定义网络的服务别名访问Mosquitto。
修改后的完整docker-compose.yml配置:
version: '3' # 定义自定义桥接网络 networks: mqtt-net: driver: bridge services: homeassistant: user: 999:994 container_name: homeassistant image: "ghcr.io/home-assistant/home-assistant:stable" volumes: - ./config:/config - /etc/localtime:/etc/localtime:ro - /run/dbus:/run/dbus:ro privileged: true network_mode: host # 额外连接自定义网络 networks: - mqtt-net depends_on: - mosquitto mosquitto: user: 999:994 container_name: mosquitto image: eclipse-mosquitto restart: unless-stopped ports: - 1883:1883 - 9001:9001 volumes: - /opt/mosquitto/config:/mosquitto/config - /opt/mosquitto/data:/mosquitto/data - /opt/mosquitto/log:/mosquitto/log stdin_open: true tty: true # 加入自定义网络 networks: - mqtt-net
配置完成后,HomeAssistant容器会同时使用host网络和自定义的mqtt-net网络,既保留了host网络的所有特性,又能通过mosquitto别名直接访问同网络内的Mosquitto容器。
内容的提问来源于stack exchange,提问作者linucks

