Docker コンテナサーバーを迅速にセットアップする

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

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

このチュートリアルでは、最適な Docker コンテナを迅速にセットアップし、サーバーを起動して実行するプロセスを案内します。Docker のインストール方法、Docker コンテナの作成と管理方法、ネットワークとスケーリングの設定方法、および Docker 環境のトラブルシューティング方法を学びます。このチュートリアルの終わりまでに、Docker についてしっかりと理解し、堅牢でスケーラブルな Docker コンテナサーバーをセットアップできるようになります。

Docker とその利点について理解する

Docker は、アプリケーションの開発、デプロイ、管理方法を革新した強力なコンテナ化プラットフォームです。ソフトウェアをパッケージ化して配布する標準化された一貫した方法を提供し、異なる環境でアプリケーションを構築、配布、実行しやすくします。

Docker とは何か?

Docker は、開発者がコンテナ内でアプリケーションを構築、デプロイ、実行できるようにするオープンソースのソフトウェアプラットフォームです。コンテナは、コード、ランタイム、システムツール、ライブラリなど、アプリケーションを実行するために必要なすべてを含む軽量で独立した実行可能パッケージです。

Docker の利点

  1. 一貫性:Docker コンテナは、基盤となるインフラストラクチャに関係なくアプリケーションが同じように実行されることを保証し、一貫した予測可能な環境を提供します。
  2. ポータビリティ:Docker コンテナは、複雑な設定変更を必要とせずに、開発者のノートパソコンから本番サーバーまで、異なるプラットフォーム間で簡単に移動およびデプロイできます。
  3. スケーラビリティ:Docker は、必要に応じてコンテナを迅速に作成および破棄することで、アプリケーションを簡単に拡大または縮小でき、効率的なリソース利用を可能にします。
  4. 分離性:Docker コンテナは高度な分離性を提供し、アプリケーションとその依存関係がホストシステムおよび他のアプリケーションから分離されることを保証し、競合やセキュリティバグのリスクを軽減します。
  5. 効率性:Docker コンテナは軽量で、従来の仮想マシンよりも少ないリソースを使用するため、ハードウェアをより効率的に利用でき、起動時間も短縮されます。

Docker のアーキテクチャ

Docker はクライアント - サーバーアーキテクチャを使用しており、Docker クライアントが Docker デーモンと通信します。Docker デーモンは、コンテナ、イメージ、その他の Docker リソースの管理を担当します。Docker デーモンは、クライアントと同じマシン上で実行することも、リモートマシン上で実行することもできます。

graph LR A[Docker Client] -- Commands --> B[Docker Daemon] B -- Manages --> C[Docker Images] B -- Manages --> D[Docker Containers] B -- Manages --> E[Docker Volumes] B -- Manages --> F[Docker Networks]

Docker のユースケース

Docker は、さまざまな業界やシナリオで広く使用されています。以下に例を挙げます。

  1. マイクロサービス:Docker は、各サービスを個別のコンテナとしてパッケージ化してデプロイできるマイクロサービスベースのアプリケーションの構築とデプロイに特に適しています。
  2. 継続的インテグレーションとデプロイ:Docker は CI/CD パイプラインとのシームレスな統合を可能にし、アプリケーションの自動構築、テスト、デプロイを実現します。
  3. クラウドとサーバーレスコンピューティング:Docker コンテナはクラウドプラットフォーム上で簡単にデプロイおよびスケールでき、効率的で費用対効果の高いクラウドベースのアプリケーションを実現します。
  4. 開発者の生産性:Docker は、一貫した再現可能な環境を提供することで開発とテストプロセスを簡素化し、「自分のマシンでは動く」という問題を軽減します。

Docker の基本とその利点を理解することで、コンテナ化の力を活用してアプリケーションの開発とデプロイプロセスを合理化することができます。

オペレーティングシステムに Docker をインストールする

Ubuntu 22.04 に Docker をインストールする

Ubuntu 22.04 に Docker をインストールするには、以下の手順に従ってください。

  1. パッケージインデックスを更新し、必要な依存関係をインストールします。
