Dockerとは
Dockerは、アプリケーションを開発・配布・実行するためのオープンプラットフォームです。 コンテナと呼ばれる軽量な実行環境を使用することで、以下のような利点があります:
- 環境の統一化と再現性の向上
- 開発環境のセットアップ時間の短縮
- 本番環境との一貫性の確保
- マイクロサービスアーキテクチャの実現
- スケーラビリティの向上
仮想マシンとの違い
仮想マシン(VM)は、ハードウェアレベルの仮想化を行いますが、 Dockerはコンテナ型の仮想化技術を使用します。コンテナはホストOSのカーネルを 共有するため、VMと比べて以下の利点があります:
- 起動が高速(数秒単位)
- リソース消費が少ない
- イメージサイズが小さい
- 移植性が高い
主要な概念
1. コンテナ
アプリケーションとその依存関係を含む、独立した実行環境です。 軽量で、素早く起動でき、一貫性のある動作を保証します。
2. イメージ
コンテナの実行に必要なファイルシステムやアプリケーションコードを パッケージ化したテンプレートです。
3. Dockerfile
イメージをビルドするための手順を記述したファイルです。 環境構築の手順を自動化できます。
4. Docker Compose
複数のコンテナを定義し、実行するためのツールです。 開発環境の構築やマイクロサービスの管理に便利です。
インストール手順
OSに応じたDockerのインストール方法を説明します:
Windows
# 1. WSL2のインストール
wsl --install
# 2. Docker Desktopのダウンロードとインストール
# https://www.docker.com/products/docker-desktop からダウンロード
# 3. インストール確認
docker --version
docker-compose --version
macOS
# Homebrewを使用したインストール
brew install --cask docker
# インストール確認
docker --version
docker-compose --version
Linux (Ubuntu)
# 依存パッケージのインストール
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
# Dockerの公式GPGキーを追加
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# リポジトリの設定
echo "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Dockerエンジンのインストール
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Dockerサービスの起動
sudo systemctl start docker
sudo systemctl enable docker
# 一般ユーザーでの実行権限付与
sudo usermod -aG docker $USER
基本的なコマンド
Dockerを使用する上で必要な基本的なコマンドを紹介します。
イメージ関連
# イメージの一覧表示
docker images
# イメージの取得
docker pull [イメージ名]:[タグ]
# イメージの削除
docker rmi [イメージID]
# 未使用イメージの一括削除
docker image prune
コンテナ関連
# コンテナの起動
docker run [オプション] [イメージ名]
# コンテナの停止
docker stop [コンテナID]
# コンテナの再起動
docker restart [コンテナID]
# コンテナの削除
docker rm [コンテナID]
# 全停止コンテナの削除
docker container prune
よく使用するdocker runのオプション
-d
: バックグラウンドで実行-p
: ポートマッピング-v
: ボリュームマウント-e
: 環境変数の設定--name
: コンテナ名の指定--network
: ネットワークの指定
Dockerfileの書き方
Dockerfileは、Dockerイメージをビルドするための設定ファイルです。 以下は、Node.jsアプリケーションのDockerfileの例です:
# ベースイメージの指定
FROM node:18-alpine
# 作業ディレクトリの設定
WORKDIR /app
# パッケージファイルのコピー
COPY package*.json ./
# 依存関係のインストール
RUN npm install
# ソースコードのコピー
COPY . .
# ビルド
RUN npm run build
# ポートの公開
EXPOSE 3000
# 起動コマンド
CMD ["npm", "start"]
Dockerfileのベストプラクティス
- マルチステージビルドの活用
- レイヤーの最小化
- .dockerignoreの適切な設定
- 最小限のベースイメージの使用
- キャッシュの効果的な活用
Docker Compose入門
Docker Composeは、複数のコンテナを定義し実行するためのツールです。 以下は、Node.jsアプリケーションとMongoDBを組み合わせた例です:
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- MONGODB_URI=mongodb://db:27017/myapp
depends_on:
- db
volumes:
- .:/app
- /app/node_modules
db:
image: mongo:latest
ports:
- "27017:27017"
volumes:
- mongodb_data:/data/db
volumes:
mongodb_data:
主なDocker Composeコマンド:
# サービスの起動
docker-compose up -d
# サービスの停止
docker-compose down
# サービスの再構築
docker-compose up -d --build
# ログの確認
docker-compose logs -f
ネットワーク設定
Dockerのネットワーク機能を使用することで、コンテナ間の通信を制御できます。
ネットワークの基本操作
# ネットワークの作成
docker network create my-network
# ネットワークの一覧表示
docker network ls
# ネットワークの詳細確認
docker network inspect my-network
# コンテナをネットワークに接続
docker network connect my-network my-container
# コンテナをネットワークから切断
docker network disconnect my-network my-container
ネットワークモード
bridge
: デフォルトのネットワークモードhost
: ホストのネットワークを直接使用none
: ネットワークを無効化overlay
: Swarmモードで使用する分散ネットワーク
データ永続化
Dockerボリュームを使用することで、コンテナのデータを永続化できます。
ボリュームの基本操作
# ボリュームの作成
docker volume create my-volume
# ボリュームの一覧表示
docker volume ls
# ボリュームの詳細確認
docker volume inspect my-volume
# ボリュームの削除
docker volume rm my-volume
# 未使用ボリュームの一括削除
docker volume prune
ボリュームの種類
named volume
: 名前付きボリュームbind mount
: ホストのディレクトリをマウントtmpfs mount
: 一時的なメモリ上のストレージ
ベストプラクティス
1. セキュリティ
- rootユーザーを避け、専用ユーザーを作成
- 最小権限の原則に従う
- 機密情報は環境変数で管理
- イメージの脆弱性スキャンを実施
2. パフォーマンス
- マルチステージビルドの活用
- 不要なファイルの除外
- キャッシュの効果的な利用
- 適切なベースイメージの選択
3. 運用管理
- 適切なタグ付けとバージョン管理
- ヘルスチェックの実装
- ログ管理の設定
- バックアップ戦略の策定
よくある失敗と対策
- イメージサイズの肥大化 → マルチステージビルドの活用
- 機密情報の漏洩 → .dockerignoreの適切な設定
- コンテナの永続化問題 → ボリュームの適切な使用
- ネットワーク設定ミス → ネットワークモードの理解
デプロイメント
1. クラウドプラットフォームへのデプロイ
AWS ECS/ECR
# ECRへのプッシュ
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com
docker tag my-app:latest $AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/my-app:latest
docker push $AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/my-app:latest
Google Cloud Run
# Container Registryへのプッシュ
gcloud auth configure-docker
docker tag my-app:latest gcr.io/$PROJECT_ID/my-app:latest
docker push gcr.io/$PROJECT_ID/my-app:latest
# Cloud Runへのデプロイ
gcloud run deploy my-app --image gcr.io/$PROJECT_ID/my-app:latest --platform managed
2. オーケストレーション
Kubernetes
# デプロイメントの作成
kubectl create deployment my-app --image=my-app:latest
# サービスの公開
kubectl expose deployment my-app --type=LoadBalancer --port=80
Docker Swarm
# Swarmの初期化
docker swarm init
# サービスのデプロイ
docker service create --name my-app --publish 80:80 my-app:latest
トラブルシューティング
よくある問題と解決方法
1. コンテナが起動しない
ログの確認とデバッグ方法:
# ログの確認
docker logs [コンテナID]
# 対話モードでのデバッグ
docker run -it --rm [イメージ名] sh
2. ネットワーク接続の問題
ネットワークのトラブルシューティング:
# ネットワークの確認
docker network ls
# ネットワーク詳細の確認
docker network inspect [ネットワーク名]
3. ディスク容量の問題
ディスク使用量の確認と掃除:
# ディスク使用量の確認
docker system df
# 未使用リソースの削除
docker system prune -a