カスタム Docker イメージの作成

DockerBeginner
オンラインで実践に進む

はじめに

Docker は、アプリケーションをコンテナとしてパッケージ化し、配布するための強力なツールです。このプロセスの核となるのが Docker イメージです。これは、コード、依存関係、設定など、アプリケーションの実行に必要なすべてを含む、構築済みのパッケージです。この実験では、追加のソフトウェア、ライブラリ、または設定を組み込むことで、アプリケーションを強化するカスタム Docker イメージの作成方法を学びます。

この実験全体を通して、ファイルの編集には WebIDE (VS Code) を使用します。WebIDE は、ファイル編集のための使い慣れたユーザーフレンドリーなインターフェースを提供し、設定ファイルやコードの操作を容易にします。

プロジェクト環境のセットアップ

まずは、プロジェクトディレクトリを作成し、そこに移動することから始めましょう。

この実験全体を通して、ファイルの編集には WebIDE (VS Code) を使用します。WebIDE は、ファイル編集のための使い慣れたユーザーフレンドリーなインターフェースを提供し、設定ファイルやコードの操作を容易にします。

  1. WebIDE でターミナルを開きます。上部メニューの「Terminal」をクリックし、「New Terminal」を選択することで開けます。
  2. ターミナルで、以下のコマンドを実行します。
mkdir -p ~/project/docker
cd ~/project/docker
プロジェクトディレクトリ作成コマンドを表示するターミナル

これにより、~/project フォルダ内に docker という新しいディレクトリが作成され、現在の作業ディレクトリがそこに移動します。

  1. 正しいディレクトリにいることを確認します。
pwd

出力として /home/labex/project/docker と表示されるはずです。

コマンドの解説:

  • mkdir -p: ディレクトリを作成するコマンドです。-p フラグは、親ディレクトリが存在しない場合にそれらも同時に作成します。
  • cd: 現在のディレクトリを変更するコマンドです。
  • pwd: 現在の作業ディレクトリを表示するコマンドです。

シンプルな Docker イメージの作成

次に、Nginx ウェブサーバーを実行するシンプルな Docker イメージを作成しましょう。

  1. WebIDE で、ファイルエクスプローラー(通常は左サイドバーの最初のアイコン)に移動します。
  2. ファイルエクスプローラーのペインで右クリックし、「New File」を選択します。名前を Dockerfile にします(先頭の 'D' は大文字で、拡張子は付けません)。
  3. ファイルエクスプローラーで Dockerfile をクリックして開きます。以下の内容を追加します。
FROM nginx
COPY index.html /usr/share/nginx/html/

この Dockerfile は、公式の Nginx イメージをベースにした新しいイメージを定義し、index.html というファイルを Nginx のデフォルトのドキュメントルートディレクトリにコピーします。

Dockerfile の解説:

  • FROM nginx: ビルドのベースとなるイメージを指定します。ここでは公式の Nginx イメージを使用しています。
  • COPY index.html /usr/share/nginx/html/: ローカルの index.html ファイルをコンテナ内のウェブルートディレクトリにコピーします。
  1. 同じディレクトリに index.html という名前の新しいファイルを作成します。ファイルエクスプローラーで再度右クリックし、「New File」を選択して作成できます。
  2. index.html を開き、以下の内容を追加します。
<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Hello Docker!</title>
  </head>
  <body>
    <h1>Hello Docker!</h1>
    <p>This is a custom Docker image.</p>
  </body>
</html>

これは、Nginx サーバーによって配信されるシンプルな HTML ページです。

  1. WebIDE のターミナルを開き(前のものを閉じた場合は Terminal -> New Terminal)、以下のコマンドを使用して Docker イメージをビルドします。
docker build -t my-nginx .

このコマンドは、my-nginx というタグ(名前)を付けて新しい Docker イメージをビルドします。

コマンドの解説:

  • docker build: Docker イメージをビルドするためのコマンドです。
  • -t my-nginx: -t フラグは、イメージに my-nginx という名前のタグを付けます。
  • .: ビルドコンテキスト(Dockerfile が含まれるディレクトリ)として現在のディレクトリを指定します。
  1. ビルドが完了したら、イメージが正常に作成されたことを確認します。
docker images

出力に my-nginx イメージが表示されているはずです。

カスタムイメージの実行とテスト

新しいイメージに基づいてコンテナを実行し、テストしてみましょう。

  1. WebIDE のターミナルで、以下のコマンドを使用してコンテナを起動します。
