なんか書いていこうぜー .com

Let's write something good

Arch Linux で rootless docker を設定した

2020-03-11
  • Share on Facebook
  • Tweet
  • Add to Pocket

何点か躓いたので emoji-memo しておく。

https://docs.docker.com/engine/security/rootless/ の手順を参考に rootless docker を設定していった。

前提

https://docs.docker.com/engine/security/rootless/#arch-linux#prerequisites を確認した。

newuidmapnewgidmap コマンドはインストールされていた。 /etc/subuid/etc/subgid はなかったので、下記のコマンドで作成した。中身は空のまま。

$ sudo touch /etc/subgid /etc/subuid

Arch Linux 特有の準備作業

https://docs.docker.com/engine/security/rootless/#arch-linux を参照。

私の環境では、/etc/sysctl.conf はなく /etc/sysctl.d/ があったため、/etc/sysctl.d/100-rootless-docker.conf を作成して、kernel.unprivileged_userns_clone=1 を記述し、sudo sysctl --system を実行する。

$ sudo vim /etc/sysctl.d/100-rootless-docker.conf
kernel.unprivileged_userns_clone=1

$ sudo sysctl --system

インストール (下ごしらえ)

https://docs.docker.com/engine/security/rootless/#arch-linux#install を参照。

curl と sh でインストールすることになるのだが、/etc/subgid/etc/subuid が空の場合、これらにユーザの情報を書き込むように警告が出るので、その値を書き込む。 /etc/subuid, /etc/subuid どちらも空ならば、それぞれについて警告が出るので、両方に書き込む。

$ curl -fsSL https://get.docker.com/rootless | sh

Could not find records for the current user muryoimpl from /etc/subuid . Please make sure valid subuid range is set there.
For example:
echo "muryoimpl:100000:65536" >> /etc/subuid

書き込んで、再度実行する。システムに入った docker が起動していると下記の警告が出る。docker.service 停止して環境変数を設定した。

$ curl -fsSL https://get.docker.com/rootless | sh
Aborting because rootful Docker is running and accessible. Set FORCE_ROOTLESS_INSTALL=1 to ignore.

$ sudo systemctl stop docker.service
$ export FORCE_ROOTLESS_INSTALL=1

インストール

下ごしらえが終わったら、curl を使ってインストールする。 PATH と DOCKER_HOST の設定が出力されるので、私は ~/.zshrc に書き込んだ。

$ curl -fsSL https://get.docker.com/rootless | sh

# Installing stable version 19.03.7
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 60.7M  100 60.7M    0     0  22.8M      0  0:00:02  0:00:02 --:--:-- 22.7M
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 17.8M  100 17.8M    0     0  14.8M      0  0:00:01  0:00:01 --:--:-- 14.8M
# starting systemd service
# starting systemd service
● docker.service - Docker Application Container Engine (Rootless)
     Loaded: loaded (/home/muryoimpl/.config/systemd/user/docker.service; disabled; vendor preset: enabled)
     Active: active (running) since Wed 2020-03-11 23:08:04 JST; 36ms ago
       Docs: https://docs.docker.com
   Main PID: 12660 (rootlesskit)
     CGroup: /user.slice/user-1000.slice/user@1000.service/docker.service
             ├─12660 rootlesskit --net=vpnkit --mtu=1500 --slirp4netns-sandbox=auto --slirp4netns-seccomp=auto --disable-host-loopback --port-driver=builtin --copy-up=/etc --copy-up=/run /home/muryoimpl/bin/dockerd-rootless.sh --experimental --storage-driver=vfs
             ├─12669 /proc/self/exe --net=vpnkit --mtu=1500 --slirp4netns-sandbox=auto --slirp4netns-seccomp=auto --disable-host-loopback --port-driver=builtin --copy-up=/etc --copy-up=/run /home/muryoimpl/bin/dockerd-rootless.sh --experimental --storage-driver=vfs
             └─12676 vpnkit --ethernet /tmp/rootlesskit924008508/vpnkit-ethernet.sock --mtu 1500 --host-ip 0.0.0.0

