はじめに
Docker コンテナは、アプリケーションの開発、デプロイ、管理方法を革新しました。この包括的なチュートリアルでは、Docker コンテナとは何か、どのように動作するのか、そしてそれらを活用してソフトウェア開発およびデプロイ プロセスを効率化する方法を学びます。Docker のインストールと設定から、Docker イメージとコンテナの構築と管理まで、このガイドは Docker コンテナを使った作業に必要な側面を網羅しています。
Docker コンテナは、アプリケーションの開発、デプロイ、管理方法を革新しました。この包括的なチュートリアルでは、Docker コンテナとは何か、どのように動作するのか、そしてそれらを活用してソフトウェア開発およびデプロイ プロセスを効率化する方法を学びます。Docker のインストールと設定から、Docker イメージとコンテナの構築と管理まで、このガイドは Docker コンテナを使った作業に必要な側面を網羅しています。
Docker は、コンテナを用いてアプリケーションの開発、デプロイ、管理を可能にする、人気のオープンソースプラットフォームです。コンテナは、コード、ランタイム、システムツール、ライブラリなど、アプリケーションを実行するために必要なすべてのコンポーネントを含む、軽量で独立した実行可能なソフトウェアパッケージです。
コンテナは、アプリケーションをパッケージ化および配布するための一貫性と信頼性を提供し、基盤となるインフラストラクチャに関係なく、アプリケーションが同じ方法で実行されることを保証します。これにより、開発、テスト、デプロイ、および本番環境でのスケールと管理が容易になります。
Docker の重要な利点の 1 つは、コンテナの作成と管理を行う機能です。コンテナは、Docker イメージから作成されます。Docker イメージは、オペレーティングシステム、ソフトウェア、アプリケーションコードを含む、コンテナの内容を定義するテンプレートです。Docker イメージは構築、共有され、Docker がインストールされているシステム上でコンテナを作成するために使用できます。
Docker を開始するには、システムに Docker ソフトウェアをインストールする必要があります。インストール後、Docker コマンドラインインターフェース (CLI) を使用して、Docker コンテナを作成、管理、および操作できます。Docker CLI は、コンテナの構築、実行、管理、および Docker イメージやネットワークの管理のための幅広いコマンドを提供します。
次のセクションでは、Docker アーキテクチャとコンポーネントを深く掘り下げ、Docker を使用してコンテナを構築、実行、管理する方法を探ります。
Docker プラットフォームの中核コンポーネントは Docker エンジンです。Docker エンジンは、Docker コンテナの構築、実行、管理を担当します。Docker エンジンは、以下の主要なコンポーネントで構成されています。
Docker イメージは、Docker コンテナの構成要素です。イメージは、オペレーティングシステム、ソフトウェア、アプリケーションコードを含む、コンテナの内容を定義する読み取り専用のテンプレートです。Docker イメージは、Dockerfile を使用して作成できます。Dockerfile は、イメージの構築手順を記述するテキストファイルです。
以下は、Nginx Web サーバーを使用したシンプルな Web サーバーを作成する例を示す Dockerfile です。
FROM nginx:latest
COPY index.html /usr/share/nginx/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Docker コンテナは、Docker イメージの実行インスタンスです。軽量でポータブル、そして自己完結型の環境であり、アプリケーションやサービスを実行できます。コンテナはホストシステムおよび他のコンテナから隔離されており、異なる環境間で一貫して動作することを保証します。
Docker イメージからコンテナを作成するには、docker run コマンドを使用できます。
docker run -d -p 80:80 --name my-web-server nginx
このコマンドは、nginx イメージから新しいコンテナを作成し、ホストのポート 80 をコンテナのポート 80 にマッピングし、コンテナをデタッチモードで起動します。
Docker は、コンテナが互いに、およびホストシステムと通信するための組み込みのネットワークシステムを提供します。Docker は、ブリッジ、ホスト、オーバーレイネットワークなど、複数のネットワークドライバをサポートしており、これらを使用してアプリケーションの独自のネットワーク構成を作成できます。
次のセクションでは、Docker のインストールと設定、および Docker コンテナの構築、実行、管理方法について説明します。
Ubuntu 22.04 に Docker をインストールするには、以下の手順に従います。
パッケージインデックスを更新します。
sudo apt-get update
apt が HTTPS 経由のリポジトリを使用できるように必要なパッケージをインストールします。
sudo apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
公式 Docker GPG キーを追加します。
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Docker リポジトリを設定します。
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Docker エンジン、containerd、Docker Compose パッケージをインストールします。
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
docker version コマンドを実行してインストールを確認します。
docker version
Docker のインストール後、ニーズに合わせて設定できます。一般的な設定タスクには以下が含まれます。
/etc/docker/daemon.json ファイルを編集することで、Docker デーモンの動作をカスタマイズできます。docker コマンドラインインターフェースを使用して、コンテナとイメージを管理できます。これらの手順に従うことで、Ubuntu 22.04 システムに動作する Docker インストールが完成し、Docker コンテナの構築と実行を開始できます。
Docker イメージは、Dockerfile を使用して構築されます。Dockerfile は、イメージ構築のための命令セットを含むテキストファイルです。Dockerfile は、ベースイメージ、アプリケーションコード、アプリケーション実行に必要な依存関係や設定などを指定します。
以下は、Nginx Web サーバーを使用したシンプルな Web サーバーを作成する例を示す Dockerfile です。
## 最新の Nginx イメージをベースとして使用
FROM nginx:latest
## index.html ファイルをコンテナの Web サーバーディレクトリにコピー
COPY index.html /usr/share/nginx/html/
## ホストにポート 80 を公開
EXPOSE 80
## コンテナ起動時に Nginx Web サーバーを起動
CMD ["nginx", "-g", "daemon off;"]
Dockerfile から Docker イメージを構築するには、docker build コマンドを使用します。
docker build -t my-web-server .
このコマンドは、現在のディレクトリにある Dockerfile を使用して、タグ my-web-server の新しい Docker イメージを構築します。
--build-arg フラグを使用して、追加のビルド引数を指定することもできます。
docker build -t my-web-server --build-arg APP_VERSION=1.0.0 .
このコマンドは、イメージ構築プロセス中に APP_VERSION ビルド引数を 1.0.0 に設定します。
Docker イメージを構築したら、Docker Hub やプライベートレジストリなどの Docker レジストリにプッシュして、共有および利用できるようにします。イメージをレジストリにプッシュするには、docker push コマンドを使用します。
docker push my-web-server:latest
このコマンドは、デフォルトの Docker レジストリに my-web-server:latest イメージをプッシュします。
Docker イメージの構築と管理方法を理解することで、アプリケーションを移植性があり、一貫性があり、スケーラブルなコンテナとして作成および配布できます。
Docker イメージを構築したら、docker run コマンドを使用して、そのイメージに基づいて新しいコンテナを作成し起動できます。
docker run -d -p 80:80 --name my-web-server my-web-server
このコマンドは、my-web-server イメージから my-web-server という名前の新しいコンテナを作成し、ホストのポート 80 をコンテナのポート 80 にマッピングし、コンテナをデタッチモードで起動します。
実行中のコンテナを停止するには、docker stop コマンドを使用します。
docker stop my-web-server
Docker は、実行中のコンテナを管理するためのいくつかのコマンドを提供します。
docker ps: 実行中のすべてのコンテナをリスト表示します。docker logs: コンテナのログを表示します。docker exec: 実行中のコンテナ内でコマンドを実行します。docker rm: 停止したコンテナを削除します。たとえば、実行中のコンテナのログを表示するには、次のコマンドを使用します。
docker logs my-web-server
実行中のコンテナ内でコマンドを実行するには、次のコマンドを使用します。
docker exec -it my-web-server bash
このコマンドは、my-web-server コンテナ内のインタラクティブなシェルセッションを開きます。
Docker コンテナは、次の状態を含むライフサイクルを持ちます。
created: コンテナは作成されましたが、まだ起動されていません。running: コンテナは現在実行中です。paused: コンテナのプロセスが一時停止されています。stopped: コンテナは停止しました。deleted: コンテナは削除されました。docker start、docker pause、docker unpause、docker rm などの Docker コマンドを使用して、コンテナのライフサイクルを管理できます。
Docker コンテナの実行と管理方法を理解することで、コンテナ化された環境でアプリケーションを効果的にデプロイおよび保守できます。
Docker は、コンテナのネットワーク接続を構成するための複数のネットワークドライバを提供します。
これらのドライバを使用してカスタムネットワークを作成し、アプリケーションの要件に基づいてコンテナを特定のネットワークに割り当てることができます。
コンテナを実行するとき、-p または --publish フラグを使用して、コンテナからホストシステムへのポートを公開できます。これにより、外部システムがコンテナ内部で実行されているサービスにアクセスできるようになります。
たとえば、Web サーバーコンテナを実行し、ホストのポート 80 をコンテナのポート 80 にマッピングするには、次のコマンドを使用します。
docker run -d -p 80:80 --name my-web-server my-web-server
特定のホストポートをコンテナ内の別のポートにマッピングすることもできます。
docker run -d -p 8080:80 --name my-web-server my-web-server
これは、ホストのポート 8080 をコンテナのポート 80 にマッピングします。
コンテナは、組み込みの Docker ネットワークシステムを使用して互いに通信できます。デフォルトでは、同じネットワーク上のコンテナは、コンテナ名または IP アドレスを使用して互いに通信できます。
カスタムネットワークを作成し、コンテナをそれらに割り当てるには、docker network コマンドを使用します。これにより、コンテナ化されたアプリケーションのネットワークトポロジーとセキュリティを制御できます。
Docker ネットワークを理解することで、コンテナ化されたアプリケーションのネットワーク接続を効果的に構成および管理できます。
Docker ボリュームは、コンテナによって生成されたデータを永続的に保存する方法です。ボリュームはコンテナのファイルシステムの外側に保存され、コンテナ間で共有されるか、ホストシステムにマウントできます。これにより、コンテナのライフサイクルとは独立してデータを保存および管理できます。
Docker には、主に 3 つのタイプのボリュームがあります。
名前付きボリュームを作成するには、docker volume create コマンドを使用します。
docker volume create my-data-volume
次に、-v または --mount フラグを使用して、このボリュームをコンテナにマウントできます。
docker run -d -v my-data-volume:/data my-app
これにより、my-data-volume ボリュームがコンテナ内の /data ディレクトリにマウントされます。
ボリュームを管理するには、次のコマンドを使用できます。
docker volume ls: すべてのボリュームを一覧表示します。docker volume inspect: ボリュームの詳細情報を表示します。docker volume rm: ボリュームを削除します。Docker ボリュームのバックアップを作成するには、docker run コマンドを使用して、ボリュームデータを tar アーカイブにエクスポートするコンテナを作成できます。
docker run --rm -v my-data-volume:/data -v /tmp:/backup busybox tar cvf /backup/backup.tar /data
このコマンドは、my-data-volume ボリュームのバックアップを作成し、ホストシステムの /tmp/backup.tar ファイルに保存します。
バックアップからボリュームを復元するには、docker run コマンドを使用して、tar アーカイブからデータを抽出できます。
docker run --rm -v my-data-volume:/data -v /tmp:/backup busybox tar xvf /backup/backup.tar -C /data
このコマンドは、/tmp/backup.tar ファイルからデータを抽出し、my-data-volume ボリュームに復元します。
Docker ボリュームの使用方法を理解することで、コンテナ化されたアプリケーションがデータを効果的に永続化および管理できるようになります。
Docker Compose は、YAML 設定ファイルを使用して複数コンテナアプリケーションを定義および管理するツールです。Docker Compose を使用すると、アプリケーションを構成するサービス、ネットワーク、ボリュームを簡単に定義し、単一の命令でアプリケーション全体のスタックを起動、停止、管理できます。
Web サーバーとデータベースを持つシンプルな Web アプリケーションを定義する Docker Compose ファイルの例を次に示します。
version: "3"
services:
web:
build: .
ports:
- "80:80"
depends_on:
- db
environment:
- DB_HOST=db
- DB_USER=myapp
- DB_PASSWORD=secret
db:
image: mysql:5.7
environment:
- MYSQL_DATABASE=myapp
- MYSQL_USER=myapp
- MYSQL_PASSWORD=secret
- MYSQL_ROOT_PASSWORD=root
volumes:
- db-data:/var/lib/mysql
volumes:
db-data:
この Compose ファイルは、Web サーバーと MySQL データベースの 2 つのサービスを定義しています。Web サーバーは、現在のディレクトリにある Dockerfile からビルドされ、データベースサービスに依存しています。データベースサービスは公式の MySQL イメージを使用し、名前付きボリュームにデータを永続化します。
Compose ファイルを作成したら、docker-compose コマンドを使用してアプリケーションを管理できます。
docker-compose up: アプリケーションを起動します。docker-compose down: アプリケーションを停止します。docker-compose ps: 実行中のコンテナを一覧表示します。docker-compose logs: アプリケーションのログを表示します。docker-compose exec: 実行中のコンテナでコマンドを実行します。たとえば、前の Compose ファイルで定義されたアプリケーションを起動するには、次のコマンドを使用します。
docker-compose up -d
このコマンドは、アプリケーションをデタッチモードで起動するため、ターミナルを継続して使用できます。
Docker Compose を使用すると、複雑な複数コンテナアプリケーションを簡単に管理し、必要なすべてのサービスと依存関係が適切に構成およびデプロイされるようにすることができます。
Docker の主な利点の 1 つは、軽量な小さなイメージを作成できることです。イメージサイズを最適化するには、以下のベストプラクティスを考慮してください。
alpine や scratch などの最小限のベースイメージを使用する。Docker コンテナのセキュリティを確保するには、以下のベストプラクティスに従ってください。
--user フラグを使用するか、非ルートユーザーとしてコンテナを実行することで、コンテナの特権を制限する。適切なログは、Docker コンテナのトラブルシューティングと監視に不可欠です。以下のベストプラクティスを考慮してください。
json-file ログドライバを使用して、構造化された形式でコンテナログを保存する。コンテナを迅速かつ効率的に起動するには、以下のベストプラクティスを考慮してください。
tini や dumb-init などの軽量な初期化システムを使用して、コンテナのプロセスを管理する。LabEx は、コンテナ化アプリケーションの構築、デプロイ、管理を支援する強力なプラットフォームです。LabEx を活用することで、以下のベストプラクティスや機能を活用できます。
LabEx をコンテナ化アプリケーションに活用する方法の詳細については、LabEx ウェブサイト をご覧ください。
これらのベストプラクティスに従うことで、Docker コンテナを安全、効率的、かつ簡単に管理し、高品質でスケーラブルなアプリケーションを構築およびデプロイできます。
このガイドでは、Docker コンテナの基本的な概念と実践的な側面について説明しました。Docker アーキテクチャを探り、Docker のインストールと設定方法を学び、Docker コンテナの構築、実行、管理プロセスを深く掘り下げました。
また、Docker のネットワーク、ボリューム、データ管理、およびマルチコンテナアプリケーションの管理のための Docker Compose の使用方法についても説明しました。最後に、Docker コンテナを最適化および保護するためのベストプラクティスを提示しました。
Docker のしっかりとした理解が得られたので、スキルと知識をさらに強化するためにできる次のステップをいくつか紹介します。
Docker の知識とスキルを継続的に拡大することで、幅広いアプリケーション開発とデプロイの課題に取り組み、コンテナ化されたソリューションの成長するエコシステムに貢献できるようになります。
このチュートリアルでは、Docker コンテナの基本的な概念、そのアーキテクチャ、そしてその動作方法について学びました。Docker のインストールと設定、Docker イメージの構築、Docker コンテナの実行と管理、マルチコンテナアプリケーションのための Docker Compose の活用プロセスを探求しました。Docker コンテナの力を理解することで、ソフトウェア開発とデプロイのワークフローに自信を持って組み込むことができ、効率性、スケーラビリティ、ポータビリティの向上に繋がります。