Docker入門ガイド2025

Docker入門2025:実践的なコンテナ開発の始め方

Dockerの基本から実践的な使い方まで、現役エンジニアが分かりやすく解説。インストール手順、基本コマンド、Dockerfile作成、Docker Compose、ネットワーク設定など、実務で必要な知識を網羅的に学べます。

技術ブログ
Docker and the Docker logo are trademarks or registered trademarks of Docker, Inc. in the United States and/or other countries. This article is for educational purposes only and is not affiliated with, sponsored by, or endorsed by Docker, Inc.

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