隔離された環境(chroot 環境)を用いた Docker ベースイメージの作成(Ubuntu 上)

【概要】Ubuntu の隔離環境(chroot 環境)を debootstrap で構築し、それを Docker のベースイメージとして取り込む手順を解説する。debootstrap は指定したディレクトリに最小構成の Ubuntu システムを展開するツールであり、chroot はそのディレクトリをルートディレクトリとして扱うことで、ホスト OS から隔離された環境を作る仕組みである。

【メリット】chroot 環境を用いることで、ホスト OS に影響を与えずに独立した環境を構築できる。さらにこの環境を Docker ベースイメージにすることで、必要なパッケージだけを含む軽量なカスタムイメージを作成できる。

【目次】

  1. 前準備
  2. Ubuntu の隔離された環境(chroot 環境)の作成(debootstrap を使用)
  3. Docker ベースイメージの作成

chroot(change root)は、特定のディレクトリをルートディレクトリとして扱い、その中でプロセスを実行する仕組みである。これにより、ホスト OS から隔離された環境を作成できる。

debootstrap は、Debian 系ディストリビューション(Ubuntu を含む)の最小構成システムを、任意のディレクトリに構築するツールである。

前準備

Ubuntu のシステム更新

Ubuntu でシステムを最新の状態に更新する。

Ubuntu のインストール手順は別ページ »に記載

# パッケージリストの情報を更新
sudo apt update
# インストール済みのパッケージを更新(依存関係も考慮)
sudo apt full-upgrade
# 変更をシステム全体に反映させるために再起動
sudo shutdown -r now

Ubuntu の隔離された環境(chroot 環境)の作成(debootstrap を使用)

  1. 必要なパッケージのインストール

    debootstrap は最小構成システムを構築するツール、schroot は chroot 環境を扱うための補助ツールである。

    # パッケージリストの情報を更新
    sudo apt update
    sudo apt -y install debootstrap schroot
    
    debootstrapとschrootのインストール画面
  2. 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
    
    debootstrapによる環境構築の実行画面
  3. インストール完了の確認
    インストール完了画面
  4. 基本動作の確認

    chroot で環境に入り、uname -a でシステム情報を表示して動作を確かめ、exit で抜ける。

    sudo chroot /home/ubuntu2204 bash
    uname -a
    exit
    
    chroot環境での基本動作確認画面
  5. APT ソースリストの設定

    ホストの APT ソースリスト(取得元リポジトリを記したファイル)を chroot 環境にコピーする。

    sudo cp /etc/apt/sources.list /home/ubuntu2204/etc/apt/sources.list
    

    注意: ホストの Ubuntu バージョンと chroot 環境のバージョンが異なる場合、sources.list の内容を chroot 環境のバージョンに合わせて編集する必要がある。バージョンが一致しないと、パッケージの取得に失敗することがある。

  6. procfs の設定

    procfs(プロセスファイルシステム)は、カーネルやプロセスの情報を提供する仮想ファイルシステムである。chroot 環境で ps コマンドなどのプロセス管理コマンドを使うために、この設定が必要となる。

    chroot 環境の fstab(マウント設定を記したファイル)である /home/ubuntu2204/etc/fstab に、次の行を追記する。

    echo "proc /proc proc defaults 0 0" | sudo tee -a /home/ubuntu2204/etc/fstab
    
    fstabへのprocfs設定追記画面
  7. procfs の動作確認

    chroot 環境に入って /proc をマウントし、ps コマンドでプロセス情報が表示されることを確認する。

    sudo chroot /home/ubuntu2204 bash
    mount /proc
    ps
    exit
    
    procfsの動作確認画面

    ps -aux コマンドで、より詳細なプロセス情報を確認できる。

  8. 開発環境の動作確認

    nano エディタのインストールと、C 言語プログラムのコンパイル・実行により、環境が動作することを確認する。

    1. chroot 環境への移行
      sudo chroot /home/ubuntu2204
      uname -a
      
      chroot環境への移行画面
    2. テキストエディタのインストール
      apt install nano
      
      nanoエディタのインストール画面
    3. テストプログラムの作成

      エディタを使い、次のコードを「/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;
      }
      
      hello.cの作成画面1
      hello.cの作成画面2
    4. プログラムのビルドと実行
      cd /tmp
      gcc -o a.out hello.c
      ./a.out
      
      プログラムのビルドと実行結果画面
    5. 環境の終了
      exit
      
      chroot環境からの終了画面

Docker ベースイメージの作成

事前に Docker のインストールが必要である。インストール手順は「別のページ」を参照すること。

  1. ベースイメージの作成

    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ベースイメージの作成画面
  2. イメージの動作確認

    作成したイメージからコンテナを起動し、動作を確認する。

    docker run -it ubuntu2204:base /bin/bash
    exit
    
    Dockerコンテナの動作確認画面