複雑なソフトを収容するのに便利なDockerですが、こいつは色々rootで動くのでデフォルトの状態だとhtopのUSERの部分がrootまみれになったり、他にもネットワークのインターフェイスが大量生成されたりnftablesのルールが競合しまくったりと諸問題を引き起こしがちです。
そんなあなたにDockerをユーザー権限でしかもホストネットワークへの影響なしで動かせるrootless-dockerという技術のご紹介です。
補足: ホストネットワークモードの危険性
ネットワーク周りの問題を何とかする解決策としてホストネットワークモードを使うという方法が紹介されていますが、これには致命的なセキュリティリスクがあるのであまりおすすめしません。
導入方法
下準備
Ubuntuの場合です。また予めこの方法で普通にDockerを入れていることが前提です。
sudo apt-get install uidmap
sudo systemctl disable --now containerd
sudo systemctl disable --now docker
sudo systemctl disable --now docker.socket
sudo adduser compose --disabled-password --home /var/compose
# 以降1001は作成したcomposeユーザーのUIDに置き換えてください
sudo loginctl enable-linger 1001
sudo su compose
環境変数の設定
以下2つのファイルに適当に追記します。書き終えたら適用するために一旦ログアウトするかsourceしてください。
~/.profile
export XDG_RUNTIME_DIR=/run/user/1001
export PATH=/usr/bin:$PATH
export DOCKER_HOST=unix:///run/user/1001/docker.sock
~/.bashrc
export XDG_RUNTIME_DIR=/run/user/1001
export PATH=/usr/bin:$PATH
export DOCKER_HOST=unix:///run/user/1001/docker.sock
rootless dockerのインストール
コマンド一つで完結します
dockerd-rootless-setuptool.sh install
# エラーが出なかったらOK
docker run hello-world
Done!
これでokです。普通のDockerと同じように使えます。 ボリュームのパーミッション問題に遭遇した場合、htopなりでプロセスが動いてるUIDを見つけてchownでそのUIDに設定してあげるのが確実です。
技術的なあれ
自分も詳しく分かっていませんが、ホストマシンにブリッジを作ったり直接nftablesを触ったりする通常のDockerと異なり、Rootless DockerはLinuxカーネルに備わっている network namespace という機能を利用してネットワーク周りを完全にホストと分離しているそうです。ホストマシンとの橋渡しはslirp4netnsというソフトが行っているという話でした。色々弄られるよりある意味でシンプルでこっちのほうが私は好きです。