Dockerとは完全ガイド
Dockerとは完全ガイド
Section titled “Dockerとは完全ガイド”Dockerは、コンテナ技術を使用してアプリケーションをパッケージ化し、どこでも同じように実行できるようにするツールです。実務で使える実装例とベストプラクティスを詳しく解説します。
1. Dockerとは
Section titled “1. Dockerとは”Dockerの役割
Section titled “Dockerの役割”Dockerは、アプリケーションとその依存関係をコンテナとしてパッケージ化し、どの環境でも同じように実行できるようにします。
開発環境 ↓(Dockerイメージ)本番環境(同じイメージで実行)なぜDockerが必要か
Section titled “なぜDockerが必要か”問題のある構成(Dockerなし):
# 問題: 環境依存の問題# 開発環境: Node.js 18, PostgreSQL 14# 本番環境: Node.js 16, PostgreSQL 13
# 問題点:# 1. 環境の違いによるバグ# 2. セットアップの手間# 3. 依存関係の管理が困難# 4. 再現性が低い解決: Dockerによるコンテナ化
# 解決: Dockerfileで環境を定義FROM node:18-alpineWORKDIR /appCOPY package*.json ./RUN npm ciCOPY . .EXPOSE 3000CMD ["npm", "start"]
# メリット:# 1. 環境の一貫性(どこでも同じ環境)# 2. 簡単なセットアップ(docker run だけで起動)# 3. 依存関係の管理(Dockerfileに記述)# 4. 高い再現性(同じイメージで同じ結果)2. コンテナと仮想マシンの違い
Section titled “2. コンテナと仮想マシンの違い”仮想マシン(VM)
Section titled “仮想マシン(VM)”物理サーバー ├─ ハイパーバイザー │ ├─ VM1(OS + アプリ) │ ├─ VM2(OS + アプリ) │ └─ VM3(OS + アプリ)特徴:
- OS全体を仮想化
- リソース消費が大きい
- 起動が遅い(数分)
コンテナ(Docker)
Section titled “コンテナ(Docker)”物理サーバー ├─ OS │ ├─ コンテナ1(アプリのみ) │ ├─ コンテナ2(アプリのみ) │ └─ コンテナ3(アプリのみ)特徴:
- OSのカーネルを共有
- リソース消費が小さい
- 起動が速い(数秒)
| 項目 | 仮想マシン | コンテナ |
|---|---|---|
| 起動時間 | 数分 | 数秒 |
| リソース消費 | 大きい | 小さい |
| 分離レベル | 高い | 中程度 |
| 移植性 | 中程度 | 高い |
3. Dockerの基本概念
Section titled “3. Dockerの基本概念”イメージは、アプリケーションとその依存関係を含む読み取り専用のテンプレートです。
# イメージのビルドdocker build -t my-app:latest .
# イメージの一覧表示docker images
# イメージの詳細確認docker inspect my-app:latest
# イメージの削除docker rmi my-app:latest
# 未使用のイメージを一括削除docker image prune -aコンテナは、イメージから作成された実行可能なインスタンスです。
# コンテナの起動docker run -d -p 3000:3000 --name my-app my-app:latest
# コンテナの一覧表示docker ps # 実行中docker ps -a # すべて
# コンテナの停止docker stop my-app
# コンテナの再起動docker restart my-app
# コンテナの削除docker rm my-app
# コンテナのログ確認docker logs my-appdocker logs -f my-app # リアルタイムDockerfile
Section titled “Dockerfile”Dockerfileは、イメージを構築するための手順を記述したファイルです。
# ベースイメージFROM node:18-alpine
# 作業ディレクトリの設定WORKDIR /app
# 依存関係のインストールCOPY package*.json ./RUN npm ci --only=production
# アプリケーションコードのコピーCOPY . .
# ポートの公開EXPOSE 3000
# アプリケーションの起動CMD ["npm", "start"]4. Docker Hub
Section titled “4. Docker Hub”Docker Hubとは
Section titled “Docker Hubとは”Docker Hubは、Dockerイメージを共有・管理するためのクラウドサービスです。
イメージのプッシュ
Section titled “イメージのプッシュ”# Docker Hubにログインdocker login
# イメージにタグを付けるdocker tag my-app:latest username/my-app:latest
# イメージをプッシュdocker push username/my-app:latestイメージのプル
Section titled “イメージのプル”# 公式イメージのプルdocker pull nginx:latest
# カスタムイメージのプルdocker pull username/my-app:latestプライベートレジストリ
Section titled “プライベートレジストリ”# プライベートレジストリの使用docker pull registry.example.com/my-app:latest
# プライベートレジストリへのプッシュdocker tag my-app:latest registry.example.com/my-app:latestdocker push registry.example.com/my-app:latest5. Docker Compose
Section titled “5. Docker Compose”Docker Composeとは
Section titled “Docker Composeとは”Docker Composeは、複数のコンテナを定義し、管理するためのツールです。
version: '3.8'
services: app: build: . ports: - "3000:3000" environment: - DATABASE_URL=postgresql://postgres:password@db:5432/mydb depends_on: - db
db: image: postgres:14-alpine environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: password POSTGRES_DB: mydb volumes: - postgres_data:/var/lib/postgresql/data
volumes: postgres_data:Docker Composeのコマンド
Section titled “Docker Composeのコマンド”# サービスの起動docker-compose up -d
# サービスの停止docker-compose down
# ログの確認docker-compose logs -f
# サービスの再ビルドdocker-compose up -d --build6. 実務でのベストプラクティス
Section titled “6. 実務でのベストプラクティス”パターン1: 環境の統一
Section titled “パターン1: 環境の統一”# 開発環境と本番環境で同じベースイメージを使用FROM node:18-alpine
# 環境変数で動作を切り替えENV NODE_ENV=productionパターン2: イメージのタグ付け
Section titled “パターン2: イメージのタグ付け”# バージョンタグdocker build -t my-app:v1.0.0 .
# 最新タグdocker build -t my-app:latest .
# 環境別タグdocker build -t my-app:dev .docker build -t my-app:staging .docker build -t my-app:prod .7. よくある問題と解決策
Section titled “7. よくある問題と解決策”問題1: コンテナが起動しない
Section titled “問題1: コンテナが起動しない”原因:
- ポートが既に使用されている
- 環境変数が設定されていない
解決策:
# ポートの使用状況を確認lsof -i :3000
# 環境変数を確認docker run -e DATABASE_URL=... my-app:latest
# ログを確認docker logs my-app問題2: イメージのビルドが遅い
Section titled “問題2: イメージのビルドが遅い”原因:
- キャッシュが効いていない
- 不要なファイルをコピーしている
解決策:
# .dockerignoreファイルを作成node_modules.git.env*.log
# Dockerfileの最適化# 依存関係のインストールを先に行う(キャッシュを活用)COPY package*.json ./RUN npm ciCOPY . .これで、Dockerの基礎知識と実務での使い方を理解できるようになりました。