docker run -d -p 8080:80 --name my-nginx-container my-nginx

コマンドの解説:

  • docker run: 新しいコンテナを作成して起動します。
  • -d: コンテナをデタッチモード(バックグラウンド)で実行します。
  • -p 8080:80: ホストのポート 8080 をコンテナのポート 80 にマッピングします。
  • --name my-nginx-container: コンテナに名前を割り当てます。
  • my-nginx: コンテナの作成に使用するイメージの名前です。
  1. コンテナが実行中であることを確認します。
docker ps

出力に my-nginx-container が表示されるはずです。このコマンドは、実行中のすべてのコンテナを表示します。

  1. ウェブページの内容を確認するには、curl コマンドを使用します。
curl http://localhost:8080

ターミナルに index.html ファイルの HTML 内容が表示されるはずです。

curl について補足すると、これはサーバーとの間でデータを転送するためのツールです。ここでは、ウェブサーバーからコンテンツを取得するために使用しています。

また、LabEx VM の上部にある「+」をクリックして新しいウェブサーバーを作成し、ポート 8080 を入力して内容を確認することもできます。

ウェブサーバーポートの設定

イメージへのカスタムソフトウェアの追加

次に、追加のソフトウェアを含めるように Docker イメージを修正しましょう。例として curl ユーティリティを追加します。

  1. WebIDE で Dockerfile を開きます。ファイルエクスプローラーペインで Dockerfile をクリックします。
  2. Dockerfile の内容を以下のように変更します。
FROM nginx
RUN apt-get update && apt-get install -y curl
COPY index.html /usr/share/nginx/html/

この Dockerfile には、パッケージインデックスを更新し、apt-get パッケージマネージャーを使用して curl ユーティリティをインストールする新しい RUN 命令が追加されています。

新しい行の解説:

  • RUN apt-get update && apt-get install -y curl: パッケージリストを更新し(apt-get update)、続いて curl をインストールします(apt-get install -y curl)。-y フラグは、インストール中の確認プロンプトに対して自動的に「yes」と回答します。
  1. WebIDE で Ctrl+S(Mac の場合は Cmd+S)を押してファイルを保存します。
  2. WebIDE のターミナルで、新しいタグを付けて Docker イメージを再ビルドします。
docker build -t my-nginx-curl .

このコマンドは、curl ユーティリティを含む my-nginx-curl というタグの新しい Docker イメージをビルドします。

  1. 新しいイメージが作成されたことを確認します。
docker images

出力に my-nginx-curl イメージが表示されているはずです。

Curl を使用したカスタムイメージのテスト

新しいイメージに基づいてコンテナを実行し、curl ユーティリティをテストしてみましょう。

  1. WebIDE のターミナルで、以下のコマンドを使用して新しいコンテナを起動します。
docker run -d --name curl-container my-nginx-curl

このコマンドは、my-nginx-curl イメージに基づいて新しいコンテナを起動し、curl-container と名前を付けます。

  1. 実行中のコンテナ内で bash シェルを実行します。
docker exec -it curl-container bash

このコマンドは、実行中のコンテナ内で対話型の bash シェルを開きます。

コマンドの解説:

  • docker exec: 実行中のコンテナ内でコマンドを実行します。
  • -it: これらのフラグは疑似 TTY を割り当て、標準入力(STDIN)を開いたままにすることで、シェルとの対話を可能にします。
  • curl-container: 操作対象のコンテナ名です。
  • bash: コンテナ内で実行するコマンド(bash シェルの起動)です。
  1. プロンプトが変わり、コンテナ内にいることが示されます。コンテナ内で curl ユーティリティをテストします。
curl http://localhost

ターミナルに index.html ファイルの HTML 内容が表示されるはずです。

  1. コンテナの bash シェルを終了します。
exit

これでホストシステムのシェルに戻ります。

イメージでの環境変数の使用

このステップでは、カスタマイズのために環境変数を使用するように Docker イメージを修正します。

  1. WebIDE で、再び Dockerfile を開きます。

  2. Dockerfile の内容を以下のように変更します。

FROM nginx
ENV NGINX_PORT 9000
RUN sed -i "s/listen[[:space:]]*80;/listen $NGINX_PORT;/g" /etc/nginx/conf.d/default.conf
COPY index.html /usr/share/nginx/html/

