Docker コンテナを迅速に実行および終了する:ビギナーガイド

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

はじめに

このチュートリアルでは、Docker コンテナの迅速な実行と終了の手順をガイドし、Docker の世界を初めて触れる方々のための包括的な入門となります。システムに Docker をインストールおよび設定する方法、Docker コンテナの基本的な実行方法、コンテナを効果的に管理するための実践的なアプリケーションとベストプラクティスを学びます。

Docker の理解:何なのか、なぜ使うのか

Docker は、開発者と IT 専門家がアプリケーションを一貫性と信頼性のある環境で構築、デプロイ、実行できるようにする強力なオープンソースプラットフォームです。コンテナ化技術を使用して、アプリケーションとそのすべての依存関係を単一のポータブルなコンテナにパッケージ化し、アプリケーションが基盤となるインフラストラクチャに関係なく同じように動作することを保証します。

Docker とは何か?

Docker は、コンテナ内でアプリケーションを構築、デプロイ、実行できるソフトウェアプラットフォームです。コンテナは、コードとそのすべての依存関係をパッケージ化し、アプリケーションを迅速かつ確実に異なるコンピューティング環境間で実行できるようにする、標準化されたソフトウェアユニットです。コンテナは軽量、ポータブル、そして自己完結型であり、現代のソフトウェア開発とデプロイに最適なソリューションです。

なぜ Docker を使うのか?

Docker を使用する主な利点は以下のとおりです。

  1. 一貫性: Docker は、アプリケーションが基盤となるインフラストラクチャに関係なく同じように動作することを保証します。開発者のマシンでは動作するが、本番環境では失敗する「私のマシンでは動作する」という問題を解消します。

  2. スケーラビリティ: Docker は、手動または自動的にコンテナの複数のインスタンスを実行することで、アプリケーションを簡単にスケールアップできます。

  3. 効率性: コンテナは軽量であり、仮想マシンよりも少ないリソースを使用するため、同じハードウェア上でより多くのアプリケーションを実行できます。

  4. ポータビリティ: Docker コンテナは、Docker がインストールされているシステムであればどこでも実行できます。開発、テスト、本番環境など、異なる環境間でアプリケーションを簡単に移動できます。

  5. 分離性: 各 Docker コンテナは他のコンテナから分離されているため、アプリケーションを実行するための安全で信頼性の高い環境が提供されます。

Docker アーキテクチャ

Docker はクライアント・サーバーアーキテクチャを使用しており、Docker クライアントは Docker デーモンと通信します。Docker デーモンは、Docker コンテナの構築、実行、管理を担当します。Docker デーモンはホストマシン上で実行され、クライアントは同じマシンまたはリモートマシン上で実行できます。

graph LR
    A[Docker クライアント] -- 通信 --> B[Docker デーモン]
    B -- 管理 --> C[Docker コンテナ]
    B -- 管理 --> D[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 エンジン、containerd、Docker Compose をインストールします。
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
  1. hello-world イメージを実行してインストールを確認します。
sudo docker run hello-world

Docker の設定

Docker のインストール後、ニーズに合わせて設定できます。一般的な設定オプションを以下に示します。

  1. 非ルートユーザーによる Docker の管理: デフォルトでは、Docker コマンドはルート権限が必要です。sudo なしで Docker コマンドを実行するには、ユーザーを docker グループに追加します。
sudo usermod -aG docker $USER
  1. Docker デーモンのデフォルトオプションの設定: /etc/docker/daemon.json ファイルを編集することで、Docker デーモンの動作をカスタマイズできます。たとえば、デフォルトのログドライバを変更するには:
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "5"
  }
}
  1. Docker Compose の設定: Docker Compose は、複数のコンテナからなる Docker アプリケーションを定義および実行するためのツールです。~/.docker/config.json ファイルを編集することで、Docker Compose のデフォルト動作を設定できます。

Docker のインストールと設定が完了したので、Docker コンテナの実行に進みましょう。

Docker コンテナの実行:基本

Docker イメージの理解

Docker イメージは、Docker コンテナを作成するための指示が含まれた読み取り専用のテンプレートです。イメージは、アプリケーションとそのすべての依存関係をパッケージ化し、基盤となるインフラストラクチャに関係なくアプリケーションが同じように動作することを保証するために使用されます。