Mar 11 23:08:04 muryoimpl-T495 dockerd-rootless.sh[12660]: + which slirp4netns
Mar 11 23:08:04 muryoimpl-T495 dockerd-rootless.sh[12660]: + '[' -z ']'
Mar 11 23:08:04 muryoimpl-T495 dockerd-rootless.sh[12660]: + which vpnkit
Mar 11 23:08:04 muryoimpl-T495 dockerd-rootless.sh[12660]: + net=vpnkit
Mar 11 23:08:04 muryoimpl-T495 dockerd-rootless.sh[12660]: + '[' -z ']'
Mar 11 23:08:04 muryoimpl-T495 dockerd-rootless.sh[12660]: + mtu=1500
Mar 11 23:08:04 muryoimpl-T495 dockerd-rootless.sh[12660]: + '[' -z ']'
Mar 11 23:08:04 muryoimpl-T495 dockerd-rootless.sh[12660]: + _DOCKERD_ROOTLESS_CHILD=1
Mar 11 23:08:04 muryoimpl-T495 dockerd-rootless.sh[12660]: + export _DOCKERD_ROOTLESS_CHILD
Mar 11 23:08:04 muryoimpl-T495 dockerd-rootless.sh[12660]: + exec rootlesskit --net=vpnkit --mtu=1500 --slirp4netns-sandbox=auto --slirp4netns-seccomp=auto --disable-host-loopback --port-driver=builtin --copy-up=/etc --copy-up=/run /home/muryoimpl/bin/dockerd-rootless.sh --experimental --storage-driver=vfs
Client: Docker Engine - Community
 Version:           19.03.7
 API version:       1.40
 Go version:        go1.12.17
 Git commit:        7141c199a2
 Built:             Wed Mar  4 01:19:42 2020
 OS/Arch:           linux/amd64
 Experimental:      false
Server: Docker Engine - Community
 Engine:
  Version:          19.03.7
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       7141c199a2
  Built:            Wed Mar  4 01:19:50 2020
  OS/Arch:          linux/amd64
  Experimental:     true
 containerd:
  Version:          v1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
# Docker binaries are installed in /home/muryoimpl/bin
# WARN: dockerd is not in your current PATH or pointing to /home/muryoimpl/bin/dockerd
# Make sure the following environment variables are set (or add them to ~/.bashrc):\n
export PATH=/home/muryoimpl/bin:$PATH
export DOCKER_HOST=unix:///run/user/1000/docker.sock

#
# To control docker service run:
# systemctl --user (start|stop|restart) docker

docker daemon の自動起動を設定する

インストール後、~/.config/systemd/user/docker.service が配置されるので、systemctl --user enable docker.service すると自動起動すると思いきやされないので、下記を参考に unit ファイルを編集した。

https://qiita.com/yasthon/items/26f943bd5f1b8fab87e0#rootless-docker%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%89%8B%E9%A0%86

https://docs.docker.com/engine/security/rootless/#arch-linux#daemon を参考に、loginctl コマンドも実行しておいた。

$ vim ~/.config/systemd/user/docker.service
[Install]
-WantedBy=multi-user.target
+WantedBy=default.target
$ systemctl --user enable docker.service
$ sudo loginctl enable-linger $(whoami)

遭遇した問題ややり直す方法について

  • curl 時に出る警告 echo "muryoimpl:100000:65536" のとおりに設定しないと、docker.service の起動に失敗したので、素直に従っておくことにした
  • 最初から手順を確認したい、再インストールしたい場合は、~/bin を削除し、export した PATH, DOCKER_HOST をコメントアウト、/etc/subgid, /etc/subuid の値を空にして、curl すると再現できた
  • 元のシステムワイドな docker で動かしていた rails 環境を動かした際、、bootsnap の起動や volume のマウントあたりで権限エラーが発生した。docker image を削除して再度作成することで解消した。Rails.root/tmp の中の cache 等にも旧権限が残っていたりするので削除するなり、owner をユーザにしておくなりしておくとエラーを解消できた