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

  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端口上的传入连接。默认端口是2376,如果您使用的是TLS加密传输,否则为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 CLI 参考