sudo apt-get update
sudo apt-get install -y \
  ca-certificates \
  curl \
  gnupg \
  lsb-release
  1. 公式の Docker GPG キーを追加します。
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  1. Docker リポジトリを設定します。
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  1. Docker Engine、containerd、および Docker Compose パッケージをインストールします。
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
  1. 以下のコマンドを実行してインストールを確認します。
sudo docker run hello-world

このコマンドはテストイメージをダウンロードし、コンテナ内で実行して、Docker のインストールが正常に動作していることを確認します。

非ルートユーザーとして Docker を管理する

デフォルトでは、Docker デーモンはルートユーザーとして実行されますが、これはセキュリティ上のリスクとなる可能性があります。非ルートユーザーとして Docker を管理するには、以下の手順に従ってください。

  1. Docker グループを作成します。
sudo groupadd docker
  1. あなたのユーザーを Docker グループに追加します。
sudo usermod -aG docker $USER
  1. 変更を有効にするために、一度ログアウトしてから再度ログインします。

  2. sudo なしで Docker コマンドを実行できることを確認します。

docker run hello-world

これで、非ルートユーザーとして Docker を管理できるようになり、システム全体のセキュリティが向上します。

Docker コンテナの作成と実行

Docker イメージとコンテナの理解

Docker イメージは、Docker コンテナを作成するための基礎です。イメージは、Docker コンテナを作成するための命令を含む読み取り専用のテンプレートです。Docker イメージを実行すると、そのイメージの実行可能なインスタンスであるコンテナが作成されます。

Docker コンテナの作成

Docker コンテナを作成するには、docker run コマンドを使用できます。基本的な構文は次の通りです。

docker run [options] image [command] [arguments]

以下は、nginx:latest イメージに基づいてコンテナを作成し、Nginx Web サーバーを実行する例です。

docker run -d -p 80:80 --name my-nginx nginx:latest

このコマンドを分解してみましょう。

  • -d: コンテナをデタッチドモード(バックグラウンド)で実行します。
  • -p 80:80: ホストのポート 80 をコンテナのポート 80 にマッピングします。
  • --name my-nginx: コンテナに "my-nginx" という名前を割り当てます。
  • nginx:latest: コンテナを作成するために使用するイメージです。

Docker コンテナとのやり取り

コンテナが実行されたら、さまざまな Docker コマンドを使用してコンテナとやり取りできます。

  • docker ps: すべての実行中のコンテナをリストします。
  • docker stop my-nginx: "my-nginx" コンテナを停止します。
  • docker start my-nginx: "my-nginx" コンテナを起動します。
  • docker logs my-nginx: "my-nginx" コンテナのログを表示します。
  • docker exec -it my-nginx bash: "my-nginx" コンテナに入り、bash シェルを開きます。

カスタム Docker イメージの構築

Dockerfile を使用して独自のカスタム Docker イメージを作成することもできます。Dockerfile は、Docker イメージを構築するための命令を含むテキストファイルです。以下は、カスタム HTML ページを持つカスタム Nginx イメージを作成する Dockerfile の例です。

FROM nginx:latest
COPY index.html /usr/share/nginx/html/

その後、イメージを構築し、それに基づいてコンテナを実行できます。

docker build -t my-custom-nginx.
docker run -d -p 80:80 --name my-custom-nginx my-custom-nginx

Docker コンテナの作成と実行の基本を理解することで、コンテナ化の力を活用して独自のアプリケーションを構築し、デプロイすることができます。

Docker コンテナの設定と管理

Docker コンテナの設定

Docker コンテナを作成する際には、その動作をカスタマイズするためにさまざまな設定オプションを指定できます。一般的な設定オプションには以下のようなものがあります。

  • ポート-p または --publish フラグを使用して、ホストのポートをコンテナのポートにマッピングします。
  • 環境変数-e または --env フラグを使用して環境変数を設定します。
  • ボリューム-v または --volume フラグを使用して、ホストのディレクトリまたはファイルをコンテナにマウントします。
  • ネットワーク--network フラグを使用してコンテナを特定のネットワークに接続します。
  • リソース制限:コンテナが使用できるリソース(CPU、メモリなど)の量を制限します。

