使用 snap 安装 docker 后无法启动 dockerd

使用 snap 安装 docker 后无法启动 dockerd

我正在运行 16.04(distro=Ubuntu 16.04.1 LTS和 kernel= 4.4.0-45-generic)并通过 docker snap 安装了 docker。

snap install docker

这是我的快照列表。

# snap list
Name               Version   Rev  Developer  Notes
docker             1.11.2-9  56   canonical  -
snapstore-example  0.3       4    noise      -
ubuntu-core        16.04.1   423  canonical  -

但我无法启动docker守护进程。我做了什么

systemctl start snap.docker.dockerd.service

错误日志好像是经过许可的。

Nov 30 00:54:20 ubuntu-xenial systemd[1]: Started Service for snap application docker.dockerd.
Nov 30 00:54:20 ubuntu-xenial snap[19148]: grep: /proc/self/mountinfo: Permission denied
Nov 30 00:54:20 ubuntu-xenial snap[19148]: time="2016-11-30T00:54:20.708894420Z" level=fatal msg="can't create unix socket /var/run/docker.sock: permission denied"
Nov 30 00:54:20 ubuntu-xenial systemd[1]: snap.docker.dockerd.service: Main process exited, code=exited, status=1/FAILURE
Nov 30 00:54:20 ubuntu-xenial systemd[1]: snap.docker.dockerd.service: Unit entered failed state.
Nov 30 00:54:20 ubuntu-xenial systemd[1]: snap.docker.dockerd.service: Failed with result 'exit-code'.
Nov 30 00:54:20 ubuntu-xenial systemd[1]: snap.docker.dockerd.service: Service hold-off time over, scheduling restart.
Nov 30 00:54:20 ubuntu-xenial systemd[1]: Stopped Service for snap application docker.dockerd.
Nov 30 00:54:20 ubuntu-xenial systemd[1]: snap.docker.dockerd.service: Start request repeated too quickly.
Nov 30 00:54:20 ubuntu-xenial systemd[1]: Failed to start Service for snap application docker.dockerd.

并且这个错误更加具体。

Nov 30 00:54:20 ubuntu-xenial snap[19148]: time="2016-11-30T00:54:20.708894420Z" level=fatal msg="can't create unix socket /var/run/docker.sock: permission denied"

如果我这样做apt-get install docker.io并尝试使用systemctl start docker.service. 启动 docker.service ,它运行良好。

docker snap 有任何已知问题吗?或者我是否错过了任何步骤。谢谢!

答案1

经过一些初步的故障排除。我自己能够找到 RC。似乎 apparmor 阻止了两者,grep: /proc/self/mountinfo并在/var/run/docker.sock

syslog.1:Nov 30 02:18:27 ubuntu-xenial kernel: [ 5359.923039] audit: type=1400 audit(1480472307.476:349): apparmor="DENIED" operation="open" profile="snap.docker.dockerd" name="/proc/19448/mountinfo" pid=19448 comm="umount" requested_mask="r" denied_mask="r" fsuid=0 ouid=0
syslog.1:Nov 30 02:18:27 ubuntu-xenial kernel: [ 5359.923053] audit: type=1400 audit(1480472307.476:350): apparmor="DENIED" operation="open" profile="snap.docker.dockerd" name="/proc/19448/mounts" pid=19448 comm="umount" requested_mask="r" denied_mask="r" fsuid=0 ouid=0
syslog.1:Nov 30 02:38:28 ubuntu-xenial kernel: [ 6560.900141] audit: type=1400 audit(1480473508.452:362): apparmor="DENIED" operation="connect" profile="snap.docker.docker" name="/run/docker.sock" pid=20591 comm="docker" requested_mask="wr" denied_mask="wr" fsuid=0 ouid=0

但是为什么会这样呢?为什么 16.04 附带了默认的 apparmor 配置文件(在/var/lib/snapd/apparmor/profiles/snap.docker.docker),它会阻止 dockerd 守护进程启动。

答案2

我怀疑你正在运行 snapd 2.16ubuntu3,这是 16.04 中目前可用的版本。你可以使用以下命令进行验证:

$ apt-cache policy snapd

如果是这种情况,则问题在于安装时未连接 docker 接口。默认情况下,docker 的一些 snappy 接口不会自动连接,但可以使用商店中的 snap 声明来自动连接它们。我们有 docker 的 snap 声明来自动连接接口,但 2.16ubuntu3 还不知道如何使用它们。您有两个选择:

  1. 从 xenial-proposed 安装 snapd: https://launchpad.net/ubuntu/+source/snapd/2.17.1ubuntu1

  2. 手动连接接口。例如:

$ snap interfaces |grep docker # show the disconnected interfaces
docker:docker-daemon     -
:docker-support          -
:home                    docker
:network                 docker
:network-bind            docker
-                        docker:docker-cli
-                        docker:firewall-control
-                        docker:privileged
-                        docker:support

# connect the interfaces
$ sudo snap connect docker:support ubuntu-core:docker-support
$ sudo snap connect docker:firewall-control ubuntu-core:firewall-control
$ sudo snap connect docker:docker-cli docker:docker-daemon

$ snap interfaces | grep docker # show the connected interfaces
docker:docker-daemon     docker:docker-cli
:docker-support          docker:support
:firewall-control        docker
:home                    docker
:network                 docker
:network-bind            docker
-                        docker:privileged

# restart the daemon
$ sudo service snap.docker.dockerd stop
$ sudo service snap.docker.dockerd start

# verify it worked
$ sudo docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
...

如果您想使用 docker 特权容器,那么请将该接口连接到:

$ sudo snap connect docker:privileged ubuntu-core:docker-support

如果您不想使用“sudo”,那么请创建 docker 组并将自己添加到其中:

$ sudo addgroup docker
$ sudo adduser `id -un` docker
$ newgrp docker

# restart docker so it will make the socket group writable by 'docker'
$ sudo service snap.docker.dockerd stop
$ sudo service snap.docker.dockerd start

$ docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
...

您可以在这里获得有关 snappy 接口的更多信息: https://github.com/snapcore/snapd/wiki/Interfaces

如上所述,安装 snapd 2.17 或更高版本后,将不再需要“snap connect”命令。它还计划原生支持系统组,因此您无需亲自将组添加到系统中。

答案3

运行 20.04 时我遇到了类似的问题。

$ sudo snap start docker
Started.

但是,当我发出 docker 命令时,它看起来好像没有启动。

$ docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

我需要回到第一的抛出错误以使用 journalctl 找出问题所在。后续错误没有报告相同的问题。

$ journalctl -x -u snap.docker.dockerd.service
docker.dockerd[1687]: failed to start daemon: pid file found, ensure docker is not running or delete /var/snap/docker/471/run/docker.pid

只需删除 .pid 文件即可解决问题

$ sudo rm /var/snap/docker/471/run/docker.pid
$ sudo snap start docker
$ docker ps

显示所有正在运行的容器。

相关内容