配置 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单元文件配置远程访问

  1. 使用命令sudo systemctl edit docker.service在文本编辑器中打开docker.service的覆盖文件。

  2. 添加或修改以下行,替换您自己的值。

    [Service]
    ExecStart=
    ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375
  3. 保存文件。

  4. 重新加载systemctl配置。

    $ sudo systemctl daemon-reload
    
  5. 重启Docker。

    $ sudo systemctl restart docker.service
    
  6. 验证更改是否已生效。

    $ sudo netstat -lntp | grep dockerd
    tcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      3758/dockerd
    

使用daemon.json配置远程访问

  1. 如下所示,在/etc/docker/daemon.json中设置hosts数组以连接到Unix套接字和IP地址

    {
      "hosts": ["unix:///var/run/docker.sock", "tcp://127.0.0.1:2375"]
    }
  2. 重启Docker。

  3. 验证更改是否已生效。

    $ 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,请在您的配置中设置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 命令行参考