13,009
回編集
92行目: | 92行目: | ||
#: または | #: または | ||
#: <code>sudo SUSEConnect -p sle-module-containers/15/x86_64 ''</code> | #: <code>sudo SUSEConnect -p sle-module-containers/15/x86_64 ''</code> | ||
<br><br> | |||
== Docker Rootlessのインストール == | |||
==== Docker Rootless (ルートレスモード) とは ==== | |||
Docker Rootless (ルートレスモード)は、非スーパーユーザとしてDockerデーモンを実行することができる。<br> | |||
ルートレスモードでは、一般ユーザとしてDockerデーモンとコンテナを実行して、デーモンとコンテナランタイムの潜在的な脆弱性を軽減することができる。<br> | |||
<br> | |||
ルートレスモードは、前提条件さえ満たしていれば、Dockerデーモンのインストール中であってもroot権限を必要としない。<br> | |||
<br> | |||
==== どのように動作するか ==== | |||
ルートレスモードは、Dockerデーモンとコンテナをユーザネーム空間内で実行する。<br> | |||
これは、userns-remapモードとよく似ているが、<br> | |||
userns-remapモードではデーモン自体がスーパーユーザ権限で実行されるのに対して、ルートレスモードではデーモンとコンテナの両方が一般ユーザ権限として実行される。<br> | |||
<br> | |||
ルートレスモードでは、SETUIDビットやファイル機能を持つバイナリを使用しない。<br> | |||
ただし、newuidmapとnewgidmapは、ユーザ名前空間で複数のUID/GIDを使用できるようにするために必要である。<br> | |||
<br> | |||
==== 前提条件 ==== | |||
ホストにnewuidmapとnewgidmapをインストールする必要がある。<br> | |||
これらのコマンドは、ほぼ全てのLinuxディストリビューションのuidmapパッケージで提供されている。<br> | |||
<br> | |||
/etc/subuidおよび/etc/subgidには、ユーザの下位UID / GIDが少なくとも65536個含まれていなければならない。<br> | |||
# 実行ユーザIDの確認 | |||
id -u | |||
# 実行ユーザ名の確認 | |||
whoami | |||
# 実行ユーザのSubUIDの確認 | |||
grep ^$(whoami): /etc/subuid | |||
# 実行ユーザのSubGIDの確認 | |||
grep ^$(whoami): /etc/subgid | |||
<br> | |||
また、fuse-overlayfsパッケージのインストールを推奨する。<br> | |||
# RHEL | |||
sudo dnf install fuse-overlayfs iptables | |||
# SUSE | |||
sudo zypper install fuse-overlayfs | |||
sudo modprobe ip_tables iptable_mangle iptable_nat iptable_filter | |||
<br> | |||
==== 制限事項 ==== | |||
* 以下のストレージドライバのみがサポートされている。 | |||
*: overlay2 (Linuxカーネル 5.11以降) | |||
*: fuse-overlayfs (Linuxカーネル 4.18以降、かつ、fuse-overlayfsがインストールされている場合のみ) | |||
*: btrfs (Linuxカーネル4.18以降で動作している、または、~/.local/share/dockerがuser_subvol_rm_allowedマウントオプションでマウントされている場合のみ) | |||
*: vfs | |||
*: <br> | |||
* Cgroupは、cgroup v2とsystemdで実行している場合のみサポートされる。 | |||
*: <br> | |||
* 以下の機能はサポートされない。 | |||
*: AppArmor | |||
*: チェックポイント | |||
*: オーバーレイネットワーク | |||
*: SCTPポートの公開 | |||
*: <br> | |||
* <code>ping</code>コマンドを使用する場合は、pingパケットのルーティングを参照すること。 | |||
* 特権TCP / UDPポート (1024番以下のポート) を公開する場合は、特権ポートの公開を参照すること。 | |||
* <code>docker inspect</code>コマンドで表示されるIPアドレスは、RootlessKitのネットワーク名前空間内に名前空間が存在する。<br>これは、IPアドレスがネットワーク名前空間にnsenterせずにホストから到達できないことを意味する。 | |||
* ホストのネットワーク (<code>docker run --net=<ホスト名></code>) も、RootlessKitの名前空間内に存在する。 | |||
* Dockerの"data-root"としてのNFSマウントはサポートされない。<br>この制限は、ルートレスモード特有のものではない。 | |||
<br> | |||
==== Docker Rootlessの初期設定 ==== | |||
一般ユーザとして、Docker Rootlessデーモンを設定する。<br> | |||
dockerd-rootless-setuptool.sh install | |||
<br> | |||
この時、~/.bashrcファイルに環境変数<code>PATH</code>および<code>DOCKER_HOST</code>が自動的に追記される。<br> | |||
<syntaxhighlight lang="bash"> | |||
export PATH=/usr/bin:$PATH | |||
export DOCKER_HOST=unix:///run/user/1000/docker.sock | |||
</syntaxhighlight> | |||
<br> | |||
もし、dockerd-rootless-setuptool.shファイルが存在しない場合、docker-ce-rootless-extrasパッケージを手動でインストールする必要がある。<br> | |||
sudo zypper install docker-ce-rootless-extras | |||
<br> | |||
==== Docker Rootlessのアンインストール ==== | |||
まず、Dockerデーモンのsystemdサービスを削除する場合、以下に示すコマンドを実行する。<br> | |||
dockerd-rootless-setuptool.sh uninstall | |||
<br> | |||
次に、~/.bashrcファイル内の環境変数<code>PATH</code>と<code>DOCKER_HOST</code>が追記されている場合は、設定を削除する。<br> | |||
<br> | |||
Docker Rootlessのデータディレクトリを削除する場合は、以下に示すコマンドを実行する。<br> | |||
rootlesskit rm -rf ~/.local/share/docker | |||
<br> | |||
もし、パッケージ管理システムからdocker-ce-rootless-extrasパッケージをインストールしている場合は削除する。<br> | |||
sudo zypper remove docker-ce-rootless-extras | |||
<br> | |||
最後に、Docker Rootlessの実行バイナリを削除する。<br> | |||
cd ~/bin | |||
rm -f containerd containerd-shim containerd-shim-runc-v2 ctr \ | |||
docker docker-init docker-proxy dockerd dockerd-rootless-setuptool.sh dockerd-rootless.sh \ | |||
rootlesskit rootlesskit-docker-proxy runc vpnkit | |||
<br> | |||
==== Docker Rootlessの実行 ==== | |||
Systemdサービスユニットは、~/.config/systemd/user/docker.serviceとしてインストールされる。<br> | |||
<br> | |||
Docker Rootlessを起動する。<br> | |||
systemctl --user start docker | |||
<br> | |||
システム起動時にDocker Rootlessデーモンを起動する場合は、Systemdサービスユニットとlingeringを有効にする。<br> | |||
systemctl --user enable docker | |||
sudo loginctl enable-linger $(whoami) | |||
<br> | |||
<u>※注意</u><br> | |||
<u>Docker Rootlessをシステム全体(/etc/systemd/system/docker.service)として起動することは、User=ディレクティブを使用してもサポートされていないことに注意する。</u><br> | |||
<br> | |||
クライアントにおいて、ソケットパス、または、CLIコンテキストのいずれかを明示的に指定する必要がある。<br> | |||
export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock | |||
docker run -d -p 8080:80 nginx | |||
<br> | |||
クライアントにおいて、CLIコンテキストを指定する。<br> | |||
docker context use rootless | |||
docker run -d -p 8080:80 nginx | |||
<br> | |||
==== 注意 ==== | |||
===== DockerとDocker Rootlessの共存 ===== | |||
システム全体のDockerデーモンが既に起動している場合は、無効にする必要がある。<br> | |||
sudo systemctl disable docker.service docker.socket | |||
<br> | |||
===== ディレクトリパス ===== | |||
Docker Rootlessソケットのパスは、$XDG_RUNTIME_DIR/docker.sockに設定されている。<br> | |||
(環境変数<code>XDG_RUNTIME_DIR</code>は、通常、/run/user/$UIDディレクトリに設定されている)<br> | |||
<br> | |||
データディレクトリは、~/.local/share/dockerに設定されている。<br> | |||
また、データディレクトリはNFS上であってはならない。<br> | |||
<br> | |||
デーモン設定ディレクトリは、~/.config/dockerディレクトリに設定されている。<br> | |||
このディレクトリは、クライアントが使用する~/.dockerとは異なることに注意する。<br> | |||
<br><br> | <br><br> | ||