LXDコンテナー内でRootless Dockerを動かす

環境

ホストOS: Ubuntu 24.04 LTS

LXDのバージョン: LXD 5.21 LTS

LXDコンテナーのセキュリティ設定

  • Nesting (Containers only) or security.nesting: コンテナー内でのコンテナー(ネスト)の実行を許可するかどうか
    Allow or trueに設定
    Dockerを動かすために必要
  • Idmap size (Containers only) or security.idmap.size: 使用するIDマップのサイズ
    コンテナー内のユーザ数によって設定する値が変動する

    以降、標準のUbuntu 24.04イメージで説明する
    デフォルトではubuntuという一般ユーザが作られているが、今回は新たな一般ユーザを作成することにする
    詳しいことは省くが、Dockerに割り当てるUIDが65536個必要なため、設定変更しないとUIDが不足する
    ユーザー名前空間の開始UIDは100000、そこから各ユーザに65536個割り当てるため、100000 + 65536 × ユーザ数個のUIDが必要になる
    今回だと、ubunturunnerユーザが存在するため、231072個の割り当てが必要になる
    自分の環境では231072に設定
  • Unique idmap (Containers only) or security.idmap.isolated: 一意のIDマップを使用するかどうか
    Yes or trueに設定
    セキュリティが向上する

Dockerのインストール

公式ドキュメントの手順に従ってインストールしている前提で進める

Jumpstart your client-side server applications with Docker Engine on Ubuntu. Thi…
docs.docker.com

Rootless Dockerのセットアップ

ここからの作業はLXDコンテナー内で行う

あらかじめDockerを実行したいユーザを作成しておく

1. 準備

uidmapのインストール、Rootful Dockerの無効化、systemdのユーザインスタンスを自動起動

Bash
sudo apt install uidmap
sudo systemctl disable --now containerd
sudo systemctl disable --now docker
sudo systemctl disable --now docker.socket
sudo loginctl enable-linger {ユーザID}

2. 環境変数の設定

Dockerを動かしたいユーザにログインする

ログイン後、~/.profile~/.bashrcなどに下記内容を追記する

Bash
export XDG_RUNTIME_DIR=/run/user/{ユーザID}
export PATH=/usr/bin:$PATH
export DOCKER_HOST=unix:///run/user/{ユーザID}/docker.sock

3. Rootless Dockerのインストール

Dockerを動かしたいユーザにログインする

Bash
dockerd-rootless-setuptool.sh install

4. 実行テスト

Bash
docker run hello-world

ここでエラーが出なければ成功