无法在Ubuntu 16.04中启动Docker服务

60
我一直在尝试在Ubuntu 16.04上使用Docker (1.10),但安装失败,因为Docker服务无法启动。我已经尝试通过docker.io、docker-engine apt包和curl -sSL https://get.docker.com/ | sh进行安装,但都没有成功。
我的主机信息如下: Linux Xenial 4.5.3-040503-generic #201605041831 SMP Wed May 4 22:33:50 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
下面是systemctl status docker.service的输出:
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since sáb 2016-05-14 15:17:31 CEST; 12min ago
     Docs: https://docs.docker.com
  Process: 22479 ExecStart=/usr/bin/docker daemon -H fd:// (code=exited, status=1/FAILURE)
 Main PID: 22479 (code=exited, status=1/FAILURE)

may 14 15:17:30 Xenial docker[22479]: time="2016-05-14T15:17:30.103601523+02:00" level=info msg="New containerd process, pid: 22485\n"
may 14 15:17:31 Xenial docker[22479]: time="2016-05-14T15:17:31.149064723+02:00" level=error msg="devmapper: Unable to delete device: devicemapper: Can't set task name /dev/mapper/docker-8:6-2101297-pool"
may 14 15:17:31 Xenial docker[22479]: time="2016-05-14T15:17:31.149127439+02:00" level=warning msg="devmapper: Usage of loopback devices is strongly discouraged for production use. Please use `--storage-opt dm.thinpooldev` or use `man docker` to refer to dm.thinpooldev section."
may 14 15:17:31 Xenial docker[22479]: time="2016-05-14T15:17:31.153010028+02:00" level=error msg="[graphdriver] prior storage driver \"devicemapper\" failed: devicemapper: Can't set task name /dev/mapper/docker-8:6-2101297-pool"
may 14 15:17:31 Xenial docker[22479]: time="2016-05-14T15:17:31.153130839+02:00" level=fatal msg="Error starting daemon: error initializing graphdriver: devicemapper: Can't set task name /dev/mapper/docker-8:6-2101297-pool"
may 14 15:17:31 Xenial systemd[1]: docker.service: Main process exited, code=exited, status=1/FAILURE
may 14 15:17:31 Xenial docker[22479]: time="2016-05-14T15:17:31+02:00" level=info msg="stopping containerd after receiving terminated"
may 14 15:17:31 Xenial systemd[1]: Failed to start Docker Application Container Engine.
may 14 15:17:31 Xenial systemd[1]: docker.service: Unit entered failed state.
may 14 15:17:31 Xenial systemd[1]: docker.service: Failed with result 'exit-code'.

这里是sudo docker daemon -D

DEBU[0000] docker group found. gid: 999                 
DEBU[0000] Listener created for HTTP on unix (/var/run/docker.sock) 
INFO[0000] previous instance of containerd still alive (23050) 
DEBU[0000] containerd connection state change: CONNECTING 
DEBU[0000] Using default logging driver json-file       
DEBU[0000] Golang's threads limit set to 55980          
DEBU[0000] received past containerd event: &types.Event{Type:"live", Id:"", Status:0x0, Pid:"", Timestamp:0x57372cae} 
DEBU[0000] containerd connection state change: READY    
DEBU[0000] devicemapper: driver version is 4.34.0       
DEBU[0000] devmapper: Generated prefix: docker-8:6-2101297 
DEBU[0000] devmapper: Checking for existence of the pool docker-8:6-2101297-pool 
DEBU[0000] devmapper: poolDataMajMin=7:0 poolMetaMajMin=7:1

