はじめに
Docker は、アプリケーションをコンテナとしてパッケージ化し、配布するための強力なツールです。このプロセスの核となるのが Docker イメージです。これは、コード、依存関係、設定など、アプリケーションの実行に必要なすべてを含む、構築済みのパッケージです。この実験では、追加のソフトウェア、ライブラリ、または設定を組み込むことで、アプリケーションを強化するカスタム Docker イメージの作成方法を学びます。
この実験全体を通して、ファイルの編集には WebIDE (VS Code) を使用します。WebIDE は、ファイル編集のための使い慣れたユーザーフレンドリーなインターフェースを提供し、設定ファイルやコードの操作を容易にします。
プロジェクト環境のセットアップ
まずは、プロジェクトディレクトリを作成し、そこに移動することから始めましょう。
この実験全体を通して、ファイルの編集には WebIDE (VS Code) を使用します。WebIDE は、ファイル編集のための使い慣れたユーザーフレンドリーなインターフェースを提供し、設定ファイルやコードの操作を容易にします。
- WebIDE でターミナルを開きます。上部メニューの「Terminal」をクリックし、「New Terminal」を選択することで開けます。
- ターミナルで、以下のコマンドを実行します。
mkdir -p ~/project/docker
cd ~/project/docker

これにより、~/project フォルダ内に docker という新しいディレクトリが作成され、現在の作業ディレクトリがそこに移動します。
- 正しいディレクトリにいることを確認します。
pwd
出力として /home/labex/project/docker と表示されるはずです。
コマンドの解説:
mkdir -p: ディレクトリを作成するコマンドです。-pフラグは、親ディレクトリが存在しない場合にそれらも同時に作成します。cd: 現在のディレクトリを変更するコマンドです。pwd: 現在の作業ディレクトリを表示するコマンドです。
シンプルな Docker イメージの作成
次に、Nginx ウェブサーバーを実行するシンプルな Docker イメージを作成しましょう。
- WebIDE で、ファイルエクスプローラー(通常は左サイドバーの最初のアイコン)に移動します。
- ファイルエクスプローラーのペインで右クリックし、「New File」を選択します。名前を
Dockerfileにします(先頭の 'D' は大文字で、拡張子は付けません)。 - ファイルエクスプローラーで
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ファイルをコンテナ内のウェブルートディレクトリにコピーします。
- 同じディレクトリに
index.htmlという名前の新しいファイルを作成します。ファイルエクスプローラーで再度右クリックし、「New File」を選択して作成できます。 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 ページです。
- WebIDE のターミナルを開き(前のものを閉じた場合は Terminal -> New Terminal)、以下のコマンドを使用して Docker イメージをビルドします。
docker build -t my-nginx .
このコマンドは、my-nginx というタグ(名前)を付けて新しい Docker イメージをビルドします。
コマンドの解説:
docker build: Docker イメージをビルドするためのコマンドです。-t my-nginx:-tフラグは、イメージにmy-nginxという名前のタグを付けます。.: ビルドコンテキスト(Dockerfile が含まれるディレクトリ)として現在のディレクトリを指定します。
- ビルドが完了したら、イメージが正常に作成されたことを確認します。
docker images
出力に my-nginx イメージが表示されているはずです。
カスタムイメージの実行とテスト
新しいイメージに基づいてコンテナを実行し、テストしてみましょう。
- 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: コンテナの作成に使用するイメージの名前です。
- コンテナが実行中であることを確認します。
docker ps
出力に my-nginx-container が表示されるはずです。このコマンドは、実行中のすべてのコンテナを表示します。
- ウェブページの内容を確認するには、
curlコマンドを使用します。
curl http://localhost:8080
ターミナルに index.html ファイルの HTML 内容が表示されるはずです。
curl について補足すると、これはサーバーとの間でデータを転送するためのツールです。ここでは、ウェブサーバーからコンテンツを取得するために使用しています。
また、LabEx VM の上部にある「+」をクリックして新しいウェブサーバーを作成し、ポート 8080 を入力して内容を確認することもできます。

