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

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

 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 snap的任何已知问题? 还是我错过了任何一步。 谢谢!

经过一些初步故障排除 我能够自己找到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守护进程启动。

我怀疑你正在运行snapd 2.16ubuntu3,这是目前在16.04可用的。 您可以validation:

 $ apt-cache policy snapd 

如果是这种情况,问题是docker接口在安装时没有连接。 默认情况下,docker的某些snappy接口不会自动连接,但可以使用来自存储的快照声明来自动连接它们。 我们有docker声明自动连接接口,但2.16ubuntu3还不知道如何使用它们。 你有两个选择:

  1. 从xenial建议安装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’命令。 它也是本地支持系统组的路线图,因此您不必自己将该组添加到系统中。