DEBU[0000] devmapper: Major:Minor for device: /dev/loop0 is:7:0 
DEBU[0000] devmapper: Major:Minor for device: /dev/loop1 is:7:1 
DEBU[0000] devmapper: loadDeviceFilesOnStart()          
DEBU[0000] devmapper: Skipping file /var/lib/docker/devicemapper/metadata/transaction-metadata 
DEBU[0000] devmapper: loadDeviceFilesOnStart() END      
DEBU[0000] devmapper: constructDeviceIDMap()            
DEBU[0000] devmapper: constructDeviceIDMap() END        
DEBU[0000] devmapper: Rolling back open transaction: TransactionID=1 hash= device_id=1 
ERRO[0000] devmapper: Unable to delete device: devicemapper: Can't set task name /dev/mapper/docker-8:6-2101297-pool 
WARN[0000] devmapper: Usage of loopback devices is strongly discouraged for production use. Please use `--storage-opt dm.thinpooldev` or use `man docker` to refer to dm.thinpooldev section. 
DEBU[0000] devmapper: Initializing base device-mapper thin volume 
DEBU[0000] devicemapper: CreateDevice(poolName=/dev/mapper/docker-8:6-2101297-pool, deviceID=1) 
DEBU[0000] devmapper: Error creating device: devicemapper: Can't set task name /dev/mapper/docker-8:6-2101297-pool 
DEBU[0000] devmapper: Error device setupBaseImage: devicemapper: Can't set task name /dev/mapper/docker-8:6-2101297-pool 
ERRO[0000] [graphdriver] prior storage driver "devicemapper" failed: devicemapper: Can't set task name /dev/mapper/docker-8:6-2101297-pool 
DEBU[0000] Cleaning up old mountid : start.             
FATA[0000] Error starting daemon: error initializing graphdriver: devicemapper: Can't set task name /dev/mapper/docker-8:6-2101297-pool

这里是 ./check-config.sh 的输出结果:
warning: /proc/config.gz does not exist, searching other paths for kernel config ...
info: reading kernel config from /boot/config-4.5.3-040503-generic ...

Generally Necessary:
- cgroup hierarchy: properly mounted [/sys/fs/cgroup]
- apparmor: enabled and tools installed
- CONFIG_NAMESPACES: enabled
- CONFIG_NET_NS: enabled
- CONFIG_PID_NS: enabled
- CONFIG_IPC_NS: enabled
- CONFIG_UTS_NS: enabled
- CONFIG_DEVPTS_MULTIPLE_INSTANCES: enabled
- CONFIG_CGROUPS: enabled
- CONFIG_CGROUP_CPUACCT: enabled
- CONFIG_CGROUP_DEVICE: enabled
- CONFIG_CGROUP_FREEZER: enabled
- CONFIG_CGROUP_SCHED: enabled
- CONFIG_CPUSETS: enabled
- CONFIG_MEMCG: enabled
- CONFIG_KEYS: enabled
- CONFIG_MACVLAN: enabled (as module)
- CONFIG_VETH: enabled (as module)
- CONFIG_BRIDGE: enabled (as module)
- CONFIG_BRIDGE_NETFILTER: enabled (as module)
- CONFIG_NF_NAT_IPV4: enabled (as module)
- CONFIG_IP_NF_FILTER: enabled (as module)
- CONFIG_IP_NF_TARGET_MASQUERADE: enabled (as module)
- CONFIG_NETFILTER_XT_MATCH_ADDRTYPE: enabled (as module)
- CONFIG_NETFILTER_XT_MATCH_CONNTRACK: enabled (as module)
- CONFIG_NF_NAT: enabled (as module)
- CONFIG_NF_NAT_NEEDED: enabled
- CONFIG_POSIX_MQUEUE: enabled

Optional Features:
- CONFIG_USER_NS: enabled
- CONFIG_SECCOMP: enabled
- CONFIG_CGROUP_PIDS: enabled
- CONFIG_MEMCG_KMEM: missing
- CONFIG_MEMCG_SWAP: enabled
- CONFIG_MEMCG_SWAP_ENABLED: missing
    (note that cgroup swap accounting is not enabled in your kernel config, you can enable it by setting boot option "swapaccount=1")
- CONFIG_BLK_CGROUP: enabled
- CONFIG_BLK_DEV_THROTTLING: enabled
- CONFIG_IOSCHED_CFQ: enabled
- CONFIG_CFQ_GROUP_IOSCHED: enabled
- CONFIG_CGROUP_PERF: enabled
- CONFIG_CGROUP_HUGETLB: enabled
- CONFIG_NET_CLS_CGROUP: enabled (as module)
- CONFIG_CGROUP_NET_PRIO: enabled
- CONFIG_CFS_BANDWIDTH: enabled
- CONFIG_FAIR_GROUP_SCHED: enabled
- CONFIG_RT_GROUP_SCHED: missing
- CONFIG_EXT3_FS: missing
- CONFIG_EXT3_FS_XATTR: missing
- CONFIG_EXT3_FS_POSIX_ACL: missing
- CONFIG_EXT3_FS_SECURITY: missing
    (enable these ext3 configs if you are using ext3 as backing filesystem)