以下は、いくつかの設定オプションを指定してコンテナを作成する例です。

docker run -d -p 8080:80 -e DB_HOST=192.168.1.100 -v /host/path:/container/path --network my-network nginx:latest

Docker コンテナの管理

コンテナが実行されたら、さまざまな Docker コマンドを使用して管理できます。

  • docker ps:すべての実行中のコンテナをリストします。
  • docker stop <container_name>:実行中のコンテナを停止します。
  • docker start <container_name>:停止したコンテナを起動します。
  • docker restart <container_name>:実行中のコンテナを再起動します。
  • docker rm <container_name>:停止したコンテナを削除します。
  • docker logs <container_name>:コンテナのログを表示します。
  • docker exec -it <container_name> <command>:実行中のコンテナ内でコマンドを実行します。

コンテナのライフサイクル管理

Docker コンテナには、以下の状態を含むライフサイクルがあります。

  1. 作成済み:コンテナが作成されたが、まだ起動されていません。
  2. 実行中:コンテナが現在実行中です。
  3. 一時停止:コンテナのプロセスが一時停止されています。
  4. 停止:コンテナが停止されています。
  5. 削除:コンテナが削除されています。

docker startdocker stopdocker pausedocker rm などのさまざまな Docker コマンドを使用して、コンテナのライフサイクルを管理できます。

コンテナのネットワーク

Docker は、コンテナを接続するためのいくつかのネットワークオプションを提供しています。

  • ブリッジネットワーク:デフォルトのネットワークモードで、コンテナは仮想ブリッジネットワークに接続されます。
  • ホストネットワーク:コンテナはホストシステムと同じネットワークスタックを共有します。
  • オーバーレイネットワーク:異なる Docker ホスト上で実行されているコンテナが通信できるマルチホストネットワークです。

docker network コマンドを使用して、Docker ネットワークを作成および管理できます。

Docker コンテナの設定と管理方法を理解することで、コンテナ化された環境でアプリケーションを効果的にデプロイおよび保守することができます。

Docker イメージの構築と共有

Docker イメージの構築

カスタム Docker イメージを構築するには、docker build コマンドと Dockerfile を使用できます。Dockerfile は、Docker イメージを構築するための命令を含むテキストファイルです。

以下は、カスタム HTML ページを持つカスタム Nginx イメージを作成する Dockerfile の例です。

FROM nginx:latest
COPY index.html /usr/share/nginx/html/

その後、次のコマンドを使用してイメージを構築できます。

docker build -t my-custom-nginx.

このコマンドは、Dockerfile 内の命令に基づいて、「my-custom-nginx」という名前の新しい Docker イメージを作成します。

Docker イメージのタグ付けとプッシュ

Docker イメージを構築したら、特定のバージョンまたはラベルでタグ付けすることができます。これにより、イメージの異なるバージョンを管理および追跡できます。

イメージにタグを付けるには、docker tag コマンドを使用します。

docker tag my-custom-nginx:latest my-custom-nginx:v1.0

これにより、「my-custom-nginx」イメージに「v1.0」という新しいタグが作成されます。

Docker イメージを他の人と共有するには、Docker Hub やプライベートレジストリなどの Docker レジストリにプッシュできます。プッシュする前に、docker login コマンドを使用してレジストリに認証する必要があります。

docker login
docker push my-custom-nginx:v1.0

これにより、「my-custom-nginx:v1.0」イメージが Docker レジストリにプッシュされます。

Docker Hub の使用

Docker Hub は、Docker イメージの公式なパブリックレジストリです。Docker Hub を使用して、既存のイメージを検索およびプルすることができるほか、独自のカスタムイメージをホストおよび共有することもできます。

Docker Hub でイメージを検索するには、docker search コマンドを使用できます。

docker search nginx

