はじめに
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 Web サーバーを実行するシンプルな 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ファイルをコンテナ内の Web ルートディレクトリにコピーします。
- 同じディレクトリに
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 が表示されるはずです。このコマンドは、実行中のすべてのコンテナを表示します。
- Web ページの内容を表示するには、
curlコマンドを使用します。
curl http://localhost:8080
ターミナルに index.html ファイルの HTML コンテンツが表示されるはずです。
curl が何をするものか気になるかもしれませんが、これはサーバーとの間でデータを転送するためのツールです。ここでは、Web サーバーからコンテンツを取得するために使用しています。
また、LabEx VM の上部にある「+」をクリックして新しい Web サーバーを作成し、ポート 8080 を入力してコンテンツを表示することもできます。

イメージへのカスタムソフトウェアの追加
このステップでは、Docker イメージを修正して追加のソフトウェアを含めます。例として、ベースの nginx イメージには含まれていない nano テキストエディタを追加します。
- WebIDE で
Dockerfileを開きます。ファイルエクスプローラーのペインでDockerfileをクリックします。 Dockerfileの内容を以下のように修正します。
FROM nginx
RUN apt-get update && apt-get install -y nano
COPY index.html /usr/share/nginx/html/
この Dockerfile は、パッケージインデックスを更新し、apt-get パッケージマネージャーを使用して nano パッケージをインストールする新しい RUN 命令を追加します。
新しい行の解説:
RUN apt-get update && apt-get install -y nano: この行はパッケージリストを更新し (apt-get update)、nanoをインストールします (apt-get install -y nano)。-yフラグは、インストール中のプロンプトに対して自動的に「yes」と答えます。
- WebIDE で Ctrl+S (Mac の場合は Cmd+S) を押してファイルを保存します。
- WebIDE のターミナルで、新しいタグを付けて Docker イメージを再ビルドします。
docker build -t my-nginx-nano .
このコマンドは、nano エディタを含む my-nginx-nano というタグの新しい Docker イメージをビルドします。
- 新しいイメージが作成されたことを確認します。
docker images
出力に my-nginx-nano イメージが表示されるはずです。
Nano を使用したカスタムイメージのテスト
このステップでは、新しいイメージに基づいてコンテナを実行し、nano パッケージが内部で使用可能であることを確認します。
- WebIDE のターミナルで、以下のコマンドを使用して新しいコンテナを起動します。
docker run -d --name nano-container my-nginx-nano
このコマンドは、my-nginx-nano イメージに基づいて新しいコンテナを起動し、nano-container という名前を付けます。
- 以下のコマンドを実行して、コンテナ内にインストールされた
nanoのバージョンを確認します。
docker exec nano-container nano --version
このコマンドは、実行中のコンテナ内で nano --version を実行し、パッケージがインストールされていることを確認します。
コマンドの解説:
docker exec: 実行中のコンテナ内でコマンドを実行します。nano-container: コンテナの名前です。nano --version: コンテナ内からインストールされているnanoのバージョンを表示します。
GNU nanoで始まる出力が表示されるはずです。これで、カスタムイメージにエディタが含まれていることが確認できました。
イメージでの環境変数の使用
このステップでは、カスタマイズのために環境変数を使用するように 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 コマンドで再度設定する必要はありません。
- Web サーバーが指定されたポートで実行されていることを確認します。
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" というメッセージが表示されるはずです。
- Web サーバーが新しいポートで正しく実行されていることを確認します。
curl http://localhost:9100
ターミナルに index.html ファイルの HTML コンテンツが表示されるはずです。
まとめ
この実験では、アプリケーションに価値をもたらすカスタム Docker イメージの作成方法を学びました。Web サーバーを備えたシンプルなイメージの作成から始まり、カスタムソフトウェアの追加や、設定のための環境変数の使用へと進みました。実験全体を通して、WebIDE (VS Code) を使用してファイルを編集することで、プロセスをより直感的で使いやすいものにしました。
達成したことの要約:
- プロジェクト環境をセットアップし、基本的なターミナルコマンドを学習しました。
- Nginx とカスタム HTML ページを備えたシンプルな Docker イメージを作成しました。
- Docker コンテナをビルドして実行し、ポートマッピングとコンテナの命名について学びました。
- 追加のソフトウェア (curl) を含めるように Docker イメージを修正しました。
docker execを使用してコンテナ内でコマンドを実行しました。- 設定を容易にするために、環境変数を Docker イメージに組み込みました。



