はじめに
この包括的な Docker チュートリアルは、開発者および IT プロフェッショナル向けに、コンテナ技術の深い理解を提供します。Docker のコアコンセプトの理解から、実践的なインストールおよび管理テクニックまで、このガイドは、最新のソフトウェア開発およびデプロイメントにおいて Docker の強力なコンテナ化機能を活用するために必要なすべてを網羅しています。
Docker の基礎
コンテナ技術の紹介
Docker はコンテナ技術のための強力なプラットフォームであり、開発者がアプリケーションを効率的にパッケージ化、配布、実行することを可能にします。コンテナは、ソフトウェアとその依存関係をカプセル化する、軽量でポータブルな環境を提供します。
Docker のコアコンセプト
graph TD
A[Docker Engine] --> B[Container]
A --> C[Image]
A --> D[Dockerfile]
| コンセプト | 説明 |
|---|---|
| Docker Image | アプリケーションコードと依存関係を含む読み取り専用テンプレート |
| Container | Docker イメージの実行可能なインスタンス |
| Docker Engine | コンテナを作成・管理するための実行環境 |
Docker のインストールの確認
LabEx 環境には Docker がプリインストールされています。Docker のバージョンを確認して、使用準備ができていることを確認しましょう。
docker --version
出力は、例えば Docker version 20.10.21, build baeda1f のように Docker のバージョンを表示するはずです。これにより、Docker が正しくインストールされ、アクセス可能であることが確認できます。
最初の Docker イメージのプル
Docker イメージは、コンテナを作成するための命令セットを含む読み取り専用のテンプレートです。ここでは、Docker のインストールをテストするために使用される最小限のイメージである hello-world イメージをプルします。
docker pull hello-world
このコマンドは、Docker Hub から hello-world イメージをローカルマシンにダウンロードします。ダウンロードの進行状況と、イメージがプルされたことを示す確認メッセージが表示されるはずです。
最初の Docker コンテナの実行
イメージが用意できたので、それからコンテナを実行しましょう。コンテナを実行するとは、イメージのインスタンスを作成することです。
docker run hello-world
hello-world を実行すると、Docker は以下の操作を行います。
- ローカルに
hello-worldイメージが存在するかどうかを確認します。存在しない場合はプルします(これは既に行いました)。 - イメージから新しいコンテナを作成します。
- コンテナ内の実行可能ファイルを実行します。
- コンテナは "Hello from Docker!" というメッセージを表示し、その後終了します。
これは、Docker コンテナの基本的なライフサイクルを示しています。イメージをプルし、コンテナを実行し、コンテナは定義されたタスクを実行します。
Docker イメージの一覧表示
ダウンロードしたイメージを表示するには、docker images コマンドを使用します。
docker images
このコマンドは、先ほどプルした hello-world イメージを含む、ローカルシステムに保存されているすべての Docker イメージを一覧表示します。リポジトリ、タグ、イメージ ID、作成日、サイズなどの詳細が表示されます。
コンテナのライフサイクルの理解
コンテナは、独自のファイルシステム、プロセス、ネットワークインターフェイスを持つ分離された環境を提供します。コンテナは、素早く開始、停止、移動、削除できるため、マイクロサービスやクラウドネイティブアプリケーションに最適です。
Dockerfile ファイル管理
Dockerfile の基本
Dockerfile は、イメージを組み立てるためにユーザーがコマンドラインで呼び出すことができるすべてのコマンドを含むテキストドキュメントです。コンテナ化されたアプリケーションの環境、依存関係、および設定を定義します。
graph TD
A[Dockerfile] --> B[Build Command]
B --> C[Docker Image]
C --> D[Container]
最初の Dockerfile の作成
セットアップフェーズ中に作成された docker_app ディレクトリに移動します。ここがこの実験の作業ディレクトリになります。
cd /home/labex/project/docker_app
次に、このディレクトリに Dockerfile という名前のシンプルな Dockerfile を作成しましょう。この Dockerfile は、Ubuntu をベースにしたイメージを作成し、そこにシンプルなテキストファイルを追加します。
nano Dockerfile
Dockerfile に以下の内容を追加します。
## Use an official Ubuntu base image
FROM ubuntu:22.04
## Set the working directory inside the container
WORKDIR /app
## Create a simple text file
RUN echo "Hello from Dockerfile!" > /app/message.txt
## Command to run when the container starts
CMD ["cat", "/app/message.txt"]
FROM ubuntu:22.04: この命令は、新しいイメージのベースイメージを指定します。ここでは Ubuntu 22.04 を使用しています。WORKDIR /app: これは、Dockerfile の後続のRUN、CMD、ENTRYPOINT、COPY、またはADD命令の作業ディレクトリを設定します。/appが存在しない場合は作成されます。RUN echo "Hello from Dockerfile!" > /app/message.txt: この命令は、ビルドプロセス中にイメージ内でコマンドを実行します。ここでは、/appディレクトリに "Hello from Dockerfile!" という内容のmessage.txtというファイルを作成します。CMD ["cat", "/app/message.txt"]: この命令は、実行中のコンテナのデフォルトコマンドを提供します。このイメージからコンテナを実行すると、cat /app/message.txtが実行され、メッセージファイルのコンテンツが表示されます。
Ctrl+S を押してファイルを保存し、Ctrl+X を押して nano を終了します。
Docker イメージのビルド
Dockerfile が用意できたので、それから Docker イメージをビルドしましょう。docker build コマンドは Dockerfile を読み込み、Docker イメージを作成します。
docker build -t my-ubuntu-app .
docker build: Docker イメージをビルドするためのコマンドです。-t my-ubuntu-app: これにより、イメージにmy-ubuntu-appという名前が付けられます。好きな名前を選択できます。.: これはビルドコンテキストを指定します。ビルドコンテキストとは、指定されたPATHまたはURLにあるファイルのセットです。.は、現在のディレクトリ (/home/labex/project/docker_app) がビルドコンテキストであることを示します。Docker はこのディレクトリでDockerfileを探します。
Dockerfile の各命令に対応するビルドプロセスの各ステップを示す出力が表示されます。
カスタム Docker コンテナの実行
イメージのビルドが成功したら、それからコンテナを実行して message.txt の内容を確認しましょう。
docker run my-ubuntu-app
このコマンドは、my-ubuntu-app イメージから新しいコンテナを作成して実行します。Dockerfile の CMD 命令が実行され、ターミナルに "Hello from Dockerfile!" と表示されるはずです。
コンテナのファイルシステムの検査
コンテナ内でのファイルの管理方法をさらに理解するために、インタラクティブなセッションを実行し、作成したファイルを検査しましょう。
docker run -it my-ubuntu-app /bin/bash
-it: このフラグは、疑似 TTY を割り当て、STDINを開いたままにして、コンテナとの対話を可能にします。my-ubuntu-app: 実行したいイメージの名前です。/bin/bash: これは Dockerfile のCMD命令を上書きし、代わりにコンテナ内で Bash シェルを実行して、コマンドプロンプトを提供します。
コンテナ内に入ると、新しいコマンドプロンプト(例:root@<container_id>:/app#)が表示されます。ここで、ファイルを一覧表示し、message.txt の内容を表示できます。
ls -l
cat message.txt
message.txt が一覧表示され、その内容が表示されるはずです。コンテナを終了するには、exit と入力するだけです。
exit
このインタラクティブなセッションは、ファイル message.txt が正常に作成され、コンテナのファイルシステム内でアクセス可能であることを示しています。
Docker の高度なテクニック
マルチステージビルド戦略
マルチステージビルドは、Dockerfile で複数の FROM ステートメントを使用できる強力な機能です。各 FROM 命令は異なるベースイメージを使用でき、各 FROM 命令は新しいビルドステージを開始します。これにより、ビルド環境と実行時環境を分離することで、Dockerfile の複雑さを最適化し、最終的なイメージサイズを削減するのに役立ちます。
graph TD
A[Build Stage] --> B[Compile/Build]
B --> C[Runtime Stage]
C --> D[Minimal Production Image]
マルチステージビルドの準備
この例では、ビルドステップが必要な簡単なアプリケーションをシミュレートします。build_script.sh と final_app.txt ファイルを作成します。
まず、docker_app ディレクトリにいることを確認してください。
cd /home/labex/project/docker_app
次に、シンプルなビルドスクリプトを作成します。
nano build_script.sh
build_script.sh に以下の内容を追加します。
#!/bin/bash
echo "Running build process..."
echo "This is the final application output." > /app/output/final_app.txt
echo "Build complete."
ファイルを保存 (Ctrl+S) し、終了 (Ctrl+X) します。
次に、最終的なアプリケーションコンテンツのプレースホルダーを作成します。実際のシナリオでは、これはビルドプロセスによって生成されます。
nano final_app.txt
final_app.txt に以下の内容を追加します。
This is a placeholder for the final application.
ファイルを保存 (Ctrl+S) し、終了 (Ctrl+X) します。
マルチステージ Dockerfile の実装
次に、マルチステージビルドを使用するように Dockerfile を変更しましょう。build_script.sh を実行する「ビルダー」ステージと、ビルダーステージから必要な出力のみをコピーする「本番」ステージを用意します。
nano Dockerfile
既存の内容を以下に置き換えます。
## Stage 1: Builder stage
FROM ubuntu:22.04 AS builder
## Install bash to run the script
RUN apt-get update && apt-get install -y bash
## Set working directory for the builder stage
WORKDIR /build
## Copy the build script and make it executable
COPY build_script.sh .
RUN chmod +x build_script.sh
## Create a directory for output
RUN mkdir -p /build/output
## Run the build script
RUN ./build_script.sh
## Stage 2: Production stage
FROM ubuntu:22.04
## Set working directory for the production stage
WORKDIR /app
## Copy only the necessary artifact from the builder stage
COPY --from=builder /build/output/final_app.txt .
## Command to run when the container starts
CMD ["cat", "final_app.txt"]
FROM ubuntu:22.04 AS builder: これは最初のステージを開始し、builderという名前を付けます。RUN apt-get update && apt-get install -y bash: ビルダーイメージにbashをインストールします。これはスクリプトを実行するために必要です。WORKDIR /build: ビルダーイメージの作業ディレクトリを設定します。COPY build_script.sh .: ビルドスクリプトをビルダーイメージにコピーします。RUN chmod +x build_script.sh: スクリプトを実行可能にします。RUN mkdir -p /build/output: ビルダーイメージに出力ディレクトリを作成します。RUN ./build_script.sh: ビルドスクリプトを実行し、/build/outputにfinal_app.txtを生成します。FROM ubuntu:22.04: これは 2 番目のステージ(本番ステージ)を開始します。これは新しいubuntu:22.04イメージを使用しており、デフォルトではbuilderステージから何も継承しません。WORKDIR /app: 本番ステージの作業ディレクトリを設定します。COPY --from=builder /build/output/final_app.txt .: これはマルチステージビルドの重要な命令です。builderステージの/build/outputディレクトリからfinal_app.txtを、本番ステージの現在のディレクトリ (/app) にコピーします。これにより、最終成果物のみが含まれるようになり、本番イメージを小さく保つことができます。CMD ["cat", "final_app.txt"]: 本番コンテナが開始されたときに実行されるコマンドで、コピーされたファイルのコンテンツを表示します。
ファイルを保存 (Ctrl+S) し、終了 (Ctrl+X) します。
マルチステージイメージのビルドと実行
それでは、マルチステージ Dockerfile を使用して新しいイメージをビルドしましょう。
docker build -t multi-stage-app .
ビルド出力を確認してください。builder ステージと最終ステージの両方のステップが表示されます。
ビルドが完了したら、コンテナを実行して final_app.txt のコンテンツが表示されることを確認します。
docker run multi-stage-app
"This is the final application output." と表示されるはずです。これは、マルチステージビルドがビルドステージから最終イメージに成果物を正常にコピーしたことを確認します。
Docker リソースのクリーンアップ
ディスク容量を解放するために、不要になった Docker リソース(コンテナやイメージ)をクリーンアップすることは良い習慣です。
まず、すべてのコンテナ(終了したものを含む)を一覧表示します。
docker ps -a
ID または名前で特定のコンテナを削除できます。
docker rm $(docker ps -aq)
このコマンドは、終了したすべてのコンテナを削除します。docker ps -aq はすべてのコンテナ ID を一覧表示し、docker rm がそれらを削除します。
次に、すべてのイメージを一覧表示します。
docker images
ID または名前で特定のイメージを削除できます。実行中のコンテナによってまだ使用されているイメージを削除しないように注意してください。
docker rmi my-ubuntu-app multi-stage-app hello-world ubuntu:22.04
このコマンドは、この実験で使用したイメージを削除します。イメージがコンテナによってまだ使用されている場合、まずコンテナを削除する必要があります。
docker images
このコマンドは、イメージが削除されたことを示します。
これで、Docker の基本と高度なテクニックに関する実験は終了です。Dockerfile の作成方法、イメージのビルド方法、コンテナの実行方法、およびマルチステージビルドを使用したイメージサイズの最適化方法を学びました。
まとめ
Docker の基本、Dockerfile の管理、高度なテクニックを習得することで、開発者はより効率的で、ポータブルで、スケーラブルなソフトウェア環境を作成できます。このチュートリアルでは、コンテナの作成、イメージの管理、デプロイ戦略に関する実践的なスキルを習得しました。これにより、開発ワークフローを合理化し、クラウドネイティブなアプリケーションアーキテクチャを採用できるようになります。