イメージへのカスタムソフトウェアの追加
次に、追加のソフトウェアを含めるように Docker イメージを修正しましょう。例として curl ユーティリティを追加します。
- WebIDE で
Dockerfileを開きます。ファイルエクスプローラーペインでDockerfileをクリックします。 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」と回答します。
- WebIDE で Ctrl+S(Mac の場合は Cmd+S)を押してファイルを保存します。
- WebIDE のターミナルで、新しいタグを付けて Docker イメージを再ビルドします。
docker build -t my-nginx-curl .
このコマンドは、curl ユーティリティを含む my-nginx-curl というタグの新しい Docker イメージをビルドします。
- 新しいイメージが作成されたことを確認します。
docker images
出力に my-nginx-curl イメージが表示されているはずです。
Curl を使用したカスタムイメージのテスト
新しいイメージに基づいてコンテナを実行し、curl ユーティリティをテストしてみましょう。
- WebIDE のターミナルで、以下のコマンドを使用して新しいコンテナを起動します。
docker run -d --name curl-container my-nginx-curl
このコマンドは、my-nginx-curl イメージに基づいて新しいコンテナを起動し、curl-container と名前を付けます。
- 実行中のコンテナ内で bash シェルを実行します。
docker exec -it curl-container bash
このコマンドは、実行中のコンテナ内で対話型の bash シェルを開きます。
コマンドの解説:
docker exec: 実行中のコンテナ内でコマンドを実行します。-it: これらのフラグは疑似 TTY を割り当て、標準入力(STDIN)を開いたままにすることで、シェルとの対話を可能にします。curl-container: 操作対象のコンテナ名です。bash: コンテナ内で実行するコマンド(bash シェルの起動)です。
- プロンプトが変わり、コンテナ内にいることが示されます。コンテナ内で
curlユーティリティをテストします。
curl http://localhost
ターミナルに index.html ファイルの HTML 内容が表示されるはずです。
- コンテナの bash シェルを終了します。
exit
これでホストシステムのシェルに戻ります。
イメージでの環境変数の使用
このステップでは、カスタマイズのために環境変数を使用するように Docker イメージを修正します。
WebIDE で、再び
Dockerfileを開きます。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)を環境変数の値に置換します。
WebIDE でファイルを保存します。
WebIDE のターミナルで、新しいタグを付けて Docker イメージを再ビルドします。
docker build -t my-nginx-env .
- 新しいイメージに基づいてコンテナを実行します。
docker run -d -p 9000:9000 --name env-container my-nginx-env
このコマンドは、my-nginx-env イメージに基づいて新しいコンテナを起動し、ホストのポート 9000 をコンテナのポート 9000 にマッピングします。環境変数はすでに Dockerfile で設定されているため、docker run コマンドで再度設定する必要はありません。
- ウェブサーバーが指定されたポートで動作していることを確認します。
curl http://localhost:9000
ターミナルに index.html ファイルの HTML 内容が表示されるはずです。
Dockerfile での ENTRYPOINT の使用
このステップでは、Dockerfile で ENTRYPOINT 命令を使用する方法を学び、別のポート(9100)を使用してみます。
WebIDE で、再び
Dockerfileを開きます。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 スクリプトを使用して実行時に設定を処理します。これにより、イメージの柔軟性が高まります。
- 同じディレクトリに
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 を起動します。
WebIDE で両方のファイルを保存します。
WebIDE のターミナルで、新しいタグを付けて Docker イメージを再ビルドします。
docker build -t my-nginx-entrypoint .
- 新しいイメージに基づいてコンテナを実行します。環境変数を使用してポートを 9100 に設定します。
docker run -d -p 9100:9100 -e NGINX_PORT=9100 --name entrypoint-container my-nginx-entrypoint
- コンテナのログを確認して、起動メッセージを表示します。
docker logs entrypoint-container
出力に "Starting Nginx on port 9100" というメッセージが表示されるはずです。
- ウェブサーバーが新しいポートで正しく動作していることを確認します。
curl http://localhost:9100
ターミナルに index.html ファイルの HTML 内容が表示されるはずです。
まとめ
この実験では、アプリケーションに付加価値を与えるカスタム Docker イメージの作成方法を学びました。まずウェブサーバーを含むシンプルなイメージの作成から始め、次にカスタムソフトウェアの追加や、設定のための環境変数の使用へと進みました。実験全体を通して、WebIDE (VS Code) を使用してファイルを編集し、直感的でユーザーフレンドリーなプロセスを体験しました。
学んだことのまとめ:
- プロジェクト環境をセットアップし、基本的なターミナルコマンドを習得しました。
- Nginx とカスタム HTML ページを含むシンプルな Docker イメージを作成しました。
- Docker コンテナをビルドして実行し、ポートマッピングやコンテナの命名について学びました。
- 追加のソフトウェア (curl) を含めるように Docker イメージを修正しました。
docker execを使用してコンテナ内でコマンドを実行しました。- 設定を容易にするために、Docker イメージに環境変数を組み込みました。



