隔離された環境(chroot 環境)を用いた Docker ベースイメージの作成(Ubuntu 上)
【メリット】chroot環境を用いることで、ホストOSに影響を与えずに独立した開発環境を構築できる。また、この環境からDockerベースイメージを作成することで、必要最小限のパッケージのみを含む軽量なカスタムイメージを作成できる。
【目次】
debootstrapは、Debian系ディストリビューション(Ubuntu含む)の最小構成システムを任意のディレクトリに構築するツールである。
前準備
Ubuntu のシステム更新
Ubuntuでシステムを最新の状態に更新する。
# パッケージリストの情報を更新
sudo apt update
# インストール済みのパッケージを包括的に更新 (依存関係も考慮)
sudo apt full-upgrade
# 変更をシステム全体に確実に反映させるために再起動
sudo shutdown -r now
Ubuntu の隔離された環境(chroot 環境)の作成(debootstrap を使用)
- 必要なパッケージのインストール
# パッケージリストの情報を更新 sudo apt update sudo apt -y install debootstrap schroot
- chroot環境の構築
環境設定の詳細は以下のとおりである。
- システムアーキテクチャ: amd64(64ビットx86アーキテクチャ)
- Ubuntuバージョン: Ubuntu 22.04 (jammy)
- 環境構築先: /home/ubuntu2204
- インストールバリアント: buildd(パッケージビルドに必要な基本ツールを含む最小構成)
インストールが完了するまでに時間を要する。
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
- インストール完了の確認
- 基本動作の確認
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の内容を適切に編集する必要がある。バージョンが一致しない場合、パッケージの取得に失敗する可能性がある。 - procfsの設定
procfs(プロセスファイルシステム)は、カーネルやプロセスの情報を提供する仮想ファイルシステムである。chroot環境でpsコマンドなどのプロセス管理コマンドを使用するために設定が必要となる。
/home/ubuntu2204/etc/fstabに以下の行を追記する。
echo "proc /proc proc defaults 0 0" | sudo tee -a /home/ubuntu2204/etc/fstab
- procfsの動作確認
以下のコマンドでプロセス情報が表示されることを確認する。
sudo chroot /home/ubuntu2204 bash sudo mount /proc ps exit
ps -auxコマンドで詳細なプロセス情報を確認できる。
- 開発環境の動作確認
nanoエディタのインストールとC言語プログラムのコンパイル・実行により、環境の動作を確認する。
- chroot環境への移行
sudo chroot /home/ubuntu2204 uname -a
- テキストエディタのインストール
apt install nano
- テストプログラムの作成
エディタを使用して、以下のコードを「/tmp/hello.c」として保存する。
#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 ベースイメージの作成
- ベースイメージの作成
chroot環境をtarアーカイブ化し、Dockerにインポートする。「ubuntu2204:base」はイメージの識別子(イメージ名:タグ)として使用する。
注意: tarアーカイブ作成前に、chroot環境内でマウントしたprocfsを必ずアンマウントする。アンマウントせずにアーカイブすると、ホストのプロセス情報がイメージに含まれる可能性がある。
cd /home/ubuntu2204 sudo chroot /home/ubuntu2204 bash sudo umount /proc exit sudo tar -cpzf ../ubuntu2204.tar.gz . docker import ../ubuntu2204.tar.gz ubuntu2204:base
- イメージの動作確認
作成したイメージからコンテナを起動し、動作を確認する。
docker run -it ubuntu2204:base /bin/bash exit