Docker rootlessモード導入手順書
背景
Dockerはアプリケーションや開発環境のホスト方法として有用であるが、Dockerデーモンはroot権限と同等の権限で動作するため、Dockerデーモンに脆弱性があった場合や、コンテナアプリケーションからDockerデーモンにアクセスできるような脆弱性があった場合、Dockerデーモンをホストするサーバー自体が危険にさらされる。 Dockerのaptリポジトリを追加する。
1. 次のシェルスクリプトを実行する。
code:sh
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
Docker、Docker関連パッケージ、rootlessモードに必須のパッケージをインストールする。
1. 次のコマンドを実行する。
$ sudo apt install docker-ce docker-ce-cli docker-ce-rootless-extras containerd.io docker-buildx-plugin docker-compose-plugin uidmap
rootlessモードをインストールする。
1. rootfullモードのデーモンを停止し、自動起動を無効化する。
$ sudo systemctl disable --now docker.service docker.socket
2. rootlessモードをインストールする
$ dockerd-rootless-setuptool.sh install
3. rootlessモードのデーモンを起動し、自動起動を有効化する。
$ systemctl --user start docker
$ systemctl --user enable docker
$ sudo loginctl enable-linger $(whoami)
1. 特権ポートを公開できるようにカーネルパラメータを書き換える。
code:/etc/sysctl.d/99-sysctl.conf
net.ipv4.ip_unprivileged_port_start=0
2. 書き換えた設定を反映する。
$ sudo sysctl --system
正常な場合、出力に* Applying /etc/sysctl.d/99-sysctl.conf ... net.ipv4.ip_unprivileged_port_start = 0が含まれている。
1. Dockerデーモンの設定ファイルを書き換えて、ログをjournaldに記録するようにする。 code:~/.config/docker/daemon.json
{
"log-driver": "journald",
"log-opts": {
"tag": "{{.Name}}"
}
}
rootlessモードの場合はポートドライバーをslirp4netnsに変更することでSource IPが保持される。 1. ポートドライバーを変更する。
code:~/.config/systemd/user/docker.service.d/override.conf
Environment="DOCKERD_ROOTLESS_ROOTLESSKIT_PORT_DRIVER=slirp4netns"
参考: rootlessモードでない通常のDockerデーモンの場合は、ユーザーランドプロキシを無効化することで、Source IPが保持される。
code:/etc/docker/daemon.json
{
"userland-proxy": false
}
参考にした資料
最後にDockerデーモンを再起動する。
$ systemctl --user restart docker
$ systemctl --user reenable docker
参考にした資料
Source IPを書き換えないようにすることについては「docker run -p does not propagate source IP addresses」の項を参照