はじめに
この包括的な Docker チュートリアルは、開発者と IT 専門家を対象に、コンテナ技術に関する深い理解を提供します。基本的な概念、アーキテクチャの原則、そして実践的な実装戦略について網羅的に解説します。Docker のコアメカニズムを理解することから、必須のコマンドを習得することまで、このガイドは、現代のソフトウェア開発とデプロイに Docker を活用するための構造化されたアプローチを提供します。
Docker の基礎
Docker 技術の概要
Docker は、ソフトウェアのデプロイと仮想化を革新する強力なコンテナ技術です。オープンソースプラットフォームとして、Docker は開発者が異なるコンピューティング環境間でアプリケーションを一貫してパッケージ化、配布、実行することを可能にします。
Docker のコア概念
コンテナと仮想マシン
graph TD
A[物理ハードウェア] --> B[Docker コンテナ]
A --> C[仮想マシン]
B --> D[軽量]
B --> E[共有カーネル]
C --> F[重厚]
C --> G[完全な OS]
| 機能 | Docker コンテナ | 仮想マシン |
|---|---|---|
| リソース使用量 | 軽量 | 重厚 |
| 起動時間 | 数秒 | 数分 |
| 隔離レベル | プロセスレベル | 完全な OS レベル |
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)] $(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 コマンドのデモ:
## イメージをプルする
docker pull ubuntu:latest
## イメージの一覧を表示する
docker images
## コンテナを実行する
docker run -it ubuntu:latest /bin/bash
## 実行中のコンテナの一覧を表示する
docker ps
## コンテナを停止する
docker stop [container_id]
Docker のユースケース
Docker 技術は、以下の場面で重要です。
- マイクロサービスアーキテクチャ
- CI/CD (継続的インテグレーション/継続的デリバリー)
- クラウドネイティブアプリケーション開発
- 一貫した開発環境
- スケーラブルなインフラストラクチャ管理
イメージ作成ガイド
Docker イメージの理解
Docker イメージは、コンテナを作成するために使用される読み取り専用のテンプレートです。アプリケーションの実行に必要なファイルシステムの変更と設定を表す複数のレイヤーで構成されています。
Dockerfile の基礎
graph TD
A[Dockerfile] --> B[ベースイメージ]
A --> C[環境設定]
A --> D[アプリケーションコード]
A --> E[設定]
A --> F[実行指示]
Dockerfile の構造
| 指令 | 説明 | 例 |
|---|---|---|
| FROM | ベースイメージを定義する | FROM ubuntu:22.04 |
| RUN | コマンドを実行する | RUN apt-get update |
| COPY | ファイルをコピーする | COPY ./app /application |
| WORKDIR | 作業ディレクトリを設定する | WORKDIR /application |
| EXPOSE | ネットワークポートを定義する | EXPOSE 8080 |
| CMD | コンテナのデフォルトコマンド | CMD ["python", "app.py"] |
サンプル Dockerfile の作成
## 公式 Ubuntu ベースイメージを使用
FROM ubuntu:22.04
## システムパッケージを更新
RUN apt-get update && apt-get install -y \
python3 \
python3-pip
## 作業ディレクトリを設定
WORKDIR /app
## アプリケーションファイルをコピー
COPY . /app
## 依存関係をインストール
RUN pip3 install -r requirements.txt
## アプリケーションポートを公開
EXPOSE 5000
## 起動コマンドを定義
CMD ["python3", "app.py"]
Docker ビルドプロセス
Docker コマンドを使用してイメージをビルドします。
## Docker イメージをビルド
docker build -t myapp:v1 .
## 作成されたイメージの一覧を表示
docker images
## 作成されたイメージを実行
docker run -p 5000:5000 myapp:v1
イメージレイヤーの管理
graph LR
A[ベースイメージレイヤー] --> B[更新レイヤー]
B --> C[依存関係レイヤー]
C --> D[アプリケーションコードレイヤー]
D --> E[設定レイヤー]
イメージレイヤーの最適化テクニック
- レイヤー数を最小限にする
- マルチステージビルドを使用する
- ビルドキャッシュを活用する
- 不要なファイルを削除する
- 特定のイメージタグを使用する
Docker の最適化
パフォーマンス最適化戦略
Docker の最適化は、コンテナのパフォーマンス向上、リソース消費量の削減、デプロイ効率の向上に焦点を当てています。
イメージサイズの削減
graph TD
A[大きなイメージ] --> B[マルチステージビルド]
A --> C[Alpine ベースイメージ]
A --> D[不要なファイルの削除]
イメージサイズの比較
| イメージタイプ | サイズ | ビルド時間 | パフォーマンス |
|---|---|---|---|
| 標準 Ubuntu | 500MB | 遅い | 低い |
| Alpine ベース | 50MB | 速い | 高い |
| マルチステージ | 100MB | 中間 | 最適 |
マルチステージビルドの例
## ビルドステージ
FROM golang:1.17 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o myapp
## プロダクションステージ
FROM alpine:latest
COPY --from=builder /app/myapp /usr/local/bin/
EXPOSE 8080
CMD ["myapp"]
コンテナのリソース管理
## CPU とメモリの制限を設定
docker run -d \
--cpus="1.5" \
--memory="512m" \
--memory-reservation="256m" \
myapp:latest
Docker Compose の最適化
version: "3.8"
services:
webapp:
build:
context: .
cache_from:
- myregistry.com/base-image
deploy:
resources:
limits:
cpus: "0.50"
memory: 512M
reservations:
cpus: "0.25"
memory: 256M
CI/CD 統合テクニック
## キャッシュ最適化を使用した Docker ビルド
docker build \
--cache-from myregistry.com/myapp:latest \
-t myapp:${CI_COMMIT_SHA} .
## 最適化されたイメージをプッシュ
docker push myregistry.com/myapp:${CI_COMMIT_SHA}
実行時パフォーマンス監視
## リアルタイムコンテナ統計情報
## コンテナのリソース使用状況
## コンテナのパフォーマンスを検査
まとめ
Docker は、ソフトウェア開発における画期的な技術であり、一貫性、効率性、スケーラビリティを備えたアプリケーションのデプロイを、多様なコンピューティング環境にわたって可能にします。コンテナ技術を習得することで、開発者はワークフローを効率化し、移植性を向上させ、リソース利用を最適化できます。Docker は、現代の DevOps およびクラウドネイティブアプリケーションアーキテクチャにおいて不可欠なツールです。



