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を開始しようとした場合。うまくいきました。
ドッカースナップに関する既知の問題または任意のステップを見逃しましたか。ありがとう!
最初のトラブルシューティングの後。 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デーモンの起動をブロックします。
Snapd 2.16ubuntu3を実行していると思われますが、これは現在16.04で利用可能です。以下で確認できます。
$ apt-cache policy snapd
その場合、問題はインストール時にdockerインターフェースが接続されていないことです。デフォルトでは、Dockerの一部のsnappyインターフェースは自動接続しませんが、ストアからのスナップ宣言を使用して自動接続することができます。インターフェースを自動接続するためのdockerのスナップ宣言がありますが、2.16ubuntu3はそれらの使用方法をまだ知りません。次の2つの選択肢があります。
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」コマンドは不要になります。また、システムグループをネイティブでサポートすることもロードマップ上にあるため、システムに自分でグループを追加する必要はありません。