- CONFIG_EXT4_FS: enabled
- CONFIG_EXT4_FS_POSIX_ACL: enabled
- CONFIG_EXT4_FS_SECURITY: enabled
- Network Drivers:
  - "overlay":
    - CONFIG_VXLAN: enabled (as module)
- Storage Drivers:
  - "aufs":
    - CONFIG_AUFS_FS: missing
  - "btrfs":
    - CONFIG_BTRFS_FS: enabled (as module)
  - "devicemapper":
    - CONFIG_BLK_DEV_DM: enabled
    - CONFIG_DM_THIN_PROVISIONING: enabled (as module)
  - "overlay":
    - CONFIG_OVERLAY_FS: enabled (as module)
  - "zfs":
    - /dev/zfs: missing
    - zfs command: missing
    - zpool command: missing

如果有人能帮助我,我将非常感激。


你重启系统了吗? - Yogesh Jilhawar
是的,我已经解决了问题,如下所述。 - Salva Corts
11个回答

107

更新

在更高版本的docker和Ubuntu中,docker的unit文件只是被屏蔽(指向/dev/null)。
您可以在终端中运行以下命令进行验证:

sudo file /lib/systemd/system/docker.service
sudo file /lib/systemd/system/docker.socket

你应该看到该单元文件符号链接指向 /dev/null。
在这种情况下,你只需遵循 S34N 的建议,并运行:

sudo systemctl unmask docker.service
sudo systemctl unmask docker.socket
sudo systemctl start docker.service
sudo systemctl status docker

我也会保留原始帖子,以回答报告存储驱动程序应替换的错误日志:

原始帖子

我遇到了同样的问题,我尝试使用Salva Cort的建议进行修复,但打印/etc/default/docker会显示:

 

#此文件不适用于systemd

因此,这是一种适用于systemd(Ubuntu 15.04及更高版本)的永久性解决方法:that works for systemd (Ubuntu 15.04 and higher):

  1. 创建一个名为/etc/systemd/system/docker.service.d/overlay.conf的新文件,并添加以下内容:

