配置 Docker 守护进程的远程访问
默认情况下,Docker守护进程在Unix套接字上侦听连接以接受来自本地客户端的请求。您可以通过将其配置为同时侦听IP地址和端口以及Unix套接字来配置Docker以接受来自远程客户端的请求。
警告
将Docker配置为接受来自远程客户端的连接可能会使您容易受到对主机的未授权访问和其他攻击。
至关重要的是,您必须了解将Docker打开到网络的安全隐患。如果没有采取措施来保护连接,远程非root用户可能会获得主机上的root访问权限。
不建议使用不带TLS的远程访问,并且在未来的版本中将需要显式选择加入。有关如何使用TLS证书来保护此连接的更多信息,请参阅保护Docker守护进程套接字。
启用远程访问
您可以使用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
。
两个常见的防火墙守护进程是
- 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 命令行参考。