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:
- 安装dnsmasq:
sudo apt install dnsmasq(Debian/Ubuntu系) - 编辑
/etc/dnsmasq.conf,添加以下配置:
注:Docker容器名称默认后缀为# 转发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,比如容器名为app,可通过app.docker访问 - 重启dnsmasq:
sudo systemctl restart dnsmasq - 修改容器DNS配置为主机IP(本地IP或Tailscale IP),即可同时解析容器名称和Tailscale设备。
方法2:用macvlan网络替代host模式
macvlan能让容器拥有独立网络接口,直接接入主机物理网络,同时可加入自定义Docker网络(如proxymesh)解析容器名称:
- 创建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 - 修改Compose配置,去掉
network_mode: host,加入macvlan和proxymesh网络:
容器通过macvlan接入物理网络后,可直接使用主机的Tailscale路由访问Tailscale设备,同时通过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
方法3:手动添加extra_hosts映射容器IP
如果容器数量少、IP稳定,可直接手动映射容器名称和IP到extra_hosts:
- 获取目标容器IP:
docker inspect 容器名 | grep "IPAddress" - 在Compose的
extra_hosts中添加映射:
缺点是容器IP变化后需要手动更新,适合小规模场景。extra_hosts: - 'host.docker.internal:host-gateway' - '容器1名称:容器1IP' - '容器2名称:容器2IP'
内容的提问来源于stack exchange,提问作者St-H
相关产品推荐
相关产品推荐

