Docker完全入門:コンテナ基礎から実践まで
Dockerは、アプリケーションをコンテナとしてパッケージ化し、どこでも同じように実行できるようにするプラットフォームです。この記事では、Dockerの基本概念から始めて、実際のアプリケーションをコンテナ化し、本番環境で運用する方法までを学びます。
開発環境と本番環境の差をなくし、「動くはずなのに動かない」問題を解決する強力なツールです。
1. Dockerとは
Dockerは、アプリケーションとその依存関係を「コンテナ」という軽量なパッケージにまとめる技術です。
1.1 コンテナと仮想マシンの違い
- 仮想マシン: ハイパーバイザー上で完全なOSを実行(重い)
- コンテナ: ホストOSのカーネルを共有(軽量、高速)
1.2 Dockerの主要コンポーネント
- イメージ(Image): アプリケーションのテンプレート
- コンテナ(Container): イメージの実行インスタンス
- Dockerfile: イメージを構築するための手順書
- Docker Compose: 複数コンテナのオーケストレーション
1.3 インストール
# Docker Desktopのダウンロード
# https://www.docker.com/products/docker-desktop
# インストールの確認
docker --version
docker-compose --version
# Dockerの動作確認
docker run hello-world
2. Dockerの基本コマンド
2.1 イメージの操作
# イメージの一覧表示
docker images
# イメージの検索
docker search nginx
# イメージのダウンロード
docker pull nginx:latest
# イメージの削除
docker rmi nginx
# イメージの詳細情報
docker inspect nginx
2.2 コンテナの操作
# コンテナの起動
docker run nginx
# バックグラウンドで実行(-dオプション)
docker run -d nginx
# ポートマッピング(-pオプション)
docker run -d -p 8080:80 nginx
# コンテナ名の指定(--nameオプション)
docker run -d --name my-nginx -p 8080:80 nginx
# 環境変数の設定(-eオプション)
docker run -d -e MYSQL_ROOT_PASSWORD=secret mysql
# コンテナの一覧表示
docker ps # 実行中のコンテナ
docker ps -a # 全てのコンテナ
# コンテナの停止
docker stop my-nginx
# コンテナの起動(停止中のコンテナ)
docker start my-nginx
# コンテナの削除
docker rm my-nginx
# コンテナのログ確認
docker logs my-nginx
# コンテナ内でコマンド実行
docker exec -it my-nginx /bin/bash
3. Dockerfileの作成
Dockerfileは、イメージを構築するための手順書です。
3.1 基本的なDockerfile
# ベースイメージの指定
FROM node:18-alpine
# 作業ディレクトリの設定
WORKDIR /app
# ファイルのコピー
COPY package.json package-lock.json ./
# 依存関係のインストール
RUN npm install
# アプリケーションコードのコピー
COPY . .
# ポートの公開
EXPOSE 3000
# 起動コマンド
CMD ["npm", "start"]
3.2 マルチステージビルド
# ビルドステージ
FROM node:18-alpine AS builder
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build
# 本番ステージ
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
EXPOSE 3000
CMD ["node", "dist/index.js"]
3.3 最適化されたDockerfile
FROM python:3.11-slim
# メタデータの設定
LABEL maintainer="your-email@example.com"
LABEL description="My Python Application"
# 環境変数の設定
ENV PYTHONUNBUFFERED=1
ENV PYTHONDONTWRITEBYTECODE=1
# システムパッケージの更新とインストール
RUN apt-get update && apt-get install -y \
gcc \
&& rm -rf /var/lib/apt/lists/*
# 作業ディレクトリの設定
WORKDIR /app
# 依存関係のインストール(キャッシュを効かせるため先にコピー)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# アプリケーションコードのコピー
COPY . .
# 非rootユーザーで実行
RUN useradd -m -u 1000 appuser && chown -R appuser:appuser /app
USER appuser
# ポートの公開
EXPOSE 8000
# ヘルスチェック
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:8000/health || exit 1
# 起動コマンド
CMD ["python", "app.py"]
4. イメージのビルドとタグ付け
# イメージのビルド
docker build -t my-app:latest .
# タグの付け方
docker build -t my-app:1.0.0 .
docker build -t my-registry.com/my-app:1.0.0 .
# ビルドコンテキストの指定
docker build -f Dockerfile.prod -t my-app:prod .
# ビルドキャッシュなしでビルド
docker build --no-cache -t my-app:latest .
5. データの永続化
5.1 ボリューム(Volume)
# 名前付きボリュームの作成
docker volume create my-data
# ボリュームの一覧
docker volume ls
# ボリュームを使用してコンテナを起動
docker run -d -v my-data:/data nginx
# ボリュームの詳細
docker volume inspect my-data
# ボリュームの削除
docker volume rm my-data
5.2 バインドマウント(Bind Mount)
# ホストのディレクトリをマウント
docker run -d -v /path/to/host:/path/to/container nginx
# 読み取り専用マウント
docker run -d -v /path/to/host:/path/to/container:ro nginx
# 相対パスでのマウント
docker run -d -v $(pwd)/data:/data nginx
5.3 DockerfileでのVOLUME指定
FROM postgres:15
# データディレクトリをボリュームとして指定
VOLUME ["/var/lib/postgresql/data"]
6. ネットワーキング
6.1 ネットワークの作成と使用
# ネットワークの作成
docker network create my-network
# ネットワークの一覧
docker network ls
# ネットワークに接続してコンテナを起動
docker run -d --name app --network my-network my-app
docker run -d --name db --network my-network postgres
# ネットワークの詳細
docker network inspect my-network
# ネットワークからの切断
docker network disconnect my-network app
# ネットワークの削除
docker network rm my-network
6.2 デフォルトネットワーク
- bridge: デフォルトのネットワークドライバ
- host: ホストのネットワークを使用
- none: ネットワークを無効化
# ホストネットワークを使用
docker run -d --network host nginx
# ネットワークなしで実行
docker run -d --network none nginx
7. Docker Compose
Docker Composeは、複数のコンテナを定義・実行するためのツールです。
7.1 docker-compose.ymlの基本
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DATABASE_URL=postgresql://user:password@db:5432/mydb
depends_on:
- db
volumes:
- ./src:/app/src
db:
image: postgres:15
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
- POSTGRES_DB=mydb
volumes:
- postgres-data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
postgres-data:
7.2 Docker Composeコマンド
# サービス开始
docker-compose up
# バックグラウンドで起動
docker-compose up -d
# サービス停止
docker-compose stop
# サービス停止とコンテナ削除
docker-compose down
# ログの確認
docker-compose logs
# 特定のサービスのログ
docker-compose logs web
# サービスの状態確認
docker-compose ps
# サービスの再構築
docker-compose up --build
# 特定のサービスのみ起動
docker-compose up web db
7.3 実践的なdocker-compose.yml
version: '3.8'
services:
frontend:
build:
context: ./frontend
dockerfile: Dockerfile
ports:
- "3000:3000"
environment:
- REACT_APP_API_URL=http://localhost:8000
volumes:
- ./frontend/src:/app/src
depends_on:
- backend
backend:
build:
context: ./backend
dockerfile: Dockerfile
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgresql://postgres:password@db:5432/myapp
- REDIS_URL=redis://redis:6379
volumes:
- ./backend:/app
depends_on:
- db
- redis
db:
image: postgres:15
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=password
- POSTGRES_DB=myapp
volumes:
- postgres-data:/var/lib/postgresql/data
ports:
- "5432:5432"
redis:
image: redis:7-alpine
volumes:
- redis-data:/data
ports:
- "6379:6379"
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/ssl:/etc/nginx/ssl
depends_on:
- frontend
- backend
volumes:
postgres-data:
redis-data:
8. 本番環境での運用
8.1 環境変数の管理
# .envファイルの作成
cat > .env << EOF
POSTGRES_USER=postgres
POSTGRES_PASSWORD=secure_password
POSTGRES_DB=myapp
SECRET_KEY=your_secret_key
EOF
# docker-compose.ymlで環境変数を使用
version: '3.8'
services:
db:
image: postgres:15
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB}
8.2 ヘルスチェック
services:
web:
image: my-app
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
8.3 リソース制限
services:
web:
image: my-app
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M
9. セキュリティのベストプラクティス
9.1 非rootユーザーでの実行
FROM node:18-alpine
# ユーザーの作成
RUN addgroup -g 1000 appuser && \
adduser -D -u 1000 -G appuser appuser
WORKDIR /app
COPY --chown=appuser:appuser . .
USER appuser
CMD ["node", "index.js"]
9.2 セキュリティスキャン
# Trivyを使用したスキャン
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy image my-app:latest
# Docker Scout(Docker Desktopに組み込み)
docker scout cves my-app:latest
9.3 シークレット管理
# Docker Secrets(Swarmモード)
version: '3.8'
services:
app:
image: my-app
secrets:
- db_password
secrets:
db_password:
external: true
10. イメージのレジストリへのプッシュ
10.1 Docker Hubへのプッシュ
# ログイン
docker login
# タグ付け
docker tag my-app:latest username/my-app:latest
# プッシュ
docker push username/my-app:latest
10.2 プライベートレジストリへのプッシュ
# プライベートレジストリへのログイン
docker login registry.example.com
# タグ付け
docker tag my-app:latest registry.example.com/my-app:1.0.0
# プッシュ
docker push registry.example.com/my-app:1.0.0
11. CI/CDパイプラインでの使用
11.1 GitHub Actionsでの使用
name: Build and Push Docker Image
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push
uses: docker/build-push-action@v4
with:
context: .
push: true
tags: username/my-app:latest
12. トラブルシューティング
12.1 よくある問題と解決策
# ディスク容量の確認
docker system df
# 未使用リソースの削除
docker system prune -a
# コンテナの詳細情報
docker inspect container_name
# コンテナ内のプロセス確認
docker top container_name
# コンテナの統計情報(リアルタイム)
docker stats
13. まとめと次のステップ
このガイドを通じて、Dockerの基礎から実践的な運用まで学びました。
学んだこと
- Dockerの基本概念: イメージ、コンテナ、Dockerfile
- 基本的なコマンド: イメージとコンテナの操作
- Dockerfileの作成: 最適化されたイメージの構築
- データの永続化: ボリュームとバインドマウント
- ネットワーキング: コンテナ間通信
- Docker Compose: 複数コンテナの管理
- 本番運用: セキュリティ、リソース制限、CI/CD
次のステップ
- Kubernetes: コンテナオーケストレーション
- Docker Swarm: Docker公式のオーケストレーションツール
- コンテナセキュリティ: より高度なセキュリティ対策
- パフォーマンス最適化: イメージサイズの削減、起動時間の短縮
- 監視とロギング: コンテナの監視ツール
Dockerは、現代のソフトウェア開発において必須のスキルです。継続的な学習と実践を通じて、効率的な開発・デプロイメント環境を構築できるようになりましょう!
Happy Containerizing!
コメント
コメントを読み込み中...
