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. Dockerの基本概念
Section titled “2. Dockerの基本概念”イメージは、アプリケーションとその依存関係を含む読み取り専用のテンプレートです。
# イメージのビルドdocker build -t my-app:latest .
# イメージの一覧表示docker images
# イメージの削除docker rmi my-app:latestコンテナは、イメージから作成された実行可能なインスタンスです。
# コンテナの起動docker run -d -p 3000:3000 my-app:latest
# コンテナの一覧表示docker ps
# コンテナの停止docker stop <container-id>
# コンテナの削除docker rm <container-id>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"]3. 実務でのDockerfile
Section titled “3. 実務でのDockerfile”マルチステージビルド
Section titled “マルチステージビルド”# ビルドステージFROM node:18-alpine AS builderWORKDIR /appCOPY package*.json ./RUN npm ciCOPY . .RUN npm run build
# 本番ステージFROM node:18-alpineWORKDIR /appCOPY package*.json ./RUN npm ci --only=productionCOPY --from=builder /app/dist ./distEXPOSE 3000CMD ["node", "dist/index.js"]セキュリティのベストプラクティス
Section titled “セキュリティのベストプラクティス”# 非rootユーザーで実行FROM node:18-alpineRUN addgroup -g 1001 -S nodejsRUN adduser -S nodejs -u 1001USER nodejsWORKDIR /appCOPY --chown=nodejs:nodejs . .EXPOSE 3000CMD ["node", "index.js"]4. Docker Compose
Section titled “4. 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 --build5. よくある問題と解決策
Section titled “5. よくある問題と解決策”問題1: イメージのビルドが遅い
Section titled “問題1: イメージのビルドが遅い”原因:
- キャッシュが効いていない
- 不要なファイルをコピーしている
解決策:
# .dockerignoreファイルを作成node_modules.git.env*.log
# Dockerfileの最適化# 依存関係のインストールを先に行う(キャッシュを活用)COPY package*.json ./RUN npm ciCOPY . .問題2: コンテナが起動しない
Section titled “問題2: コンテナが起動しない”原因:
- ポートが既に使用されている
- 環境変数が設定されていない
解決策:
# ポートの使用状況を確認lsof -i :3000
# 環境変数を確認docker run -e DATABASE_URL=... my-app:latest
# ログを確認docker logs <container-id>これで、Dockerの基礎知識と実務での使い方を理解できるようになりました。