この Dockerfile は、NGINX_PORT 変数を 9000 に設定する ENV 命令を追加しています。また、このポートを使用するように Nginx の設定を書き換える RUN 命令も含まれています。

新しい行の解説:

  • ENV NGINX_PORT 9000: 環境変数 NGINX_PORT を値 9000 で設定します。
  • RUN sed -i "s/listen[[:space:]]*80;/listen $NGINX_PORT;/g" /etc/nginx/conf.d/default.conf: sed を使用して、Nginx 設定ファイル内のデフォルトポート(80)を環境変数の値に置換します。
  1. WebIDE でファイルを保存します。

  2. WebIDE のターミナルで、新しいタグを付けて Docker イメージを再ビルドします。

docker build -t my-nginx-env .
  1. 新しいイメージに基づいてコンテナを実行します。
docker run -d -p 9000:9000 --name env-container my-nginx-env

このコマンドは、my-nginx-env イメージに基づいて新しいコンテナを起動し、ホストのポート 9000 をコンテナのポート 9000 にマッピングします。環境変数はすでに Dockerfile で設定されているため、docker run コマンドで再度設定する必要はありません。

  1. ウェブサーバーが指定されたポートで動作していることを確認します。
curl http://localhost:9000

ターミナルに index.html ファイルの HTML 内容が表示されるはずです。

Dockerfile での ENTRYPOINT の使用

このステップでは、Dockerfile で ENTRYPOINT 命令を使用する方法を学び、別のポート(9100)を使用してみます。

  1. WebIDE で、再び Dockerfile を開きます。

  2. Dockerfile の内容を以下のように変更します。

FROM nginx
COPY index.html /usr/share/nginx/html/
COPY start.sh /start.sh
RUN chmod +x /start.sh
ENTRYPOINT ["/start.sh"]

この Dockerfile では、環境変数と sed コマンドを削除しました。代わりに、ENTRYPOINT スクリプトを使用して実行時に設定を処理します。これにより、イメージの柔軟性が高まります。

  1. 同じディレクトリに start.sh という名前の新しいファイルを作成し、以下の内容を追加します。
#!/bin/bash
## NGINX_PORT が設定されていない場合のデフォルトポートを設定
export NGINX_PORT=${NGINX_PORT:-9100}
## nginx の設定内のポートを置換
sed -i "s/listen[[:space:]]*80;/listen $NGINX_PORT;/g" /etc/nginx/conf.d/default.conf
echo "Starting Nginx on port $NGINX_PORT"
nginx -g 'daemon off;'

このスクリプトは、デフォルトポートを設定し、コンテナ起動時に Nginx の設定を修正し、Nginx が動作するポートを示すメッセージを表示してから、Nginx を起動します。

  1. WebIDE で両方のファイルを保存します。

  2. WebIDE のターミナルで、新しいタグを付けて Docker イメージを再ビルドします。

docker build -t my-nginx-entrypoint .
  1. 新しいイメージに基づいてコンテナを実行します。環境変数を使用してポートを 9100 に設定します。
docker run -d -p 9100:9100 -e NGINX_PORT=9100 --name entrypoint-container my-nginx-entrypoint
  1. コンテナのログを確認して、起動メッセージを表示します。
docker logs entrypoint-container

出力に "Starting Nginx on port 9100" というメッセージが表示されるはずです。

  1. ウェブサーバーが新しいポートで正しく動作していることを確認します。
curl http://localhost:9100

ターミナルに index.html ファイルの HTML 内容が表示されるはずです。

まとめ

この実験では、アプリケーションに付加価値を与えるカスタム Docker イメージの作成方法を学びました。まずウェブサーバーを含むシンプルなイメージの作成から始め、次にカスタムソフトウェアの追加や、設定のための環境変数の使用へと進みました。実験全体を通して、WebIDE (VS Code) を使用してファイルを編集し、直感的でユーザーフレンドリーなプロセスを体験しました。

学んだことのまとめ:

  1. プロジェクト環境をセットアップし、基本的なターミナルコマンドを習得しました。
  2. Nginx とカスタム HTML ページを含むシンプルな Docker イメージを作成しました。
  3. Docker コンテナをビルドして実行し、ポートマッピングやコンテナの命名について学びました。
  4. 追加のソフトウェア (curl) を含めるように Docker イメージを修正しました。
  5. docker exec を使用してコンテナ内でコマンドを実行しました。
  6. 設定を容易にするために、Docker イメージに環境変数を組み込みました。