You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker:同时解析主机DNS与容器名称的方案问询

场景说明

我在一台主机上运行多个容器,用Nginx Proxy Manager把HTTP流量代理到对应容器。现在需要让这个容器能访问Tailscale网络,目前可行的办法是让容器接入主机网络栈。

另外也可以让容器直接用Tailscale网络栈,但这个方式不稳定,只能单向从远程访问容器,没法实现容器访问远程设备——虽然理论上双向可行,但我始终配置不成功。而且我希望Tailscale网络里的主机数量尽量少,所以不倾向用这个方案。

问题描述

用network_mode: host之后,容器没法解析Docker容器名称了。现在我只能二选一:要么在proxymesh网络里解析容器名称,要么访问Tailscale设备,但我需要同时实现这两个功能。

核心疑问

有没有办法既能用主机网络栈,又能解析Docker容器名称?

已尝试方案

尝试通过Tailscale连接容器到网络

如前所述,这个方式没法正常工作,仅支持单向流量,而且不符合我减少Tailscale网络主机数量的需求,所以放弃。

让容器同时加入proxymesh和host网络

操作后触发错误:

Error response from daemon: invalid endpoint settings:
network-scoped alias is supported only for containers in user defined networks

在线查找解决方案

找到过类似问题,但至今没有得到解答。

我的Compose文件
services:
  proxy:
    container_name: reverse-proxy
    hostname: reverse-proxy
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    network_mode: host
    # networks: # cannot be used with `network_mode: host`
    #   - host
    #   - proxymesh
    dns: 
      - 127.0.0.11      # Docker的DNS服务器
      - 100.100.100.100 # Tailscale的DNS服务器IP
      - 1.1.1.1         # Cloudflare的DNS服务器
    ports: # 使用network_mode: host时端口配置会被忽略
      - 80:80
      - 443:443
      - 81:81
    extra_hosts: # 模板自带的配置,说实话我不太清楚具体作用
    - 'host.docker.internal:host-gateway'
    volumes:
      - ${PWD}/data:/data
      - ${PWD}/letsencrypt:/letsencrypt
networks:
  proxymesh:
    external: true

解决方案

方法1:配置主机DNS转发Docker容器名称

Docker内置DNS127.0.0.11仅能在容器内部访问,主机无法直接调用。可以在主机上搭建本地DNS转发服务,将容器名称查询请求转发到Docker DNS,同时保留Tailscale和公共DNS的解析能力,推荐用dnsmasq:

  1. 安装dnsmasq:sudo apt install dnsmasq(Debian/Ubuntu系)
  2. 编辑/etc/dnsmasq.conf,添加以下配置:
    # 转发Docker容器名称查询到内置DNS
    server=/docker/127.0.0.11#53
    # 转发Tailscale域名查询到Tailscale DNS
    server=/tailnet/100.100.100.100#53
    # 公共DNS作为兜底
    server=1.1.1.1
    
    注:Docker容器名称默认后缀为.docker,比如容器名为app,可通过app.docker访问
  3. 重启dnsmasq:sudo systemctl restart dnsmasq
  4. 修改容器DNS配置为主机IP(本地IP或Tailscale IP),即可同时解析容器名称和Tailscale设备。

方法2:用macvlan网络替代host模式

macvlan能让容器拥有独立网络接口,直接接入主机物理网络,同时可加入自定义Docker网络(如proxymesh)解析容器名称:

  1. 创建macvlan网络(替换为你的主机物理网卡、子网、网关信息):
    docker network create -d macvlan \
      --subnet=192.168.1.0/24 \
      --gateway=192.168.1.1 \
      --ip-range=192.168.1.100/28 \
      -o parent=eth0 macvlan-net
    
  2. 修改Compose配置,去掉network_mode: host,加入macvlan和proxymesh网络:
    services:
      proxy:
        # 保留原有镜像、重启策略、卷挂载等配置
        networks:
          - macvlan-net
          - proxymesh
        dns: 
          - 127.0.0.11
          - 100.100.100.100
          - 1.1.1.1
        # 可选:指定固定IP
        # ipam:
        #   config:
        #     - subnet: 192.168.1.0/24
        #       ip_address: 192.168.1.101
    networks:
      macvlan-net:
        external: true
      proxymesh:
        external: true
    
    容器通过macvlan接入物理网络后,可直接使用主机的Tailscale路由访问Tailscale设备,同时通过proxymesh解析其他容器名称。

方法3:手动添加extra_hosts映射容器IP

如果容器数量少、IP稳定,可直接手动映射容器名称和IP到extra_hosts:

  1. 获取目标容器IP:docker inspect 容器名 | grep "IPAddress"
  2. 在Compose的extra_hosts中添加映射:
    extra_hosts:
      - 'host.docker.internal:host-gateway'
      - '容器1名称:容器1IP'
      - '容器2名称:容器2IP'
    
    缺点是容器IP变化后需要手动更新,适合小规模场景。

内容的提问来源于stack exchange,提问作者St-H

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 02:19:55