前言
默认 Docker
是通过非网络的 Unix
套接字运行的,只能够进行本地通信(/var/run/docker.sock
),是不能够直接远程连接 Docker
的。
开始配置
编辑 /etc/docker/daemon.json
文件
{
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
}
重启 Docker
服务
sudo systemctl restart docker
检测 Docker
服务
systemctl status docker
解决问题
unable to configure the Docker daemon with file /etc/docker/daemon.json: the following directives are specified both as a flag and in the configuration file: hosts: (from flag: [fd://], from file: [unix:///>
Docker
守护进程的配置冲突:hosts
参数在 /etc/docker/daemon.json
文件中和 systemd
服务的启动参数(flag
)中同时被定义,导致 Docker
无法启动。具体的冲突是:
daemon.json
配置了hosts: ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
。systemd
服务启动参数(flag
)中指定了hosts: [fd://]
。
Docker
不允许 hosts
参数在两个地方同时定义,因此启动失败。
检查 systemd 配置文件:
Docker
的 systemd
配置文件可能通过 ExecStart
参数设置了默认的 fd://
(文件描述符通信方式)。查看当前配置:
systemctl cat docker
or
cat /lib/systemd/system/docker.service
查找 ExecStart 行,通常类似:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
-H fd://
是默认的 hosts
配置,与 daemon.json
中的配置冲突。
移除 systemd 中的 -H fd://
编辑 systemd
的 Docker
服务配置文件,避免重复定义 hosts
创建或编辑覆盖文件
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo nano /etc/systemd/system/docker.service.d/override.conf
添加以下内容,移除 -H fd://
:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock
注意:ExecStart=
先清空原有配置,然后重新定义。
保存并重新加载 systemd
配置,重启 Docker
并检查状态:
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl status docker