1、检查Docker是否正在运行
在进行具体问题定位和处理之前,最好和最简单直观的方式是先看看docker引擎是否能够正常运行。有以下几种方法可以确认docker是否处于正常运行状态:
1)通过执行docker info命令可以直接确认docker是否正常运行:
$ sudo docker info
2)也可以使用操作系统的命令来检查docker是否正常运行:
$ sudo systemctl is-active docker # 或者 $ sudo service docker status
3)可以使用ps或top等命令检查进程的进程是否有正常运行的dockerd。
2、解决daemon.json与启动脚本之间的冲突
在Docker中,守护程序会将所有数据都保存在一个根目录中。通过此目录,将能够跟踪到与Docker相关的所有内容,包括容器(containers),镜像(images),存储卷(volumes),服务定义(service definition)和机密(secrets)。默认情况下,此根目录为:
- Linux环境:/var/lib/docker
- Windows环境:C:\ProgramData\docker
可以使用data-root配置选项将Docker守护程序的配置为使用其他目录 。由于Docker守护程序的状态保留在此根目录中,因此需要确保每个守护程序使用专用的目录。如果两个守护程序共享同一根目录(例如,NFS共享),将可能会导致故障的无法处理的情况。
在docker引擎中,如果使用了daemon.json文件,同时通过手动或使用启动脚本将选项传递给dockerd命令,并且这些选项间存在冲突,则会导致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: [unix:///var/run/docker.sock], from file: [tcp://127.0.0.1:2376])
如果看到类似于上述内容的错误,并且使用此标志手动启动守护程序,则可能需要调整命令字段或daemon.json以解决冲突。如果使用操作系统的初始脚本启动Docker,则可能需要以特定于操作系统的方式覆盖这些脚本中的默认值。
2.1 在DAEMON.JSON中使用HOSTS密钥
默认情况下,Docker会监听套接字(socket)。在Debian和Ubuntu操作系统中使用启动docker时,-H字段会一直被使用。如果在daemon.json指定了一个 hosts条目,则会导致配置冲突,从而导致Docker无法启动。为了解决此问题,请/etc/systemd/system/docker.service.d/docker.conf使用以下内容创建一个新文件,以删除默认情况下启动守护程序时使用的-H参数。
[Service] ExecStart= ExecStart=/usr/bin/dockerd
3、查看日志
守护程序的日志可以帮助诊断问题,docker守护程序日志的具体存储位置取决于操作系统配置和使用的日志记录子系统:
操作系统 | 目录 |
---|---|
RHEL,Oracle Linux | /var/log/messages |
Debian | /var/log/daemon.log |
Ubuntu 16.04+,CentOS | 使用journalctl -u docker.service命令检查日志 |
Ubuntu 14.10- | /var/log/upstart/docker.log |
macOS(Docker 18.01+) | ~/Library/Containers/com.docker.docker/Data/vms/0/console-ring |
macOS(Docker
|