web-dev-qa-db-ja.com

スナップでdockerをインストールした後にdockerdを起動できませんでした

16.04(distro = Ubuntu 16.04.1 LTSおよびkernel = 4.4.0-45-generic)を実行しており、Dockerスナップによって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  -

しかし、ドッカーデーモンを起動できませんでした。私がしたこと

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を開始しようとした場合。うまくいきました。

ドッカースナップに関する既知の問題または任意のステップを見逃しましたか。ありがとう!

3
Xin Ma

最初のトラブルシューティングの後。 RCを自分で見つけることができました。防具が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デーモンの起動をブロックします。

1
Xin Ma

Snapd 2.16ubuntu3を実行していると思われますが、これは現在16.04で利用可能です。以下で確認できます。

$ apt-cache policy snapd

その場合、問題はインストール時にdockerインターフェースが接続されていないことです。デフォルトでは、Dockerの一部のsnappyインターフェースは自動接続しませんが、ストアからのスナップ宣言を使用して自動接続することができます。インターフェースを自動接続するためのdockerのスナップ宣言がありますが、2.16ubuntu3はそれらの使用方法をまだ知りません。次の2つの選択肢があります。

  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」コマンドは不要になります。また、システムグループをネイティブでサポートすることもロードマップ上にあるため、システムに自分でグループを追加する必要はありません。

1