はじめに
この包括的な Docker チュートリアルは、開発者と IT 専門家を対象に、コンテナ化技術を深く理解するためのものです。Docker のコアコンセプト、アーキテクチャ、そして実践的な実装戦略を探求することで、学習者は、異なるコンピューティング環境全体でアプリケーションをパッケージ化、デプロイ、管理する実用的なスキルを習得します。
Docker の基礎
Docker とは何か?
Docker は、アプリケーションのデプロイと開発を革新する強力なコンテナ化プラットフォームです。オープンソース技術として、Docker は開発者が異なるコンピューティング環境間でアプリケーションを一貫してパッケージ化、配布、実行することを可能にします。
Docker のコアコンセプト
コンテナと仮想マシン
graph TD
A[物理ハードウェア] --> B[Docker コンテナ]
A --> C[仮想マシン]
B --> D[軽量]
B --> E[共有 OS カーネル]
C --> F[重厚]
C --> G[完全な OS オーバーヘッド]
| 機能 | Docker コンテナ | 仮想マシン |
|---|---|---|
| リソース使用量 | 軽量 | リソース集約的 |
| 起動時間 | 数秒 | 数分 |
| 隔離レベル | プロセスレベル | システム全体 |
Docker アーキテクチャ
Docker は、クライアント - サーバーアーキテクチャを採用し、主要なコンポーネントを備えています。
- Docker デーモン
- Docker クライアント
- Docker レジストリ
- Docker イメージ
- Docker コンテナ
基本的な Docker コマンド
Ubuntu 22.04 に Docker をインストールする手順:
## システムパッケージを更新する
sudo apt update
## Docker の依存関係をインストールする
sudo apt install apt-transport-https ca-certificates curl software-properties-common
## Docker の公式 GPG キーを追加する
curl -fsSL | 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] $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
## Docker エンジンをインストールする
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
## Docker のインストールを確認する
sudo docker --version
最初のコンテナの実行
## Ubuntu イメージをプルする
sudo docker pull ubuntu:latest
## 対話型のコンテナを実行する
sudo docker run -it ubuntu:latest /bin/bash
## 実行中のコンテナを表示する
sudo docker ps
## 全てのコンテナを表示する
sudo docker ps -a
イメージの管理
## イメージを検索する
sudo docker search nginx
## イメージをダウンロードする
sudo docker pull nginx
## ローカルイメージを表示する
sudo docker images
コンテナのネットワーク
Docker ネットワークの種類
graph TD
A[Docker ネットワークの種類] --> B[ブリッジネットワーク]
A --> C[ホストネットワーク]
A --> D[なしネットワーク]
A --> E[オーバーレイネットワーク]
| ネットワークの種類 | 説明 | 使用例 |
|---|---|---|
| ブリッジ | デフォルトネットワーク | コンテナ間の隔離された通信 |
| ホスト | 直接ホストネットワーク | パフォーマンス重視のアプリケーション |
| なし | ネットワークアクセスなし | 完全なコンテナの隔離 |
| オーバーレイ | マルチホストネットワーク | 分散型コンテナシステム |
ポートマッピングの手法
基本的なポートマッピング
## コンテナポート 80 をホストポート 8080 にマッピングする
sudo docker run -p 8080:80 nginx
## 複数のポートをマッピングする
sudo docker run -p 8080:80 -p 3306:3306 myapp
ネットワーク管理コマンド
## Docker ネットワークの一覧を表示する
sudo docker network ls
## カスタムネットワークを作成する
sudo docker network create mynetwork
## コンテナをネットワークに接続する
sudo docker network connect mynetwork mycontainer
## ネットワークの詳細を表示する
sudo docker network inspect bridge
高度なネットワークシナリオ
## カスタムブリッジネットワークを作成する
sudo docker network create --driver bridge isolated_network
## カスタムネットワーク内でコンテナを実行する
sudo docker run -d --name web1 --network isolated_network nginx
sudo docker run -d --name web2 --network isolated_network httpd
ネットワーク隔離戦略
## 外部ネットワークアクセスを無効にする
sudo docker run --network none mycontainer
## ホストネットワークを直接使用する
sudo docker run --network host mycontainer
コンテナの DNS 解決
## コンテナ間の自動 DNS を有効にする
sudo docker run --name db-container mysql
sudo docker run --name app-container --link db-container:database myapp
Docker の高度なテクニック
コンテナのリソース管理
graph TD
A[リソース管理] --> B[CPU 制限]
A --> C[メモリ制約]
A --> D[ストレージのクォータ]
リソース割り当ての例
## コンテナを 1 CPU コアと 512MB メモリに制限する
sudo docker run -it --cpus=1 --memory=512m ubuntu /bin/bash
## メモリとスワップの制限を設定する
sudo docker run -it --memory=1g --memory-swap=2g ubuntu /bin/bash
Docker Compose によるマルチコンテナデプロイ
version: "3"
services:
web:
image: nginx
ports:
- "8080:80"
database:
image: postgres
environment:
POSTGRES_PASSWORD: mysecretpassword
セキュリティのベストプラクティス
| セキュリティ手法 | 実装方法 |
|---|---|
| ルート以外のコンテナ | Dockerfile で USER 指令を使用 |
| 読み取り専用ファイルシステム | ボリュームマウントに :ro フラグを追加 |
| コンテナの機能制限 | --cap-drop と --cap-add を使用 |
Docker Swarm によるコンテナオーケストレーション
## Swarm クラスタを初期化する
sudo docker swarm init
## リプリカ付きサービスを作成する
sudo docker service create --replicas 3 --name web nginx
## サービスを動的にスケールする
sudo docker service scale web=5
高度なネットワーク設定
## サブネット付きカスタムネットワークを作成する
sudo docker network create \
--driver bridge \
--subnet 192.168.0.0/24 \
--gateway 192.168.0.1 \
custom_network
コンテナの監視とログ
## リアルタイムコンテナログ
sudo docker logs -f container_name
## コンテナメトリクスを調べる
sudo docker stats container_name
## ログファイルのサイズ制限
sudo docker run --log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
nginx
Dockerfile の最適化テクニック
## マルチステージビルド
FROM maven:3.8.1-openjdk-11 AS build
COPY src /home/app/src
COPY pom.xml /home/app
RUN mvn -f /home/app/pom.xml clean package
FROM openjdk:11-jre-slim
COPY --from=build /home/app/target/app.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
まとめ
Docker は、軽量で移植性が高く効率的なコンテナ化ソリューションを提供することで、ソフトウェアのデプロイ方法に革命をもたらします。Docker の基本的な概念、アーキテクチャ、およびコマンドラインテクニックを習得することで、開発者はアプリケーション開発を効率化し、システムの一貫性を向上させ、全体的なインフラストラクチャのスケーラビリティとパフォーマンスを強化できます。



