配置 Docker 守护进程的远程访问
默认情况下,Docker 守护进程侦听 Unix 套接字上的连接,以接受来自本地客户端的请求。你可以通过配置 Docker 侦听 IP 地址和端口以及 Unix 套接字,将其配置为接受来自远程客户端的请求。
警告
将 Docker 配置为接受来自远程客户端的连接可能会使你容易受到对主机和其它攻击的未经授权的访问。
至关重要的是,你必须了解将 Docker 打开到网络的安全隐患。如果没有采取措施来保护连接,远程非 root 用户可能获得主机上的 root 访问权限。
不建议使用无 TLS 的远程访问,并且在将来的版本中将需要明确选择加入。有关如何使用 TLS 证书来保护此连接的更多信息,请参阅 保护 Docker 守护进程套接字。
启用远程访问
你可以使用 docker.service
systemd 单位文件(适用于使用 systemd 的 Linux 发行版)来启用对守护进程的远程访问。或者,如果你的发行版不使用 systemd,则可以使用 daemon.json
文件。
将 Docker 配置为同时使用 systemd 单位文件和 daemon.json
文件侦听连接会导致冲突,从而阻止 Docker 启动。
使用 systemd 单位文件配置远程访问
使用
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 端口上的传入连接。默认端口为 2376
(如果你使用 TLS 加密传输)或 2375
(否则)。
两个常见的防火墙守护进程是
- 非复杂防火墙 (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 参考。