配置 Docker 守护进程的远程访问
默认情况下,Docker 守护进程通过 Unix 套接字监听连接,以接受来自本地客户端的请求。通过将其配置为也监听 IP 地址和端口以及 Unix 套接字,您可以配置 Docker 以接受来自远程客户端的请求。
警告
将 Docker 配置为接受来自远程客户端的连接可能会使您容易受到未经授权访问主机和其他攻击的影响。
了解将 Docker 开放到网络所带来的安全隐患至关重要。如果不采取措施保护连接,远程非 root 用户可能会获得主机的 root 访问权限。
不建议在没有 TLS 的情况下进行远程访问,并且将来版本将需要明确选择加入。有关如何使用 TLS 证书保护此连接的更多信息,请参阅 保护 Docker 守护进程套接字。
启用远程访问
您可以启用守护进程的远程访问,可以使用使用 systemd 的 Linux 发行版的 docker.service
systemd unit 文件。或者,如果您的发行版不使用 systemd,则可以使用 daemon.json
文件。
使用 systemd unit 文件和 daemon.json
文件同时配置 Docker 监听连接会导致冲突,从而阻止 Docker 启动。
使用 systemd unit 文件配置远程访问
使用命令
sudo systemctl edit docker.service
在文本编辑器中打开docker.service
的覆盖文件。添加或修改以下行,替换为您自己的值。
[Service] ExecStart= ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375
保存文件。
重新加载
systemctl
配置。$ sudo systemctl daemon-reload
重启 Docker。
$ sudo systemctl restart docker.service
验证更改是否已生效。
$ sudo netstat -lntp | grep dockerd tcp 0 0 127.0.0.1:2375 0.0.0.0:* LISTEN 3758/dockerd
使用 daemon.json
配置远程访问
按如下所示设置
/etc/docker/daemon.json
中的hosts
数组,以连接到 Unix 套接字和 IP 地址{ "hosts": ["unix:///var/run/docker.sock", "tcp://127.0.0.1:2375"] }
重启 Docker。
验证更改是否已生效。
$ sudo netstat -lntp | grep dockerd tcp 0 0 127.0.0.1:2375 0.0.0.0:* LISTEN 3758/dockerd
通过防火墙允许访问远程 API
如果您在运行 Docker 的同一主机上运行防火墙,并且想要从另一个远程主机访问 Docker 远程 API,则必须配置防火墙以允许 Docker 端口上的入站连接。如果您使用 TLS 加密传输,默认端口是 2376
;否则是 2375
。
两个常见的防火墙守护进程是
- Uncomplicated Firewall (ufw),常用于 Ubuntu 系统。
- firewalld,常用于基于 RPM 的系统。
请查阅您的操作系统和防火墙文档。以下信息可能有助于您入门。本说明中使用的设置较为宽松,您可能需要使用更严格的配置来锁定您的系统。
对于 ufw,请在您的配置中设置
DEFAULT_FORWARD_POLICY="ACCEPT"
。对于 firewalld,请在您的策略中添加类似于以下的规则。一条用于入站请求,一条用于出站请求。
<direct> [ <rule ipv="ipv6" table="filter" chain="FORWARD_direct" priority="0"> -i zt0 -j ACCEPT </rule> ] [ <rule ipv="ipv6" table="filter" chain="FORWARD_direct" priority="0"> -o zt0 -j ACCEPT </rule> ] </direct>
确保接口名称和链名称正确无误。
附加信息
有关守护进程远程访问配置选项的更多详细信息,请参阅 dockerd CLI 参考。