在Mac上为Docker容器指定自定义DNS有三种方式:1. 启动单个容器时用--dns参数(如docker run --dns 192.168.1.1 -it alpine nslookup);2. 全局配置daemon.json的dns字段并重启Docker Desktop;3. 在docker-compose.yml中service或network层级声明dns。

在Mac上运行Docker容器时,需要让容器绕过默认DNS解析失败问题、访问内网服务或测试私有域名,必须为容器指定特定的自定义DNS服务器,而不是依赖宿主机网络设置或Docker内置的127.0.0.11转发器。
启动单个容器时直接指定DNS
这是最常用、最即时生效的方式,适用于调试、CI/CD临时任务或一次性运行场景。
执行命令:docker run --dns 192.168.1.1 --dns 8.8.8.8 -it alpine nslookup internal.corp
该命令会覆盖容器内所有其他DNS来源,【/etc/resolv.conf将只包含这两行nameserver,且顺序即为查询优先级】。注意:如果同时使用--network=host,--dns参数会被忽略——host模式下容器直接复用宿主机的resolv.conf,无法干预。
支持IPv6 DNS地址,例如--dns 2001:4860:4860::8888,多个--dns参数可混合IPv4/IPv6。
为所有新容器统一配置全局DNS(修改daemon.json)
当你在Mac上使用Docker Desktop,且希望所有新建容器(包括docker-compose up启动的)默认使用公司内网DNS或国内公共DNS,就该走这条路。
第一步:打开Docker Desktop → Preferences → Docker Engine,编辑右侧JSON配置区
第二步:在已有JSON对象中插入或修改dns字段,例如:
{ "dns": ["114.114.114.114", "223.5.5.5"], "dns-search": ["corp.local"], "dns-opts": ["timeout:2", "attempts:2"] }
第三步:点击右下角Apply & Restart,Docker Desktop会自动重启守护进程
⚠️ 注意:此配置对已运行的容器无效,仅影响后续新建容器;若某容器仍用docker run --dns启动,则它的--dns会完全覆盖此处设置。
在docker-compose.yml中声明DNS(适合项目级管理)
如果你用docker-compose管理多容器应用(比如Jupyter Stack、ELK),推荐在此处集中控制DNS,避免每次docker run都敲长参数。
方法一:在service级别指定
services:
jupyter:
image: quay.io/jupyter/scipy-notebook:2025-03-14
dns:
- 192.168.100.50
- 1.1.1.1
dns_search:
- dev.internal
方法二:整个compose网络启用自定义DNS(需配合自定义网络)
networks:
mybridge:
driver: bridge
driver_opts:
com.docker.network.bridge.enable_ip_masquerade: "true"
# 此处不设dns,而是靠容器内服务主动请求127.0.0.11并由它转发到你配置的上游
这一步完成后,运行docker-compose up即可生效,无需额外命令。


















