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

【概要】Ubuntuの隔離環境(chroot環境)をdebootstrapで構築し、Dockerベースイメージとして作成する手順を解説する。

【メリット】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. 必要なパッケージのインストール
    # パッケージリストの情報を更新
    sudo apt update
    sudo apt -y install debootstrap schroot
    
    debootstrapとschrootのインストール画面
  2. 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
    
    debootstrapによる環境構築の実行画面
  3. インストール完了の確認
    インストール完了画面
  4. 基本動作の確認
    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の内容を適切に編集する必要がある。バージョンが一致しない場合、パッケージの取得に失敗する可能性がある。

  6. procfsの設定

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

    /home/ubuntu2204/etc/fstabに以下の行を追記する。

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

    以下のコマンドでプロセス情報が表示されることを確認する。

    sudo chroot /home/ubuntu2204 bash
    sudo 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」として保存する。

      #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にインポートする。「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ベースイメージの作成画面
  2. イメージの動作確認

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

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