[Service]
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// -s overlay
  • 通过执行以下命令来提交更改:

    sudo systemctl daemon-reload
    
  • 验证配置是否已加载:

  • systemctl show --property=ExecStart docker
    
  • 重启 Docker:

    sudo systemctl restart docker
    

  • 1
    如果你把所有的 docker 改成 nvidia-docker,这个方法也适用于 nvidia-docker - Laurenz
    3
    为了使这个程序运行,我不得不添加来自/etc/systemd/system/docker.service相应行的整个命令行。按照给定的第一步只是覆盖了所有命令行参数,在我的情况下丢失了很多参数。 - rep
    2
    这个答案(不是链接的答案)似乎不再起作用,至少在Ubuntu 16.04,Docker版本17.12.1-ce上是如此。有一个错误阻止服务启动,其中包含消息“ExecStart = / usr / bin / docker daemon -H fd // -s overlay(code = exited,status = 125)”和“未知的速记标志:'s' in -s”。因此,显然不再支持-s标志。 - Tony
    3
    即使您只是在/etc/docker/daemon.json中编辑或创建一个文件并添加以下行,它也可以正常工作: { "storage-driver": "overlay2" } 然后运行命令:sudo systemctl restart docker.service - Naitik Shah
    这里的问题不在于新版本在安装时掩盖了docker.service;问题在于旧版本在卸载时掩盖了它。因此,只有在您安装了旧版本、将其删除,然后安装了新版本时,才会出现这个问题。我已经提交了详细信息的LP#1844894 - Anders Kaseorg
    1
    那些systemctl命令正是我今天早上升级到20.04后所需要的。 - MattBoothDev

    44

    以下解除遮罩的命令在我这里可行(Ubuntu 18)。希望能帮助到某个需要的人... :-)

    sudo systemctl unmask docker.service
    sudo systemctl unmask docker.socket
    sudo systemctl start docker.service
    

    在/etc/docker/daemon.json中为"userns-remap"指定错误的用户后,这个方法解决了我的问题。 - Steven Huang
    1
    docker.service 的作业失败了,因为控制进程以错误代码退出。 - Reza Taba

    13

    我在使用docker-machine将docker从17.05-ce升级到17.06-ce后遇到了相同的问题。

    1. Update /etc/systemd/system/docker.service.d/10-machine.conf

      replace

      `docker daemon` => `dockerd`
      

      example from

      [Service]
      ExecStart=
      ExecStart=/usr/bin/docker deamon -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --storage-driver aufs --tlsverify --tlscacert /etc/docker/ca.pem --tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem --label provider=generic
      Environment=
      

      to

      [Service]
      ExecStart=
      ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --storage-driver aufs --tlsverify --tlscacert /etc/docker/ca.pem --tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem --label provider=generic
      Environment=
      
    2. flush changes by executing:

      sudo systemctl daemon-reload
      
    3. restart docker:

      sudo systemctl restart docker
      

    当我尝试对新配置的DigitalOcean droplet运行docker-machine时,这个解决方案对我很有效。 - cwash

    9

    好的,最终我解决了问题。

    你需要做的就是加载不同的存储驱动,在我的情况下,我将使用overlay

    1. 禁用Docker服务sudo systemctl stop docker.service
    2. 启动Docker Daemonoverlay驱动程序):sudo docker daemon -s overlay
    3. 运行演示容器sudo docker run hello-world

    为了使这些更改永久生效,您必须编辑/etc/default/docker文件并添加选项:

    DOCKER_OPTS="-s overlay"

    下一次Docker服务被加载时,它将运行docker daemon -s overlay


    很抱歉要说,但在Ubuntu上编辑/etc/default/docker是不起作用的。它仍然会像原来的问题一样卡住。然而,“sudo docker daemon -s overlay”总是有效的。我每次都会使用这个命令。谢谢。 - Boss Man
    4
    我无法完成第二步启动Docker。命令提示“-s”不是一个标志,而“daemon”也不是一个Docker命令。我正在使用Docker版本18.09.0。 - Adolfo Correa

    2

    1

    sudo dockerd --debug 可以帮助解决实际痛点,我在Ubuntu 20 LTS上使用这个命令成功解决了同样的错误。


    1
    在查看其他答案后,似乎问题是该服务未使用 -s overlay 选项运行。
    我还注意到docker尝试在调用末尾使用 ${DOCKER_OPTS}
    我能够通过 export DOCKER_OPTS="-s overlay"(因为默认情况下 DOCKER_OPTS 为空)来使docker运行。

    1
    我在新的Ubuntu 18.04.3 LTS上安装Docker(版本19.03.3-rc1)时遇到了类似的问题。默认情况下,新安装不会存在/etc/docker/daemon.json文件。按照教程,我通过创建新的daemon.json文件将存储驱动程序更改为devicemapper。它起作用了,但是后来我删除了daemon.json文件,以为它会恢复默认设置,但并没有成功,服务无法启动。
    重新创建/etc/docker/daemon.json文件,并将存储驱动程序设置为默认值,解决了我的问题。
    {
        "storage-driver": "overlay2"
    }
    

    我在docker版本19.03.12上遇到了类似的问题,我的启动docker服务失败的原因是我在其他主题上创建了一个空的“/etc/docker/daemon.json”文件。删除这个文件解决了我的问题。 - Jackie Yeh

    0
    今天我在升级Ubuntu内核后遇到了这个问题,并尝试了很多解决方案。然而,唯一有效的方法(适用于Ubuntu 16.04.6 LTS)是删除(或重命名)文件夹:/var/lib/docker。
    请注意,这将删除所有Docker镜像、容器和卷等。因此,在应用之前,请了解其影响或备份!
    更多细节请参见:https://github.com/docker/for-linux/issues/162

    0

    就我而言,我遇到了这个错误。

    docker.service 作业失败,因为控制进程以错误代码退出。有关详细信息,请参见 "systemctl status docker.service" 和 "journalctl -xe"。

    最后我发现是 /etc/docker/daemon.json 的错误,因为我添加了 registry-mirrors

    {
        "runtimes": {
    
            "nvidia": {
                "path": "/usr/bin/nvidia-container-runtime",
                "runtimeArgs": []
            }
        }    
    
        # I forget to add a comma , here !!!!!!!
        "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
    }
    

    我添加后,然后执行systemctl restart docker,问题解决了。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接