Arch Linux で rootless docker を設定した
何点か躓いたので しておく。
https://docs.docker.com/engine/security/rootless/ の手順を参考に rootless docker を設定していった。
前提
https://docs.docker.com/engine/security/rootless/#arch-linux#prerequisites を確認した。
newuidmap
と newgidmap
コマンドはインストールされていた。
/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://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 をユーザにしておくなりしておくとエラーを解消できた