独自の Docker イメージを作成するか、Docker Hub(Docker イメージの公開リポジトリ)から事前に構築されたイメージを使用できます。

Docker コンテナの実行

Docker コンテナを実行するには、docker run コマンドを使用します。Docker コンテナで nginx Web サーバーを実行する例を次に示します。

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

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

  • docker run: 新しい Docker コンテナを実行します。
  • -d: コンテナをデタッチモードで実行します。つまり、バックグラウンドで実行します。
  • -p 80:80: ホストマシンのポート 80 をコンテナのポート 80 にマッピングします。
  • --name my-nginx: コンテナに名前 "my-nginx" を割り当てます。
  • nginx: 使用する Docker イメージの名前です。

実行中のコンテナのリスト表示

実行中の Docker コンテナのリストを表示するには、docker ps コマンドを使用します。

docker ps

これにより、コンテナ ID、使用されたイメージ、実行中のコマンド、作成日時、状態、ポートなど、実行中のコンテナに関する情報を含む表が表示されます。

実行中のコンテナの検査

実行中のコンテナの詳細な情報を取得するには、docker inspect コマンドを使用します。

docker inspect my-nginx

これにより、コンテナの構成、ネットワーク設定、リソース使用量など、コンテナの詳細な情報を含む JSON オブジェクトが出力されます。

次のセクションでは、Docker コンテナとやり取りする方法について説明します。

Docker コンテナとの対話

コンテナのシェルへのアクセス

実行中の Docker コンテナのシェルにアクセスするには、docker exec コマンドを使用します。

docker exec -it my-nginx bash

これにより、my-nginx コンテナ内の対話型ターミナルセッションが開き、コンテナ内でコマンドを実行できます。

コンテナ間でのファイルのコピー

ホストシステムと Docker コンテナ間でファイルをコピーするには、docker cp コマンドを使用します。

## ホストからコンテナへのファイルのコピー
docker cp /path/on/host my-nginx:/path/in/container

## コンテナからホストへのファイルのコピー
docker cp my-nginx:/path/in/container /path/on/host

コンテナ出力のログ

実行中の Docker コンテナのログを表示するには、docker logs コマンドを使用します。

docker logs my-nginx

これにより、コンテナの標準出力 (stdout) と標準エラー (stderr) ログが表示されます。

コンテナのリソース使用状況の監視

Docker コンテナのリソース使用状況を監視するには、docker stats コマンドを使用します。

docker stats my-nginx

これにより、my-nginx コンテナの CPU、メモリ、ネットワーク、ディスク I/O 使用状況のライブストリームが表示されます。

実行中のコンテナへの接続

実行中の Docker コンテナの標準入力、出力、エラーストリームに接続するには、docker attach コマンドを使用します。

docker attach my-nginx

これにより、ターミナルがコンテナの標準ストリームに接続され、実行中のアプリケーションと対話できます。

次のセクションでは、Docker コンテナの停止、起動、削除方法について説明します。

コンテナの停止、起動、削除

実行中のコンテナの停止

実行中の Docker コンテナを停止するには、docker stop コマンドを使用します。

docker stop my-nginx

これにより、コンテナは必要なクリーンアップタスクを実行してから停止するため、適切に停止します。

停止したコンテナの起動

停止した Docker コンテナを起動するには、docker start コマンドを使用します。

docker start my-nginx

これにより、コンテナは最初に実行されたときと同じ構成を使用して起動します。

コンテナの削除

Docker コンテナを削除するには、docker rm コマンドを使用します。

docker rm my-nginx

これにより、コンテナはシステムから削除されますが、関連付けられた Docker イメージは削除されません。

複数のコンテナの削除

複数のコンテナを一度に削除するには、docker rm コマンドに -f (強制) オプションを使用します。

docker rm -f container1 container2 container3

これにより、指定されたコンテナは実行中でも強制的に削除されます。

停止したコンテナの削除

停止したすべての Docker コンテナを削除するには、次のコマンドを使用できます。

docker container prune

これにより、停止したすべてのコンテナが削除され、システム上のディスク容量が解放されます。

次のセクションでは、Docker コンテナのいくつかの実用的なアプリケーションについて説明します。

Docker コンテナの実用的な活用例

Web アプリケーションのデプロイ

Docker コンテナの最も一般的な用途の 1 つは、Web アプリケーションのデプロイです。Docker を使用すると、アプリケーションとその依存関係を 1 つのコンテナにパッケージ化し、開発、ステージング、本番環境など、さまざまな環境に簡単にデプロイできます。

マイクロサービスアーキテクチャ

Docker は、マイクロサービスベースのアプリケーションの構築とデプロイに適しています。各マイクロサービスは個別のコンテナにパッケージ化できるため、アプリケーションの個々のコンポーネントを簡単にスケール、更新、保守できます。

CI/CD (継続的インテグレーション/継続的デリバリー)

Docker は CI/CD パイプラインと連携しやすく、一貫性と自動化された方法でアプリケーションを構築、テスト、デプロイできます。Docker コンテナは、ビルド環境、テスト環境、デプロイ対象として使用できます。

データ処理と分析

Docker コンテナは、バッチ処理、ストリーミング処理、機械学習など、データ処理と分析のワークロードを実行するために使用できます。処理パイプライン全体をコンテナにパッケージ化することで、さまざまな環境間で一貫性と移植性を確保できます。

開発およびテスト環境

Docker を使用すると、一貫性があり隔離された開発およびテスト環境を作成できます。開発者は Docker を使用してローカル開発環境を設定し、QA チームは Docker を使用して標準化されたテスト環境を作成できます。

サーバーレスコンピューティング

Docker は、アプリケーションが個々のコンテナとしてデプロイおよびスケールされ、基盤となるインフラストラクチャを管理する必要がない、サーバーレスコンピューティングプラットフォームの基盤として使用できます。

IoT (モノのインターネット)

Docker の軽量性と移植性により、リソースが限られたデバイスがある IoT アプリケーションに適しています。Docker コンテナを使用して、IoT アプリケーションをデバイス群全体にパッケージ化およびデプロイできます。

次のセクションでは、Docker コンテナの管理に関するベストプラクティスについて説明します。

Docker コンテナの管理ベストプラクティス

軽量なベースイメージの使用

独自の Docker イメージを作成する際は、alpinescratch などの軽量なベースイメージを使用し、コンテナのサイズを小さくし、パフォーマンスを向上させましょう。

Dockerfile レイヤの最適化

Dockerfile を整理し、Docker のレイヤキャッシュ機構を活用しましょう。関連する指示をまとめて、レイヤ数を減らし、ビルド時間を短縮します。

環境変数による設定

データベース接続文字列や API キーなどの設定データを、アプリケーションコードや Dockerfile にハードコーディングするのではなく、環境変数に格納しましょう。

ロギングとモニタリングの実装

Docker コンテナを構成し、重要なイベントやメトリクスをログに記録し、Prometheus、Grafana、または ELK スタックなどのツールを使用して、コンテナの健康状態とパフォーマンスを監視しましょう。

コンテナの機密情報の管理

Docker Secrets や HashiCorp Vault などのツールを使用して、コンテナが必要とするパスワードや API キーなどの機密データを安全に管理しましょう。

コンテナライフサイクルの自動化

CI/CD パイプラインに Docker を統合し、コンテナのビルド、テスト、デプロイを自動化しましょう。Docker Compose、Kubernetes、または LabEx などのツールを使用して、コンテナのライフサイクルを管理します。

コンテナのセキュリティ強化

Docker デーモンとコンテナを安全に保つために、ベストプラクティスに従いましょう。たとえば、非ルートユーザーとしてコンテナを実行し、読み取り専用ファイルシステムを使用し、ネットワークポリシーを実装します。

コンテナのリソース使用量の最適化

コンテナのリソース使用量を監視し、リソース割り当てを最適化して、インフラストラクチャの効率的な利用を確保しましょう。

コンテナの衛生管理

定期的に未使用の Docker イメージとコンテナを削除して、ディスク容量を解放し、健全な Docker 環境を維持しましょう。

これらのベストプラクティスに従うことで、Docker コンテナを効果的に管理および維持し、信頼性が高く効率的なアプリケーションのデプロイと運用を確保できます。

まとめ

このチュートリアル「Docker コンテナを迅速に実行および終了する:ビギナーガイド」を終了するまでに、Docker の基本的な理解と、Docker コンテナを迅速に実行、操作、終了する能力を身につけることができます。また、Docker 環境を管理するための貴重なベストプラクティスも学び、開発およびデプロイプロセスを効率化できます。