docker守护进程默认监听/var/run/docker.sock,修改需通过daemon.json中hosts字段指定新unix socket路径(如unix:///opt/mydocker.sock),客户端须用docker_host环境变量或-h参数同步适配。
docker 守护进程默认监听 /var/run/docker.sock 这个 unix 套接字,要修改它,本质是让 dockerd 启动时绑定到你指定的新路径,而不是直接“替换”旧文件。关键在配置守护进程的监听地址,客户端随后需同步适配。
修改 daemon.json 配置 hosts 字段
这是最推荐、最稳定的方式,适用于使用 systemd 的主流 Linux 发行版(如 Ubuntu、CentOS):
- 停止 Docker 服务:
sudo systemctl stop docker - 编辑配置文件:
sudo nano /etc/docker/daemon.json - 写入合法 hosts 数组,例如改为
/opt/mydocker.sock:{ "hosts": ["unix:///opt/mydocker.sock"] }
注意:必须带unix://前缀,路径须为绝对路径 - 确保目标目录存在且权限允许创建 socket:
sudo mkdir -p /opt && sudo chmod 755 /opt - 重载并启动:
sudo systemctl daemon-reload && sudo systemctl start docker - 验证:
ls -l /opt/mydocker.sock应存在,属主为root:docker,权限类似srw-rw----
避免与 systemd 配置冲突
如果系统同时使用 docker.service 文件(如 /usr/lib/systemd/system/docker.service)和 daemon.json,两者都设了 -H 参数会导致守护进程启动失败。
- 优先用
daemon.json管理 hosts,保持docker.service中的ExecStart不含-H参数(或仅保留-H fd://) - 若已手动改过 service 文件,建议还原默认内容,再统一通过
daemon.json控制 - 检查是否冲突:运行
sudo dockerd --help | grep -A2 "options\|host",确认实际生效的监听方式
客户端如何连接新套接字
客户端默认仍找 /var/run/docker.sock,必须显式告知新路径:
- 临时生效(当前终端):
export DOCKER_HOST=unix:///opt/mydocker.sock - 永久生效(对当前用户):将上行加入
~/.bashrc或~/.zshrc,然后source - 单次命令覆盖:
docker -H unix:///opt/mydocker.sock info - 注意:
DOCKER_HOST设为 Unix 路径时,会自动忽略 TCP 相关设置,无需额外禁用
为什么不能直接 mv /var/run/docker.sock?
这个文件是守护进程运行时动态创建的通信端点,不是静态配置文件:
- 直接移动或删除它,Docker 重启后仍会在原路径重建
- 硬链接或符号链接到新路径不可靠,部分版本不识别,且权限/SELinux 上可能出问题
- 真正起效的是让
dockerd主动 bind 到你指定的路径——这才是设计上的正确入口