Docker Hub からイメージをプルするには、docker pull コマンドを使用します。

docker pull nginx:latest

独自の Docker イメージがある場合は、Docker Hub アカウントを作成し、イメージをレジストリにプッシュして他の人が使用できるようにすることができます。

Docker イメージの構築、タグ付け、共有方法を理解することで、コンテナ化の力を活用して独自のカスタムアプリケーションやサービスを作成および配布することができます。

Docker コンテナのネットワーキングと接続

Docker ネットワークドライバ

Docker は、コンテナを接続するためのいくつかのネットワークドライバを提供しています。

  1. ブリッジネットワーク:デフォルトのネットワークドライバで、ホスト上に仮想ブリッジを作成し、コンテナをそれに接続します。
  2. ホストネットワーク:コンテナはホストシステムと同じネットワークスタックを共有します。
  3. オーバーレイネットワーク:異なる Docker ホスト上で実行されているコンテナが通信できるマルチホストネットワークです。
  4. Macvlan ネットワーク:コンテナに MAC アドレスが割り当てられ、ネットワーク上で直接アドレス指定可能になります。
  5. ネットワークプラグイン:Calico、Flannel、Weave などのサードパーティのネットワークプラグインを使用して、高度なネットワーキング機能を提供することができます。

コンテナの接続

コンテナを接続するには、以下の方法を使用できます。

  1. コンテナのリンク:レガシーな --link フラグを使用して、コンテナを名前で接続し、あるコンテナが別のコンテナの環境変数にアクセスできるようにします。
  2. ユーザー定義ネットワークdocker network create コマンドを使用してカスタムネットワークを作成し、--network フラグを使用してコンテナをそれに接続します。
  3. サービスディスカバリー:Docker Swarm または Kubernetes を使用する場合、コンテナは組み込みのサービスディスカバリーメカニズムを使用して互いに発見し、通信することができます。

以下は、カスタムブリッジネットワークを作成し、2 つのコンテナを接続する例です。

## Create a custom network
docker network create my-network

## Run two containers and connect them to the custom network
docker run -d --name web --network my-network nginx:latest
docker run -d --name app --network my-network my-custom-app:latest

これで、「web」と「app」のコンテナは、「my-network」ネットワーク内でコンテナ名を使用して互いに通信できます。

ネットワーク設定

コンテナのさまざまなネットワーク設定を構成することができます。例えば、

  • IP アドレス--ip または --ip6 フラグを使用して、コンテナに特定の IP アドレスを割り当てます。
  • DNS サーバー--dns フラグを使用して、コンテナの DNS サーバーを設定します。
  • ポートマッピング-p または --publish フラグを使用して、ホストのポートをコンテナのポートにマッピングします。

Docker のネットワーキング機能を理解することで、コンテナ化されたアプリケーション間を効果的に接続し、通信することができ、より複雑でスケーラブルなデプロイメントが可能になります。

Docker デプロイメントのスケーリングとロードバランシング

Docker コンテナのスケーリング

Docker を使用すると、必要に応じてコンテナを追加または削除することで、アプリケーションを簡単にスケーリングできます。Docker コンテナをスケーリングする方法はいくつかあります。

  1. 手動スケーリングdocker run および docker rm コマンドを使用して、手動でコンテナを作成または削除できます。
  2. 自動スケーリング:Docker Swarm、Kubernetes またはサードパーティのオーケストレーションプラットフォームなどのツールを使用すると、事前定義されたルールまたはメトリックに基づいてコンテナを自動的にスケーリングできます。
  3. 水平スケーリング:より多くのコンテナインスタンスを追加し、負荷を複数のホストに分散することで、アプリケーションをスケーリングできます。
  4. 垂直スケーリング:各コンテナに割り当てるリソース(CPU、メモリなど)を増やすことで、アプリケーションをスケーリングできます。

Docker コンテナのロードバランシング

複数の Docker コンテナに対して着信トラフィックを分散するには、ロードバランシングソリューションを使用できます。いくつかのオプションを以下に示します。

  1. Docker Swarm のロードバランシング:Docker Swarm には組み込みのロードバランシング機能があり、複数のコンテナインスタンスにトラフィックを自動的に分散するサービスを作成できます。
