要让 Docker 支持远程 API 访问,需配置 dockerd 监听 TCP 端口(如 2376),推荐通过修改 systemd service 文件添加 -H tcp://0.0.0.0:2376,并强制启用双向 TLS 加密;客户端通过 docker context 管理证书与连接,同时需开放防火墙端口并验证监听状态。

要让 Docker 支持远程 API 访问,核心是修改 Docker 守护进程(dockerd)的启动参数,使其监听指定网络地址和端口,并确保通信安全。默认情况下,Docker 只通过本地 Unix socket(/var/run/docker.sock)提供服务,不对外暴露 HTTP API。
启用远程 API 的基本配置
Docker 守护进程需显式配置为监听 TCP 端口(如 2376 或 2375),同时保留或禁用 Unix socket。推荐使用 systemd 管理的系统(如 Ubuntu 20.04+/CentOS 7+)进行持久化配置:
- 编辑
/etc/docker/daemon.json,添加监听地址(注意:该文件不支持直接配置-H,需配合 systemd) - 更可靠的方式是修改 systemd service 文件:
/lib/systemd/system/docker.service,找到ExecStart=行,在其后追加-H fd:// -H tcp://0.0.0.0:2376 - 若只要特定网卡监听,可将
0.0.0.0替换为内网 IP(如192.168.1.10),避免公网暴露 - 执行
sudo systemctl daemon-reload && sudo systemctl restart docker生效
必须启用 TLS 加密(生产环境强制要求)
裸开 2375(非加密)端口存在严重安全风险,Docker 官方已弃用明文远程访问。正确做法是启用双向 TLS:
- 生成 CA、服务端证书(
docker-server.crt/key)和客户端证书(docker-client.crt/key),证书需包含 SAN(Subject Alternative Name),如 DNS 名或 IP - 将服务端证书路径写入
daemon.json:
"tls": true,
"tlscacert": "/etc/docker/certs/ca.pem",
"tlscert": "/etc/docker/certs/server.pem",
"tlskey": "/etc/docker/certs/server-key.pem" - 客户端调用时需指定证书:
docker -H tcp://192.168.1.10:2376 --tlsverify --tlscacert=ca.pem --cert=client.pem --key=client-key.pem ps
配合 Docker Context 简化多主机管理
手动传证书参数易出错,可用 docker context 封装连接配置,实现一键切换目标主机:
- 创建上下文:
docker context create my-host-01 --docker "host=tcp://192.168.1.10:2376,ca=/path/ca.pem,cert=/path/client.pem,key=/path/client-key.pem" - 切换上下文:
docker context use my-host-01,此后所有docker命令自动路由到该主机 - 查看全部上下文:
docker context ls;导出为 JSON 备份:docker context export my-host-01 > ctx.json
防火墙与权限注意事项
即使配置完成,仍可能因系统层拦截导致连接失败:
- 检查防火墙是否放行目标端口:
sudo ufw allow 2376(Ubuntu)或sudo firewall-cmd --add-port=2376/tcp --permanent(CentOS) - 确认 Docker 进程实际监听状态:
sudo ss -tlnp | grep :2376或sudo netstat -tulpn | grep :2376 - 避免将
docker.sock权限开放给普通用户;远程访问应严格依赖 TLS + 客户端证书鉴权,而非降权运行 dockerd - 若容器需跨主机通信,还需额外配置 CNI 网络插件(如 Weave、Calico)或使用 Docker Swarm 内置覆盖网络

















