Ubuntu系统存在两个运行的Docker daemon实例,如何排查并指定使用实例?
排查并解决Ubuntu多Docker daemon运行问题
列出系统中所有运行的Docker daemon实例
- 扫描所有dockerd进程:执行
ps aux | grep dockerd,输出中所有包含dockerd关键字的运行进程就是活跃的Docker daemon实例,重点关注每行的启动参数:--data-root对应该实例存储镜像、卷的根目录,--host对应该实例的监听地址(默认是unix:///var/run/docker.sock,存在其他套接字路径或TCP监听地址即为额外实例)。 - 排查所有Docker相关服务:执行
systemctl list-units | grep docker查看systemd管理的所有Docker相关服务,同时执行snap list | grep docker确认是否有snap版Docker残留,另外检查/etc/rc.local、crontab等自启配置,确认是否存在非systemd管理的dockerd自启项。 - 定位占用端口的实例:执行
sudo lsof -i :8011或sudo netstat -tulpn | grep 8011拿到占用端口的进程PID,再和第一步查询到的dockerd进程PID做对应,即可确认是哪个Docker实例占用了端口。如果要查看该实例下的容器列表,可执行docker -H <该实例的监听套接字路径> ps -a,比如docker -H unix:///var/run/docker-alt.sock ps -a。
指定系统默认使用的Docker实例
- 清理多余实例:如果是snap版Docker残留,执行
sudo snap remove --purge docker彻底清除;如果是多余的systemd Docker服务,执行sudo systemctl stop <多余服务名> && sudo systemctl disable <多余服务名>;如果是无服务管理的独立进程,直接执行sudo kill <对应dockerd进程PID>,同时删除该进程对应的自启配置,避免重启后再次运行。 - 确认保留实例的配置:编辑
/etc/docker/daemon.json,将data-root参数设置为你存储原有镜像、卷的目录(默认路径为/var/lib/docker,如果之前重装Docker时修改过该路径,改回原有路径后重启服务即可恢复之前的镜像和卷数据)。 - 配置客户端默认连接规则:在当前用户的shell配置文件(
~/.bashrc或~/.zshrc)末尾添加export DOCKER_HOST=unix:///var/run/docker.sock(将路径替换为你要保留的Docker实例的监听套接字路径),执行source ~/.bashrc(对应zsh则执行source ~/.zshrc)立即生效,后续执行docker、docker-compose命令默认都会连接该实例。 - 固定自启配置:执行
sudo systemctl enable docker确保你要保留的Docker服务开机自启,重启设备后执行docker info确认连接的实例正确,镜像、卷数据展示正常即可。
内容的提问来源于stack exchange,提问作者DockerUser12
相关产品推荐
相关产品推荐