graph LR A[Docker Swarm] -- Load Balances --> B[Container 1] A -- Load Balances --> C[Container 2] A -- Load Balances --> D[Container 3]
  1. Kubernetes のロードバランシング:Kubernetes は、組み込みの Service オブジェクトなど、さまざまなロードバランシングオプションを提供しており、複数のコンテナポッドにトラフィックを分散できます。

  2. サードパーティのロードバランサー:Nginx、HAProxy またはクラウドベースのロードバランサー(例:AWS Elastic Load Balancing、Azure Load Balancer)などの外部のロードバランサーを使用して、Docker コンテナにトラフィックを分散できます。

graph LR A[Load Balancer] -- Load Balances --> B[Container 1] A -- Load Balances --> C[Container 2] A -- Load Balances --> D[Container 3]

Docker デプロイメントのスケーリングとロードバランシングの方法を理解することで、アプリケーションが増加するトラフィックを処理でき、高可用性を維持できることを保証できます。

Docker 環境のモニタリングとトラブルシューティング

Docker コンテナのモニタリング

Docker 環境をモニタリングすることは、アプリケーションの健全性とパフォーマンスを確保するために重要です。Docker コンテナをモニタリングするためのツールとテクニックをいくつか紹介します。

  1. Docker CLI コマンドdocker psdocker logsdocker stats など、さまざまな Docker CLI コマンドを使用してコンテナをモニタリングできます。
  2. Docker メトリクス:Docker は、Docker API または Prometheus などのサードパーティのモニタリングツールを使用してアクセスできる組み込みのメトリクス(CPU、メモリ、ネットワーク使用率など)を提供しています。
  3. サードパーティのモニタリングツール:Prometheus、Grafana、LabEx Monitoring などのツールを Docker と統合して、Docker 環境の包括的なモニタリングと可視化を行うことができます。
graph LR A[Docker Containers] -- Metrics --> B[Monitoring Tools] B -- Visualize --> C[Dashboards]

Docker コンテナのトラブルシューティング

Docker 環境で問題が発生した場合、以下のテクニックを使用してトラブルシューティングし、解決することができます。

  1. コンテナログdocker logs コマンドを使用してコンテナのログを調べ、エラーや問題を特定します。
  2. コンテナインスペクションdocker inspect コマンドを使用して、コンテナの構成、ネットワーク設定、リソース使用率など、コンテナに関する詳細情報を取得します。
  3. コンテナネットワーキング:Docker ネットワーク構成を調べ、コンテナの IP アドレスを確認し、ネットワーク接続を検証することで、ネットワーク関連の問題をトラブルシューティングします。
  4. リソース使用率docker stats コマンドまたはサードパーティのモニタリングツールを使用してコンテナのリソース使用率をモニタリングし、リソース関連の問題を特定します。
  5. コンテナの再起動:コンテナが予期したとおりに動作しない場合は、docker restart コマンドを使用して再起動してみてください。
graph LR A[Docker Containers] -- Troubleshoot --> B[Logs] A -- Troubleshoot --> C[Inspection] A -- Troubleshoot --> D[Networking] A -- Troubleshoot --> E[Resource Utilization] A -- Troubleshoot --> F[Restart]

Docker が提供するモニタリングとトラブルシューティングのツールとテクニックを活用することで、Docker ベースのアプリケーションを効果的に管理および保守し、その信頼性とパフォーマンスを確保することができます。

まとめ

この「Docker コンテナサーバーを迅速にセットアップする」チュートリアルでは、Docker のインストール方法、Docker コンテナの作成と管理方法、Docker イメージの構築と共有方法、および Docker デプロイメントのスケーリングとモニタリング方法を学びました。これらのスキルを使って、最適な Docker コンテナサーバーを迅速にセットアップして稼働させ、Docker の力を活用してアプリケーションの開発とデプロイプロセスを合理化することができます。