📋 この章の学習目標
- ✅ Dockerの基本概念を理解する
- ✅ Dockerイメージとコンテナの違いを理解する
- ✅ Dockerfileを作成できるようになる
- ✅ Docker Composeで複数コンテナを管理できる
📚 目次
- Dockerとは
- Docker基本概念
- Docker基本コマンド
- Dockerfile作成
- イメージのビルドとプッシュ
- AWS ECR/ECSとの連携
- Docker Compose
- ボリュームとネットワーク
- ベストプラクティス
- 実践演習
- トラブルシューティング
- チェックリスト
1. Dockerとは 🐳
💡 Dockerの概要
Docker: アプリケーションをコンテナとして実行するためのプラットフォーム
特徴:
- 軽量な仮想化技術
- アプリケーションと依存関係を1つにパッケージ化
- どの環境でも同じように動作
- 高速な起動・停止
仮想マシン vs コンテナ
| 項目 | 仮想マシン | コンテナ |
|---|---|---|
| サイズ | GB単位 | MB単位 |
| 起動時間 | 分単位 | 秒単位 |
| リソース | 重い | 軽い |
| OS | ゲストOS必要 | ホストOSを共有 |
| 用途 | 完全な分離 | アプリケーション分離 |
仮想マシン:
┌─────────────────┐
│ Application │
├─────────────────┤
│ Guest OS │
├─────────────────┤
│ Hypervisor │
├─────────────────┤
│ Host OS │
└─────────────────┘コンテナ:
┌─────────────────┐
│ Application │
├─────────────────┤
│ Container │
├─────────────────┤
│ Docker Engine │
├─────────────────┤
│ Host OS │
└─────────────────┘
2. Docker基本概念 🧩
主要コンポーネント
🖼️ Dockerイメージ:
- アプリケーションの「設計図」
- 読み取り専用のテンプレート
- レイヤー構造
📦 Dockerコンテナ:
- イメージから作成された「実行中のインスタンス」
- 読み書き可能な層を持つ
- 独立したプロセス空間
📄 Dockerfile:
- イメージを作成するための「レシピ」
- テキストファイル形式
- ビルド手順を記述
🏪 Docker Registry:
- イメージの「保管庫」
- Docker Hub(公開)
- Amazon ECR(プライベート)
Docker ワークフロー:
Dockerfile → [ビルド] → イメージ → [実行] → コンテナ
↓
Docker
Registry
(ECR/Docker
Hub)
3. Docker基本コマンド 💻
3.1 イメージ操作
🚀 イメージ操作の基本コマンド
Dockerのインストール:
sudo snap install docker # version 28.4.0, or
sudo snap install docker # version 28.1.1+1
sudo apt install docker.io # version 28.2.2-0ubuntu1~22.04.1
sudo apt install podman-docker # version 3.4.4+ds1-1ubuntu1.22.04.3
基本的なイメージ操作:
# イメージの検索
docker search nginx# イメージのダウンロード
docker pull nginx:latest
docker pull mariadb:10.6
# ローカルイメージの一覧
docker images
# イメージの削除
docker rmi nginx:latest
# 使用されていないイメージを削除
docker image prune
3.2 コンテナ操作
🎛️ コンテナ操作の基本コマンド
# コンテナの起動(フォアグラウンド)
docker run nginx:latest# コンテナの起動(バックグラウンド)
docker run -d nginx:latest
# ポートマッピングして起動
docker run -d -p 8080:80 nginx:latest
# 名前を付けて起動
docker run -d –name my-nginx -p 8080:80 nginx:latest
# 環境変数を指定して起動
docker run -d -e MYSQL_ROOT_PASSWORD=secret mariadb:10.6
# 実行中のコンテナ一覧
docker ps
# すべてのコンテナ一覧(停止中含む)
docker ps -a
# コンテナの停止
docker stop my-nginx
# コンテナの起動(停止中のものを再起動)
docker start my-nginx
# コンテナの再起動
docker restart my-nginx
# コンテナの削除
docker rm my-nginx
# 強制削除(実行中でも)
docker rm -f my-nginx
# 停止中のコンテナをすべて削除
docker container prune
⚠️ ポートマッピングについて重要な説明
portsセクションは「ホストPCのポート」と「コンテナのポート」を紐付ける設定です。
例: “8080:80” の場合、
- 左側(8080)はホストPC(自分のPCやサーバー)のポート番号
- 右側(80)はコンテナ内のサービス(例: nginxやApacheなど)がリッスンしているポート番号
この設定により、ブラウザで http://localhost:8080 にアクセスすると、
コンテナ内のWebサーバー(80番ポート)にリクエストが届きます。
よくある間違い:
- ❌ ホスト側のポート(左側)が他のアプリで使われていると起動できない
- ❌ コンテナ側のポート(右側)がサービスの設定と一致していないと表示されない
複数のWebアプリを同時に起動したい場合:
“8081:80” や
“8082:80” など、ホスト側のポートを変えて起動します。
まとめ:
- ✅ “ホスト側:コンテナ側” の形式で書く
- ✅ ホスト側は自由に設定可能(未使用ポートを選ぶ)
- ✅ コンテナ側はサービスの設定に合わせる
- ⚠️ ポート競合や設定ミスに注意
💡 現環境のコンテナ化について
コンテナは現環境(OS・設定・ソフトウェア・データ)を”そっくりそのまま”コンテナ化することは基本的に不可能です。
必要なソフトウェアや設定を調べて、Dockerfileで”再現できるように”レシピを書く必要があります。
詳細:
- そっくりそのままコンテナ化はできない理由
- コンテナは「軽量な仮想環境」であり、OS全体や物理環境を丸ごとコピーするものではありません。
- 物理サーバやVMの”状態”や”設定”をそのままコンテナに持ち込むことはできません。
- 例えば /etc や /var
の細かい設定、ユーザー管理、カーネルモジュールなどはコンテナでは再現できません。
- 再現するための方法
- 必要なソフトウェア(nginx, php,
mysqlなど)や設定ファイルを調べて、Dockerfileやdocker-compose.ymlで「再現」します。 - データや設定は、COPYやVOLUMEで持ち込むことができます。
- ただし、OSのバージョンや細かい挙動は公式イメージやベースイメージに依存します。
- 必要なソフトウェア(nginx, php,
- 例外的な方法
- 物理サーバやVMのイメージを「コンテナ化」するツール(例:docker import,
Packerなど)はありますが、実務では推奨されません。 - 理由:不要なものまで持ち込む、セキュリティリスク、サイズが大きくなる、メンテナンス性が悪い
- 物理サーバやVMのイメージを「コンテナ化」するツール(例:docker import,
まとめ:
「現環境を調べて、必要なものだけをDockerfileで再現する」のが基本です。そっくりそのままコンテナ化はできませんが、アプリやサービス単位で”再現”は可能です。
3.3 コンテナの調査
🔍 コンテナの調査・デバッグコマンド
# コンテナのログ確認
docker logs my-nginx# ログをリアルタイム表示
docker logs -f my-nginx
# コンテナの詳細情報
docker inspect my-nginx
# コンテナのリソース使用状況
docker stats
# コンテナ内でコマンド実行
docker exec my-nginx ls -la
# コンテナ内に対話的にログイン
docker exec -it my-nginx /bin/bash
# コンテナ内のプロセス一覧
docker top my-nginx
4. Dockerfile作成 📄
4.1 Dockerfileの基本構文
# ベースイメージの指定
FROM ubuntu:22.04# メタデータ
LABEL maintainer=”[email protected]“
LABEL version=”1.0″
# 環境変数の設定
ENV APP_HOME=/app
ENV NODE_ENV=production
# 作業ディレクトリの設定
WORKDIR /app
# ファイルのコピー
COPY package.json .
COPY src/ ./src/
# コマンドの実行(ビルド時)
RUN apt-get update &&
apt-get install -y curl &&
curl -sL https://deb.nodesource.com/setup_18.x | bash – &&
apt-get install -y nodejs &&
npm install
# ポートの公開
EXPOSE 3000
# コンテナ起動時のデフォルトコマンド
CMD [“npm”, “start”]
4.2 主要な命令
| 命令 | 説明 | 例 |
|---|---|---|
| FROM | ベースイメージ指定 | FROM node:18 |
| RUN | コマンド実行(ビルド時) | RUN npm install |
| CMD | デフォルトコマンド | CMD ["npm", "start"] |
| ENTRYPOINT | 実行ファイル指定 | ENTRYPOINT ["/app/start.sh"] |
| COPY | ファイルコピー | COPY . /app |
| ADD | ファイル追加(URL対応) | ADD https://example.com/file . |
| WORKDIR | 作業ディレクトリ | WORKDIR /app |
| ENV | 環境変数 | ENV PORT=8080 |
| EXPOSE | ポート公開 | EXPOSE 80 |
| VOLUME | ボリューム定義 | VOLUME /data |
4.3 実践例: WordPress用Dockerfile
🎯 WordPressコンテナのDockerfile
FROM php:8.1-apache# WordPress依存パッケージのインストール
RUN apt-get update &&
apt-get install -y
libpng-dev
libjpeg-dev
libfreetype6-dev
libzip-dev
unzip &&
docker-php-ext-configure gd –with-freetype –with-jpeg &&
docker-php-ext-install -j$(nproc)
gd
mysqli
pdo_mysql
zip &&
apt-get clean &&
rm -rf /var/lib/apt/lists/*
# WordPressのダウンロード
ENV WORDPRESS_VERSION=6.4
RUN curl -o wordpress.tar.gz -fSL
“https://wordpress.org/wordpress-${WORDPRESS_VERSION}.tar.gz” &&
tar -xzf wordpress.tar.gz -C /var/www/html –strip-components=1 &&
rm wordpress.tar.gz &&
chown -R www-data:www-data /var/www/html
# Apache設定
RUN a2enmod rewrite
# ポート公開
EXPOSE 80
# 起動コマンド
CMD [“apache2-foreground”]
4.4 マルチステージビルド
🏗️ マルチステージビルドの例
# ビルドステージ
FROM node:18 AS builder
WORKDIR /app
COPY package*.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
EXPOSE 3000
CMD [“node”, “dist/main.js”]
メリット:
- ✅ 最終イメージサイズの削減
- ✅ ビルドツールを含まない
- ✅ セキュリティ向上
5. イメージのビルドとプッシュ 🚀
5.1 イメージのビルド
# カレントディレクトリのDockerfileを使用
docker build -t my-app:1.0 .# 特定のDockerfileを指定
docker build -f Dockerfile.prod -t my-app:prod .
# ビルド時に引数を渡す
docker build –build-arg VERSION=1.0 -t my-app:1.0 .
# キャッシュを使わずにビルド
docker build –no-cache -t my-app:1.0 .
5.2 イメージのタグ付け
# ローカルイメージにタグ付け
docker tag my-app:1.0 my-app:latest# ECR用にタグ付け
docker tag my-app:1.0 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-app:1.0
5.3 Docker Hubへのプッシュ
# ログイン
docker login# プッシュ
docker push username/my-app:1.0
6. AWS ECR/ECSとの連携 ☁️
💡 AWS ECR (Elastic Container Registry) とは
Amazon ECR: AWSが提供するフルマネージドなDockerコンテナレジストリサービス
特徴:
- ✅ AWSサービスとの完全統合(ECS、EKS、Lambda等)
- ✅ IAMによる細かいアクセス制御
- ✅ プライベートリポジトリ(セキュア)
- ✅ イメージの脆弱性スキャン機能
- ✅ 暗号化されたストレージ
- ✅ 高可用性と自動スケーリング
Docker Hub vs Amazon ECR:
| 項目 | Docker Hub | Amazon ECR |
|---|---|---|
| 用途 | パブリック/プライベート | 主にプライベート |
| 認証 | Docker認証 | AWS IAM認証 |
| 料金 | 無料枠あり(制限あり) | 使用量課金 |
| AWS統合 | なし | 完全統合 |
| セキュリティ | 基本的 | 高度(IAM、暗号化) |
💡 AWS ECS (Elastic Container Service) とは
Amazon ECS: AWSが提供するフルマネージドなコンテナオーケストレーションサービス
特徴:
- ✅ Dockerコンテナの実行・管理を自動化
- ✅ スケーリング、ロードバランシング、モニタリング
- ✅ AWS Fargateでサーバーレス実行可能
- ✅ EC2インスタンスでの実行も可能
- ✅ ECRとシームレスに連携
ECSの主要コンポーネント:
- クラスター: コンテナを実行する論理的なグループ
- タスク定義: コンテナの設定(イメージ、CPU、メモリなど)
- サービス: タスクの実行数を維持する
- タスク: 実行中のコンテナインスタンス
ECR → ECS ワークフロー:
Dockerfile → [ビルド] → ローカルイメージ
↓ [Push]
Amazon ECR (レジストリ)
↓ [Pull]
Amazon ECS (実行環境)
↓
Fargate or EC2でコンテナ実行
⚠️ 事前準備
ECR/ECSを使用する前に、以下が必要です:
- ✅ AWSアカウント
- ✅ AWS CLI のインストールと設定
- ✅ 適切なIAM権限(ECR、ECSへのアクセス権)
AWS CLI のインストール確認:
# バージョン確認
aws –version# 認証情報の設定
aws configure
# AWS Access Key ID: YOUR_ACCESS_KEY
# AWS Secret Access Key: YOUR_SECRET_KEY
# Default region name: ap-northeast-1
# Default output format: json
6.1 ECRリポジトリの作成
🚀 ECRリポジトリの作成手順
方法1: AWS CLI を使用
# ECRリポジトリの作成
aws ecr create-repository
–repository-name my-app
–region ap-northeast-1# イメージスキャンを有効にして作成
aws ecr create-repository
–repository-name my-app
–image-scanning-configuration scanOnPush=true
–region ap-northeast-1
# 作成されたリポジトリの確認
aws ecr describe-repositories –region ap-northeast-1
方法2: AWSマネジメントコンソール
- AWS Management Consoleにログイン
- 「ECR」サービスを開く
- 「リポジトリを作成」をクリック
- リポジトリ名を入力(例: my-app)
- 「プライベート」を選択(推奨)
- オプション: イメージスキャンを有効化
- 「リポジトリを作成」をクリック
📋 作成されるリポジトリURI形式:
123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-app
- 123456789012: AWSアカウントID
- ap-northeast-1: リージョン
- my-app: リポジトリ名
6.2 ECRへの認証
🔐 ECRへの認証方法
ECRにイメージをプッシュ/プルする前に、Docker CLIをECRに認証する必要があります。
方法1: AWS CLI v2 を使用(推奨)
# ECRにログイン
aws ecr get-login-password –region ap-northeast-1 |
docker login –username AWS –password-stdin
123456789012.dkr.ecr.ap-northeast-1.amazonaws.com# 成功すると以下のメッセージが表示されます:
# Login Succeeded
方法2: AWS CLI v1 を使用
# ログインコマンドを取得して実行
$(aws ecr get-login –no-include-email –region ap-northeast-1)
⚠️ 認証トークンの有効期限
ECRの認証トークンは12時間で期限切れになります。
期限切れ後は再度ログインが必要です。
認証の確認:
# Dockerの認証情報を確認
cat ~/.docker/config.json
6.3 ECRへのイメージプッシュ
📤 ECRへのイメージプッシュ手順
# Dockerイメージをビルド
docker build -t my-app:latest .
# ECRリポジトリURIでタグ付け
docker tag my-app:latest
123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-app:latest# バージョンタグも付ける(推奨)
docker tag my-app:latest
123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-app:v1.0.0
# ECRへの認証
aws ecr get-login-password –region ap-northeast-1 |
docker login –username AWS –password-stdin
123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
# イメージをECRにプッシュ
docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-app:latest# バージョンタグもプッシュ
docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-app:v1.0.0
# ECRのイメージ一覧を確認
aws ecr list-images –repository-name my-app –region ap-northeast-1# イメージの詳細情報を確認
aws ecr describe-images –repository-name my-app –region ap-northeast-1
💡 まとめてプッシュするスクリプト例:
#!/bin/bash# 変数設定
AWS_REGION=”ap-northeast-1″
AWS_ACCOUNT_ID=”123456789012″
REPO_NAME=”my-app”
IMAGE_TAG=”latest”
# ECRのURIを生成
ECR_URI=”${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${REPO_NAME}”
# イメージビルド
echo “Building Docker image…”
docker build -t ${REPO_NAME}:${IMAGE_TAG} .
# ECR用にタグ付け
echo “Tagging image for ECR…”
docker tag ${REPO_NAME}:${IMAGE_TAG} ${ECR_URI}:${IMAGE_TAG}
# ECRにログイン
echo “Logging in to ECR…”
aws ecr get-login-password –region ${AWS_REGION} |
docker login –username AWS –password-stdin ${ECR_URI}
# ECRにプッシュ
echo “Pushing image to ECR…”
docker push ${ECR_URI}:${IMAGE_TAG}
echo “Done!”
6.4 ECRからのイメージプル
📥 ECRからのイメージプル手順
# ECRへの認証
aws ecr get-login-password –region ap-northeast-1 |
docker login –username AWS –password-stdin
123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
# ECRからイメージをプル
docker pull 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-app:latest# 特定バージョンをプル
docker pull 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-app:v1.0.0
# ローカルイメージ一覧を確認
docker images | grep my-app
# ECRからプルしたイメージでコンテナ起動
docker run -d -p 8080:80
123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-app:latest
💡 異なるEC2インスタンスでプルする場合:
別のEC2インスタンスやローカル環境でECRからイメージをプルする場合:
- AWS CLIがインストールされていることを確認
- 適切なIAM権限(ECRへのアクセス権)があることを確認
- 上記の手順でログイン→プルを実行
6.5 ECSでの実行(基本)
🚀 ECSでのコンテナ実行の基本フロー
ECRにプッシュしたイメージをECSで実行する基本的な流れ:
ステップ1: ECSクラスターの作成
# Fargateクラスターの作成
aws ecs create-cluster
–cluster-name my-cluster
–region ap-northeast-1# クラスター一覧の確認
aws ecs list-clusters –region ap-northeast-1
ステップ2: タスク定義の作成
タスク定義はコンテナの設定を定義するJSONファイルです。
# task-definition.json を作成
{
“family”: “my-app-task”,
“networkMode”: “awsvpc”,
“requiresCompatibilities”: [“FARGATE”],
“cpu”: “256”,
“memory”: “512”,
“containerDefinitions”: [
{
“name”: “my-app-container”,
“image”: “123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-app:latest”,
“portMappings”: [
{
“containerPort”: 80,
“protocol”: “tcp”
}
],
“essential”: true
}
]
}# タスク定義を登録
aws ecs register-task-definition
–cli-input-json file://task-definition.json
–region ap-northeast-1
ステップ3: サービスの作成と実行
# ECSサービスの作成(Fargate)
aws ecs create-service
–cluster my-cluster
–service-name my-app-service
–task-definition my-app-task
–desired-count 1
–launch-type FARGATE
–network-configuration
“awsvpcConfiguration={subnets=[subnet-xxxxx],securityGroups=[sg-xxxxx],assignPublicIp=ENABLED}”
–region ap-northeast-1
ステップ4: サービスの確認
# サービス一覧
aws ecs list-services –cluster my-cluster –region ap-northeast-1# サービスの詳細
aws ecs describe-services
–cluster my-cluster
–services my-app-service
–region ap-northeast-1
# 実行中のタスク一覧
aws ecs list-tasks –cluster my-cluster –region ap-northeast-1
⚠️ 注意事項
- サブネットIDとセキュリティグループIDは実際の環境に合わせて変更してください
- ECSタスクにECRへのアクセス権限を持つIAMロールが必要です
- Fargateの場合、料金はCPU/メモリの使用量に応じて課金されます
💡 AWSマネジメントコンソールでの操作
CLI操作が複雑に感じる場合は、AWSコンソールから以下の手順で操作できます:
- ECSコンソールを開く
- 「クラスターの作成」→ Fargateを選択
- 「タスク定義の作成」→ コンテナイメージにECR URIを指定
- 「サービスの作成」→ タスク定義とクラスターを選択
- ネットワーク設定(VPC、サブネット、セキュリティグループ)を指定
- サービスを起動
6.6 ECR/ECS よくあるコマンド集
📝 ECR/ECS 実務でよく使うコマンド
ECR関連:
# リポジトリ一覧
aws ecr describe-repositories –region ap-northeast-1# イメージ一覧
aws ecr list-images –repository-name my-app –region ap-northeast-1
# イメージの削除
aws ecr batch-delete-image
–repository-name my-app
–image-ids imageTag=v1.0.0
–region ap-northeast-1
# リポジトリの削除(注意!)
aws ecr delete-repository
–repository-name my-app
–force
–region ap-northeast-1
# イメージの脆弱性スキャン結果を確認
aws ecr describe-image-scan-findings
–repository-name my-app
–image-id imageTag=latest
–region ap-northeast-1
ECS関連:
# クラスター一覧
aws ecs list-clusters –region ap-northeast-1# サービス一覧
aws ecs list-services –cluster my-cluster –region ap-northeast-1
# タスク定義の一覧
aws ecs list-task-definitions –region ap-northeast-1
# サービスのスケーリング
aws ecs update-service
–cluster my-cluster
–service my-app-service
–desired-count 3
–region ap-northeast-1
# サービスの停止
aws ecs update-service
–cluster my-cluster
–service my-app-service
–desired-count 0
–region ap-northeast-1
# サービスの削除
aws ecs delete-service
–cluster my-cluster
–service my-app-service
–force
–region ap-northeast-1
# タスクのログを確認(CloudWatch Logs)
aws logs tail /ecs/my-app-task –follow –region ap-northeast-1
7. Docker Compose 🐙
7.1 Docker Composeとは
- 複数のコンテナを定義・実行するツール
- YAMLファイルで設定
- 開発環境に最適
7.2 基本的なdocker-compose.yml
📝 完全なDocker Compose設定例
version: ‘3.8’services:
web:
build: .
ports:
– “8080:80”
depends_on:
– db
environment:
– DB_HOST=db
– DB_NAME=myapp
volumes:
– ./app:/var/www/html
networks:
– app-network
db:
image: mariadb:10.6
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: myapp
MYSQL_USER: user
MYSQL_PASSWORD: userpass
volumes:
– db-data:/var/lib/mysql
networks:
– app-network
volumes:
db-data:
networks:
app-network:
driver: bridge
⚠️ 複数コンテナとコンテナ名について
複数のnginxコンテナを同時に立ち上げる場合は、
- それぞれ異なるコンテナ名(–nameオプションやdocker-composeのサービス名)で起動します。
- 例: nginx-a(8080:80)、nginx-b(8081:80)など
- これにより、A用・B用など用途ごとにWebアプリを分けて運用できます。
注意:
1つのコンテナ(同じコンテナ名)に複数ポート(8080:80, 8081:80など)をマッピングすると、
どちらのポートでアクセスしても同じコンテナの80番に転送されます。
→ 1つのnginxで複数ポートを管理したい場合はこの方法ですが、
アプリや公開フォルダの振り分けはnginxの設定(serverブロック)で行う必要があります。
初心者はコンテナを分けて運用する方が分かりやすいです。
7.3 Docker Composeコマンド
# 起動(バックグラウンド)
docker-compose up -d# ログ確認
docker-compose logs -f
# 特定サービスのログ
docker-compose logs -f web
# サービス一覧
docker-compose ps
# 停止
docker-compose stop
# 停止して削除
docker-compose down
# ボリュームも削除
docker-compose down -v
# 再ビルドして起動
docker-compose up -d –build
# スケール(複数起動)
docker-compose up -d –scale web=3
# サービス内でコマンド実行
docker-compose exec web bash
# 設定の検証
docker-compose config
8. ボリュームとネットワーク 💾
8.1 ボリューム(データ永続化)
💾 ボリューム管理
# ボリューム作成
docker volume create my-volume# ボリューム一覧
docker volume ls
# ボリューム詳細
docker volume inspect my-volume
# ボリュームを使用してコンテナ起動
docker run -d -v my-volume:/data nginx
# ホストのディレクトリをマウント(バインドマウント)
docker run -d -v /host/path:/container/path nginx
# 読み取り専用マウント
docker run -d -v my-volume:/data:ro nginx
# ボリューム削除
docker volume rm my-volume
# 未使用ボリューム削除
docker volume prune
8.2 ネットワーク
🌐 ネットワーク管理
# ネットワーク作成
docker network create my-network# ネットワーク一覧
docker network ls
# ネットワーク詳細
docker network inspect my-network
# ネットワークに接続してコンテナ起動
docker run -d –network my-network –name web nginx
# 既存コンテナをネットワークに接続
docker network connect my-network web
# ネットワークから切断
docker network disconnect my-network web
# ネットワーク削除
docker network rm my-network
9. ベストプラクティス ⭐
9.1 Dockerfileのベストプラクティス
✅ 推奨
FROM node:18-alpine # 軽量なalpineを使用
WORKDIR /app
COPY package*.json ./
RUN npm ci –only=production # 本番用依存のみ
COPY . .
USER node # 非rootユーザーで実行
EXPOSE 3000
CMD [“node”, “server.js”]
❌ 非推奨
FROM node:18 # 大きいイメージ
RUN npm install # キャッシュが効きにくい
COPY . /app # WORKDIRを使わない
# rootユーザーで実行(セキュリティリスク)
9.2 レイヤーキャッシュの活用
✅ 効率的(変更が少ないものを先に)
COPY package*.json ./
RUN npm install
COPY . .
❌ 非効率(すべてコピーしてからインストール)
COPY . .
RUN npm install
9.3 .dockerignoreの使用
# 除外するファイル/ディレクトリ
node_modules
npm-debug.log
.git
.env
*.md
Dockerfile
docker-compose.yml
.vscode
.idea
10. 実践演習 🎯
10.1 演習1: Nginxコンテナの起動
docker pull nginx:latest
docker run -d –name my-nginx -p 8080:80 nginx:latest
http://localhost:8080 をブラウザで開く
docker logs my-nginx
docker exec -it my-nginx bash
docker stop my-nginx
docker rm my-nginx
10.2 演習2: カスタムDockerfileの作成
mkdir my-app && cd my-app
cat > index.html << ‘EOF'<html>
<head>
<title>My Docker App</title>
</head>
<body>
<h1>Hello from Docker!</h1>
<p>This is my first Docker container.</p>
</body>
</html>
EOF
cat > Dockerfile << ‘EOF’
FROM nginx:alpine
COPY index.html /usr/share/nginx/html/
EXPOSE 80
EOF
docker build -t my-web-app:1.0 .
docker run -d –name my-app -p 8080:80 my-web-app:1.0
curl http://localhost:8080
11. トラブルシューティング 🔧
問題1: コンテナが起動しない
🚨 解決方法
# ログ確認
docker logs <container-name># 詳細情報確認
docker inspect <container-name>
# イベント確認
docker events
問題2: ポートがバインドできない
🚨 解決方法
# ポート使用状況確認
sudo lsof -i :8080
# または
sudo netstat -tulpn | grep 8080# 別のポートを使用
docker run -d -p 8081:80 nginx
問題3: ディスク容量不足
🚨 解決方法
# 使用状況確認
docker system df# 未使用リソースの削除
docker system prune
# すべて削除(注意!)
docker system prune -a –volumes
12. チェックリスト ✅
🎯 学習完了チェック
この章を終えたら、以下を確認してください:

