はじめに
この包括的なチュートリアルでは、内部ホスト上で Docker コンテナをデプロイする手順を案内します。Docker に初めて触れる方でも、経験豊富なユーザーの方でも、Docker のインストール、コンテナの作成と設定、組織のインフラストラクチャ内での効果的な管理方法を学ぶことができます。このガイドの終わりまでに、Docker の力を活用して、ホスト Docker 内部でのアプリケーションのデプロイと管理を効率化するための知識とスキルを習得しているでしょう。
Docker コンテナの理解
Docker は、コンテナを使用してアプリケーションの開発、デプロイ、管理を可能にする、人気のオープンソースプラットフォームです。コンテナは、アプリケーションを実行するために必要なすべての依存関係、ライブラリ、設定を含む、軽量で独立した実行可能なソフトウェアパッケージです。
Docker コンテナとは?
Docker コンテナは、アプリケーションとそのすべての依存関係を単一のポータブルなユニットにパッケージ化し、Docker がインストールされている任意のシステムに簡単にデプロイして実行できる方法です。コンテナは、アプリケーションが実行される基盤となるインフラストラクチャに関係なく、アプリケーションが同じように動作することを保証する、一貫性と信頼性の高い環境を提供します。
Docker コンテナの利点
- 移植性: Docker コンテナは、開発、テスト、本番環境など、さまざまな環境間で簡単に移動できます。互換性の問題を心配する必要はありません。
- スケーラビリティ: Docker コンテナは、アプリケーションのリソース要件に基づいて簡単にスケールアップまたはスケールダウンできます。需要の変動に対応しやすくなります。
- 効率性: Docker コンテナは、従来の仮想マシンよりも軽量で効率的です。ホストオペレーティングシステムを共有し、アプリケーションの実行に必要なコンポーネントのみを含みます。
- 一貫性: Docker コンテナは、さまざまな環境でアプリケーションが同じように動作することを保証します。予期しない動作やエラーのリスクを軽減します。
Docker コンテナアーキテクチャ
graph TD
A[Docker ホスト] --> B[Docker エンジン]
B --> C[Docker イメージ]
B --> D[Docker コンテナ]
D --> E[アプリケーション]
Docker コンテナアーキテクチャの主要なコンポーネントは次のとおりです。
- Docker ホスト: Docker エンジンを実行し、Docker コンテナをホストする物理または仮想マシン。
- Docker エンジン: Docker プラットフォームの中核であり、Docker コンテナの作成、実行、ライフサイクルの管理を担当します。
- Docker イメージ: Docker コンテナを作成するために使用されるテンプレートで、アプリケーションコード、依存関係、設定が含まれています。
- Docker コンテナ: アプリケーションとその依存関係をカプセル化する、Docker イメージの実行インスタンスです。
Docker コンテナのデプロイワークフロー
- Docker イメージのビルド: Dockerfile にアプリケーションの依存関係、設定、ビルド手順を定義することで、Docker イメージを作成します。
- Docker イメージのプッシュ: Docker Hub やプライベートレジストリなどのコンテナレジストリに Docker イメージをアップロードし、デプロイのためにアクセスできるようにします。
- Docker コンテナのデプロイ: レジストリから Docker イメージをプルし、ターゲットの Docker ホスト上でコンテナとして実行します。
- コンテナの管理と監視: スケール、更新、パフォーマンスと状態の監視など、実行中のコンテナのライフサイクルを管理します。
Docker コンテナの基本を理解することで、以降のセクションで説明する、内部ホストへのデプロイと管理を始めることができます。
内部ホストへの Docker インストール
前提条件
内部ホストに Docker をインストールする前に、以下の条件を満たしていることを確認してください。
- Linux ベースのオペレーティングシステム (例:Ubuntu 22.04)
- Docker のインストールおよび設定を行うためのルート権限または sudo 権限
Ubuntu 22.04 への Docker インストール
- パッケージインデックスを更新し、必要な依存関係をインストールします。
sudo apt-get update
sudo apt-get install -y \
ca-certificates \
curl \
gnupg \
lsb-release
- 公式 Docker GPG キーを追加し、Docker リポジトリを設定します。
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
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
- Docker エンジン、Docker CLI、Docker Compose をインストールします。
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
- 次のコマンドを実行してインストールを確認します。
sudo docker run hello-world
これにより、テストイメージがダウンロードされ、コンテナ内で実行されます。Docker が正しくインストールされ、機能していることを確認します。
内部ホスト向け Docker の設定
ネットワーク設定: Docker はデフォルトで
bridgeネットワークドライバを使用し、コンテナ専用のプライベートネットワークを作成します。他のホストまたはインターネットからコンテナにアクセスする必要がある場合は、ネットワーク設定を適切に構成する必要があります。ストレージ設定: Docker はデフォルトで、コンテナデータを
/var/lib/dockerディレクトリに保存します。専用のストレージボリュームやネットワーク接続ストレージなど、ニーズに合わせてストレージドライバと場所を設定できます。ユーザー権限: Docker コマンドを実行するたびに
sudoを使用しなくても済むように、ユーザーアカウントをdockerグループに追加できます。
sudo usermod -aG docker $USER
変更が有効になるように、ログアウトしてログインし直してください。
- プロキシ設定: 内部ホストがインターネットにアクセスするためにプロキシが必要な場合は、Docker デーモンがプロキシ設定を使用するように設定する必要があります。これは、systemd 設定ファイルを作成することで行うことができます。
これらの手順に従うことで、内部ホストに Docker を正常にインストールし、Docker コンテナのデプロイの準備が整います。
Docker コンテナの作成と設定
Docker イメージのビルド
Docker コンテナを作成するには、最初に Docker イメージをビルドする必要があります。これは、Dockerfile にアプリケーションの依存関係、設定、ビルド手順を定義することで行われます。
シンプルな Node.js アプリケーションの例を示します。
## 公式 Node.js イメージをベースとする
FROM node:14
## 作業ディレクトリを /app に設定
WORKDIR /app
## package.json と package-lock.json ファイルをコピー
COPY package*.json ./
## アプリケーション依存関係をインストール
RUN npm install
## アプリケーションコードをコピー
COPY . .
## アプリケーションをビルド
RUN npm run build
## アプリケーションポートを公開
EXPOSE 3000
## アプリケーションを起動
CMD ["npm", "start"]
以下のコマンドを使用して Docker イメージをビルドできます。
docker build -t my-node-app .
これにより、現在のディレクトリにある Dockerfile を基に、my-node-app という名前の新しい Docker イメージが作成されます。
Docker コンテナの実行
作成したイメージから Docker コンテナを実行するには、以下のコマンドを使用します。
docker run -d -p 8080:3000 --name my-node-container my-node-app
このコマンドは、以下のことを行います。
- デタッチモード (
-d) でコンテナを実行 - ホストポート 8080 をコンテナポート 3000 にマッピング (
-p 8080:3000) - 実行中のコンテナに名前
my-node-containerを割り当てる my-node-appイメージを使用してコンテナを起動
Docker コンテナの設定
Docker コンテナのさまざまな側面を設定できます。
- 環境変数:
-eまたは--envフラグを使用して環境変数を設定します。例:docker run -e DB_PASSWORD=mypassword ... - ボリューム:
-vまたは--volumeフラグを使用して、ホストディレクトリまたは名前付きボリュームをコンテナにマウントします。例:docker run -v /host/path:/container/path ... - ネットワーク設定:
--networkフラグを使用して、コンテナを特定のネットワークに接続します。例:docker run --network my-network ... - リソース制限:
--cpus,--memory, または--blkio-weightフラグを使用して、CPU、メモリ、I/O などのコンテナのリソース制限を設定します。例:docker run --cpus 2 --memory 512m ...
Docker イメージのビルド方法と、さまざまな設定で Docker コンテナを実行する方法を理解することで、内部ホストにアプリケーションをデプロイできます。
内部ホストへの Docker コンテナのデプロイ
内部ホストの準備
内部ホストに Docker コンテナをデプロイする前に、以下の手順を完了していることを確認してください。
- 前述のセクションに従って、内部ホストに Docker をインストールします。
- 内部ホストが、データベース、外部サービス、またはインターネット(必要に応じて)などの必要なリソースにアクセスするための必要なネットワーク接続とファイアウォールルールを備えていることを確認します。
- (オプション)パブリックレジストリ(Docker Hub など)を使用しない場合、プライベートなコンテナレジストリを設定して、Docker イメージを格納します。
Docker コンテナのデプロイ
内部ホストへの Docker コンテナのデプロイ方法は、具体的な要件とインフラストラクチャの設定によって異なります。
Docker CLI の使用
Docker コンテナをデプロイする最も簡単な方法は、Docker コマンドラインインターフェース (CLI) を内部ホストで直接使用することです。以前作成した my-node-app コンテナをデプロイする例を次に示します。
docker run -d -p 8080:3000 --name my-node-container my-node-app
このコマンドは、コンテナをデタッチモードで起動し、ホストポート 8080 をコンテナポート 3000 にマッピングします。
Docker Compose の使用
複数のコンテナやサービスを含むより複雑なデプロイメントの場合、Docker Compose を使用できます。docker-compose.yml ファイルを作成してサービスとその設定を定義し、以下のコマンドを使用してスタックをデプロイします。
docker-compose up -d
これにより、docker-compose.yml ファイルで定義されているすべてのコンテナがデタッチモードで起動されます。
コンテナオーケストレーションプラットフォームの使用
大規模な本番環境のデプロイメントの場合、Kubernetes や LabEx プラットフォームなどのコンテナオーケストレーションプラットフォームを使用することを検討する必要があります。これらのプラットフォームは、複数のホスト全体で Docker コンテナを管理、スケーリング、監視するための高度な機能を提供します。
コンテナオーケストレーションプラットフォームを使用して Docker コンテナをデプロイするには、必要な設定ファイル(例:Kubernetes マニフェスト)を定義し、プラットフォームの CLI または Web ベースのインターフェースを使用してコンテナをデプロイする必要があります。
デプロイの検証
Docker コンテナをデプロイした後、以下のコマンドを使用して、そのステータスを確認し、実行中のアプリケーションにアクセスできます。
## 実行中のコンテナのリスト
docker ps
## コンテナログの表示
docker logs my-node-container
## 実行中のアプリケーションへのアクセス
curl http://localhost:8080
これらの手順に従うことで、Docker コンテナを内部ホストに正常にデプロイし、ユーザーまたは他のアプリケーションからアクセスできるようにすることができます。
Docker コンテナの管理と監視
Docker コンテナの管理
Docker コンテナがデプロイされたら、そのライフサイクル(起動、停止、スケーリング、更新など)を管理する必要があります。一般的な Docker 管理コマンドを以下に示します。
## コンテナの起動
docker start my-node-container
## コンテナの停止
docker stop my-node-container
## コンテナの再起動
docker restart my-node-container
## コンテナレプリカの増減
docker scale my-node-container=3
## 新しいイメージへのコンテナの更新
docker pull my-node-app:v2
docker stop my-node-container
docker run -d -p 8080:3000 --name my-node-container my-node-app:v2
Docker コンテナの監視
Docker コンテナの健康状態とパフォーマンスを監視することは、アプリケーションの信頼性とスケーラビリティを確保するために不可欠です。さまざまなツールとテクニックを使用して、Docker 環境を監視できます。
Docker CLI
Docker CLI は、基本的な監視コマンドを提供します。
## 実行中のコンテナのリスト
docker ps
## コンテナログの表示
docker logs my-node-container
## コンテナの詳細の確認
docker inspect my-node-container
Docker メトリクス
Docker は、Docker API を使用するか、監視ツールと統合することでアクセスできる組み込みメトリクスを提供します。コンテナの CPU、メモリ、ネットワーク、ストレージ使用量などのメトリクスを収集できます。
第三者監視ツール
LabEx プラットフォーム、Prometheus、または Grafana などのサードパーティの監視ツールを使用して、より高度な Docker メトリクスを収集および視覚化できます。これらのツールは、Docker 環境全体の健康状態とパフォーマンスを監視するのに役立ちます。
LabEx プラットフォームを使用して Docker コンテナを監視する方法の例を次に示します。
graph TD
A[内部ホスト] --> B[Docker コンテナ]
B --> C[LabEx エージェント]
C --> D[LabEx プラットフォーム]
D --> E[監視ダッシュボード]
LabEx プラットフォームは、コンテナレベルのメトリクスを追跡し、アラートを設定し、カスタムレポートを生成できる、Docker 環境向けの包括的な監視ソリューションを提供します。
これらの管理および監視ツールを活用することで、内部ホスト上で実行されている Docker コンテナを効果的に維持および最適化できます。
Docker コンテナのネットワークとストレージ
Docker コンテナのネットワーク
Docker は、コンテナ間の接続と分離のために、いくつかのネットワークドライバを提供します。
- ブリッジネットワーク: ホスト上でコンテナ用のプライベートネットワークを作成する、デフォルトのネットワークドライバです。
- ホストネットワーク: コンテナがホストのネットワークスタックを使用できるようにし、ネットワークの分離を効果的に取り除きます。
- オーバーレイネットワーク: 複数の Docker ホスト間でコンテナ間の通信を可能にし、クラスタリングやオーケストレーションに便利です。
- Macvlan ネットワーク: コンテナに MAC アドレスを割り当てることができ、ネットワーク上で物理的なデバイスとして表示されます。
以下のコマンドを使用して、Docker ネットワークを作成および管理できます。
## 新しいブリッジネットワークを作成
docker network create my-network
## コンテナをネットワークに接続
docker run -d --name my-container --network my-network my-node-app
## ネットワークの詳細を表示
docker network inspect my-network
Docker コンテナのストレージ
Docker コンテナはデフォルトでホストのファイルシステムを使用してデータを保存しますが、このデータは一時的なものであり、コンテナが削除されると失われます。データを永続化するには、コンテナのライフサイクルとは独立した Docker ボリュームを使用できます。
Docker ボリュームにはいくつかの種類があります。
- 名前付きボリューム: Docker によって管理される、一意の名前を持つボリュームです。
- バインドマウント: ホスト上のディレクトリをコンテナ内のディレクトリにマッピングします。
- tmpfs マウント: コンテナのメモリ内に一時的なファイルシステムを作成します。
名前付きボリュームを作成し、コンテナにマウントする例を次に示します。
## 名前付きボリュームを作成
docker volume create my-volume
## 名前付きボリュームをマウントしてコンテナを実行
docker run -d --name my-container -v my-volume:/app my-node-app
ネットワーク接続ストレージ (NAS) やクラウドストレージサービスも、Docker コンテナの永続的なストレージのために使用できます。
Docker のネットワークとストレージのオプションを理解することで、コンテナが適切に接続され、データが確実に保存およびアクセスされることを確認できます。
Docker コンテナデプロイのベストプラクティス
内部ホスト上で Docker コンテナをデプロイする際には、アプリケーションの信頼性、セキュリティ、スケーラビリティを確保するために、ベストプラクティスに従うことが重要です。以下に考慮すべき重要なベストプラクティスをいくつか示します。
すべてをコンテナ化
すべてのアプリケーションとサービスを Docker コンテナとしてパッケージ化することで、「すべてをコンテナ化」のアプローチを採用します。これにより、一貫性、移植性、さまざまな環境での管理の容易さが確保されます。
イミュタブルなインフラストラクチャを使用する
Docker コンテナをイミュタブルなインフラストラクチャとして扱うことを意味し、実行中のコンテナに直接変更を加えるべきではありません。代わりに、Dockerfile を更新し、イメージを再構築して変更をデプロイします。
Docker イメージの最適化
Docker イメージを最適化するには、以下の点に注意します。
- 可能な限り小さなベースイメージを使用する
- Dockerfile のレイヤー数を最小限にする
- マルチステージビルドを活用してイメージサイズを削減する
- 定期的にベースイメージをスキャンし、セキュリティ脆弱性を更新する
セキュアな運用を実装する
Docker 環境のセキュリティを確保するには、以下の点に注意します。
- Docker イメージの署名と検証
- イメージの脆弱性スキャン
- コンテナの権限と機能を制限する
- AppArmor や SELinux などのセキュリティ機能を有効にする
シークレットを安全に管理する
API キー、データベース資格情報、SSL/TLS 証明書などの機密情報を、LabEx Vault や HashiCorp Vault などのセキュアなシークレット管理ソリューションを使用して保存および管理します。
コンテナを監視し、ログを記録する
Docker コンテナの健康状態、パフォーマンス、発生する可能性のある問題に関する可視性を確保するために、包括的な監視とログ記録を実装します。LabEx プラットフォームなどのツールは、この点で大きな助けとなります。
コンテナオーケストレーションを使用する
本番環境のデプロイでは、LabEx プラットフォームや Kubernetes などのコンテナオーケストレーションプラットフォームを活用して、Docker コンテナのスケーリング、高可用性、ライフサイクルを管理します。
デプロイワークフローを自動化する
Docker Compose、Jenkins、または LabEx プラットフォームなどのツールを使用して、Docker コンテナのデプロイワークフローを自動化することで、一貫性、再現性、効率性を確保します。
これらのベストプラクティスに従うことで、内部ホスト上の Docker コンテナデプロイを信頼性、セキュリティ、スケーラブルなものにすることができます。
まとめ
このチュートリアルでは、内部ホスト上で Docker コンテナをデプロイする方法を学びました。Docker のインストールから、Docker コンテナの作成、設定、管理まで、必須手順を網羅しました。これらのベストプラクティスに従うことで、Docker の利点を効率的に活用し、ホスト Docker 上でのアプリケーションのデプロイと管理を効率化できます。習得した知識を基に、Docker のスキルをさらに探求し、組織のインフラストラクチャとワークフローを強化し続けることができます。



