隔離された環境(chroot 環境)を用いた Docker ベースイメージの作成(Ubuntu 上)
【概要】Ubuntu の隔離環境(chroot 環境)を debootstrap で構築し、それを Docker のベースイメージとして取り込む手順を解説する。debootstrap は指定したディレクトリに最小構成の Ubuntu システムを展開するツールであり、chroot はそのディレクトリをルートディレクトリとして扱うことで、ホスト OS から隔離された環境を作る仕組みである。
【メリット】chroot 環境を用いることで、ホスト OS に影響を与えずに独立した環境を構築できる。さらにこの環境を Docker ベースイメージにすることで、必要なパッケージだけを含む軽量なカスタムイメージを作成できる。
【目次】
chroot(change root)は、特定のディレクトリをルートディレクトリとして扱い、その中でプロセスを実行する仕組みである。これにより、ホスト OS から隔離された環境を作成できる。
debootstrap は、Debian 系ディストリビューション(Ubuntu を含む)の最小構成システムを、任意のディレクトリに構築するツールである。
前準備
Ubuntu のシステム更新
Ubuntu でシステムを最新の状態に更新する。
# パッケージリストの情報を更新
sudo apt update
# インストール済みのパッケージを更新(依存関係も考慮)
sudo apt full-upgrade
# 変更をシステム全体に反映させるために再起動
sudo shutdown -r now
Ubuntu の隔離された環境(chroot 環境)の作成(debootstrap を使用)
- 必要なパッケージのインストール
debootstrap は最小構成システムを構築するツール、schroot は chroot 環境を扱うための補助ツールである。
# パッケージリストの情報を更新 sudo apt update sudo apt -y install debootstrap schroot
- chroot 環境の構築
環境設定の詳細は次のとおりである。
- システムアーキテクチャ: amd64(64 ビット x86 アーキテクチャ)
- Ubuntu バージョン: Ubuntu 22.04(jammy)
- 環境構築先: /home/ubuntu2204
- インストールバリアント: buildd(必須パッケージに加え、ビルドに必要な build-essential を含む構成)
次のコマンドは、構築先を作り直したうえで debootstrap を実行する。
--includeで、後の手順で使う証明書・apt・wget・sudo をあらかじめ追加している。インストールが完了するまでに時間を要する。sudo rm -rf /home/ubuntu2204 sudo mkdir /home/ubuntu2204 sudo debootstrap --arch amd64 --variant buildd --include=ca-certificates,apt,wget,sudo jammy /home/ubuntu2204 http://jp.archive.ubuntu.com/ubuntu
- インストール完了の確認
- 基本動作の確認
chroot で環境に入り、
uname -aでシステム情報を表示して動作を確かめ、exitで抜ける。sudo chroot /home/ubuntu2204 bash uname -a exit
- APT ソースリストの設定
ホストの APT ソースリスト(取得元リポジトリを記したファイル)を chroot 環境にコピーする。
sudo cp /etc/apt/sources.list /home/ubuntu2204/etc/apt/sources.list注意: ホストの Ubuntu バージョンと chroot 環境のバージョンが異なる場合、sources.list の内容を chroot 環境のバージョンに合わせて編集する必要がある。バージョンが一致しないと、パッケージの取得に失敗することがある。
- procfs の設定
procfs(プロセスファイルシステム)は、カーネルやプロセスの情報を提供する仮想ファイルシステムである。chroot 環境で ps コマンドなどのプロセス管理コマンドを使うために、この設定が必要となる。
chroot 環境の fstab(マウント設定を記したファイル)である /home/ubuntu2204/etc/fstab に、次の行を追記する。
echo "proc /proc proc defaults 0 0" | sudo tee -a /home/ubuntu2204/etc/fstab
- procfs の動作確認
chroot 環境に入って /proc をマウントし、ps コマンドでプロセス情報が表示されることを確認する。
sudo chroot /home/ubuntu2204 bash mount /proc ps exit
ps -auxコマンドで、より詳細なプロセス情報を確認できる。 - 開発環境の動作確認
nano エディタのインストールと、C 言語プログラムのコンパイル・実行により、環境が動作することを確認する。
- chroot 環境への移行
sudo chroot /home/ubuntu2204 uname -a
- テキストエディタのインストール
apt install nano
- テストプログラムの作成
エディタを使い、次のコードを「/tmp/hello.c」として保存する。このプログラムは文字列を表示し、続けて size_t 型のバイト数を表示する。
#include<stdio.h> int main() { printf("Hello,World!\n"); printf("sizeof(size_t)=%ld\n", sizeof(size_t)); return 0; }
- プログラムのビルドと実行
cd /tmp gcc -o a.out hello.c ./a.out
- 環境の終了
exit
- chroot 環境への移行
Docker ベースイメージの作成
事前に Docker のインストールが必要である。インストール手順は「別のページ」を参照すること。
- ベースイメージの作成
chroot 環境を tar アーカイブにまとめ、Docker に取り込む。
docker importは、ルートファイルシステムを含む tar アーカイブからベースイメージを作成するコマンドである。「ubuntu2204:base」は、作成するイメージの識別子(イメージ名:タグ)として使う。注意: tar アーカイブを作る前に、chroot 環境内でマウントした procfs を必ずアンマウントする。アンマウントせずにアーカイブすると、プロセス情報の仮想ファイルがイメージに含まれてしまう。
cd /home/ubuntu2204 sudo chroot /home/ubuntu2204 bash umount /proc exit sudo tar -cpzf ../ubuntu2204.tar.gz . docker import ../ubuntu2204.tar.gz ubuntu2204:base
- イメージの動作確認
作成したイメージからコンテナを起動し、動作を確認する。
docker run -it ubuntu2204:base /bin/bash exit