我正在运行 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 还不知道如何使用它们。您有两个选择:
从 xenial-proposed 安装 snapd: https://launchpad.net/ubuntu/+source/snapd/2.17.1ubuntu1
手动连接接口。例如:
$ 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
显示所有正在运行的容器。