daemon.json仅配置Docker daemon自身代理(如pull镜像),容器出网依赖主机IP转发和iptables,容器内应用需单独设HTTP_PROXY等环境变量。
docker 的 daemon.json 本身不支持直接配置“主机默认网关代理转发”,它不处理系统级网络路由或网关代理功能。你真正需要的是让 docker 容器能通过主机的 http/https 代理访问外网(比如拉取镜像),同时确保容器内流量能正确经由主机网关出去——这两者是不同层面的问题,需分开配置。
1. 配置 Docker 守护进程使用 HTTP/HTTPS 代理(用于 pull/push 镜像)
这是 daemon.json 能管的部分:告诉 Docker daemon 自己在拉取远程镜像时走哪个代理。
编辑 /etc/docker/daemon.json(Linux)或 %ProgramData%\Docker\config\daemon.json(Windows WSL2),添加 proxies 字段:
{
"proxies": {
"default": {
"httpProxy": "http://192.168.1.100:8080",
"httpsProxy": "http://192.168.1.100:8080",
"noProxy": "localhost,127.0.0.1,.local"
}
}
}⚠️ 注意:
- 代理地址必须可被 Docker daemon 进程访问(即主机能连通该代理);
- 若代理需认证,写成 http://user:pass@192.168.1.100:8080(注意 URL 编码特殊字符);
- 修改后需重启 Docker: sudo systemctl restart docker。
2. 确保容器网络能经主机网关出外网(非代理,是路由)
Docker 默认使用 bridge 网络(如 docker0),容器通过 NAT 访问外网,依赖主机的 IP 转发和 iptables 规则。若容器无法上网,问题通常不在 daemon.json,而在主机网络配置:
- 确认主机开启了 IPv4 转发:
sysctl net.ipv4.ip_forward应返回1;没开则执行echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf && sudo sysctl -p - 检查
iptables是否允许 FORWARD 链(Docker 启动时通常自动加规则,但若手动清过表或用了 firewalld/ufw,可能被拦截) - 若主机本身通过代理上网(比如公司环境用透明代理或 PAC),那容器走 NAT 出去的流量也会被网关/防火墙重定向到代理——这属于网络基础设施行为,无需 Docker 配置
3. 让容器内应用也走代理(可选,应用层控制)
daemon.json 的 proxies 只影响 daemon 自身(如 docker pull),不影响容器内运行的程序。若你的容器里要跑 curl、npm install 等,需在容器启动时注入代理环境变量:
- 运行时加参数:
docker run -e HTTP_PROXY=http://192.168.1.100:8080 -e HTTPS_PROXY=http://192.168.1.100:8080 ... - 或在 Dockerfile 中写
ENV HTTP_PROXY=... - 推荐方式:用
~/.docker/config.json配置auths和proxies(仅影响 CLI 行为),再配合容器内环境变量统一管理
4. 特殊情况:使用自定义 bridge 或 host 网络
如果你用 --network host,容器直接共享主机网络命名空间,自然走主机的默认路由和代理设置(包括系统级 http_proxy 环境变量);
若用自定义 bridge(docker network create mynet),只要主机转发和 iptables 正常,它和默认 bridge 行为一致,无需额外配 daemon.json。
总结:daemon.json 负责 Docker daemon 自身的代理;容器出网靠主机内核转发与 iptables;容器内应用联网需单独设环境变量。三者协同,才能让“容器通过主机网关+代理”稳定工作。


















