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