Docker基礎:コンテナ技術の概要と実践

🐳 Docker基礎 – 初心者向け完全ガイドコンテナ技術を基礎から実践まで体系的に学ぶ📅 所要時間: 60分 | 🎯 レベル: 初級
  1. 📋 この章の学習目標
  2. 📚 目次
  3. 1. Dockerとは 🐳
      1. 特徴:
  4. 仮想マシン vs コンテナ
  5. 2. Docker基本概念 🧩
    1. 主要コンポーネント
      1. 🖼️ Dockerイメージ:
      2. 📦 Dockerコンテナ:
      3. 📄 Dockerfile:
      4. 🏪 Docker Registry:
  6. 3. Docker基本コマンド 💻
      1. 🚀 イメージ操作の基本コマンド
        1. Dockerのインストール:
        2. 基本的なイメージ操作:
      2. 🎛️ コンテナ操作の基本コマンド
      3. ⚠️ ポートマッピングについて重要な説明
        1. よくある間違い:
        2. 複数のWebアプリを同時に起動したい場合:
      4. 💡 現環境のコンテナ化について
        1. 詳細:
      5. 🔍 コンテナの調査・デバッグコマンド
  7. 4. Dockerfile作成 📄
  8. 4.1 Dockerfileの基本構文
  9. 4.2 主要な命令
      1. 🎯 WordPressコンテナのDockerfile
      2. 🏗️ マルチステージビルドの例
  10. 5. イメージのビルドとプッシュ 🚀
  11. 5.1 イメージのビルド
  12. 5.2 イメージのタグ付け
  13. 5.3 Docker Hubへのプッシュ
  14. 6. AWS ECR/ECSとの連携 ☁️
  15. 💡 AWS ECR (Elastic Container Registry) とは
      1. 特徴:
      2. Docker Hub vs Amazon ECR:
    1. 💡 AWS ECS (Elastic Container Service) とは
      1. 特徴:
      2. ECSの主要コンポーネント:
      3. ⚠️ 事前準備
        1. AWS CLI のインストール確認:
      4. 🚀 ECRリポジトリの作成手順
        1. 方法1: AWS CLI を使用
        2. 方法2: AWSマネジメントコンソール
        3. 📋 作成されるリポジトリURI形式:
      5. 🔐 ECRへの認証方法
        1. 方法1: AWS CLI v2 を使用(推奨)
        2. 方法2: AWS CLI v1 を使用
        3. ⚠️ 認証トークンの有効期限
        4. 認証の確認:
      6. 📤 ECRへのイメージプッシュ手順
        1. 💡 まとめてプッシュするスクリプト例:
      7. 📥 ECRからのイメージプル手順
        1. 💡 異なるEC2インスタンスでプルする場合:
      8. 🚀 ECSでのコンテナ実行の基本フロー
        1. ステップ1: ECSクラスターの作成
        2. ステップ2: タスク定義の作成
        3. ステップ3: サービスの作成と実行
        4. ステップ4: サービスの確認
        5. ⚠️ 注意事項
        6. 💡 AWSマネジメントコンソールでの操作
      9. 📝 ECR/ECS 実務でよく使うコマンド
        1. ECR関連:
        2. ECS関連:
  16. 7. Docker Compose 🐙
    1. 7.1 Docker Composeとは
      1. 📝 完全なDocker Compose設定例
      2. ⚠️ 複数コンテナとコンテナ名について
    2. 7.3 Docker Composeコマンド
  17. 8. ボリュームとネットワーク 💾
      1. 💾 ボリューム管理
      2. 🌐 ネットワーク管理
  18. 9. ベストプラクティス ⭐
    1. 9.1 Dockerfileのベストプラクティス
      1. ✅ 推奨
      2. ❌ 非推奨
    2. 9.2 レイヤーキャッシュの活用
      1. ✅ 効率的(変更が少ないものを先に)
      2. ❌ 非効率(すべてコピーしてからインストール)
    3. 9.3 .dockerignoreの使用
  19. 10. 実践演習 🎯
    1. 10.1 演習1: Nginxコンテナの起動
    2. 10.2 演習2: カスタムDockerfileの作成
  20. 11. トラブルシューティング 🔧
      1. 🚨 解決方法
      2. 🚨 解決方法
      3. 🚨 解決方法
  21. 12. チェックリスト ✅
    1. 🎯 学習完了チェック
  22. 🚀 次のステップ
    1. 📚 参考資料
      1. 🎉 お疲れ様でした!

📋 この章の学習目標

  • ✅ Dockerの基本概念を理解する
  • ✅ Dockerイメージとコンテナの違いを理解する
  • ✅ Dockerfileを作成できるようになる
  • ✅ Docker Composeで複数コンテナを管理できる

📚 目次

  1. Dockerとは
  2. Docker基本概念
  3. Docker基本コマンド
  4. Dockerfile作成
  5. イメージのビルドとプッシュ
  6. AWS ECR/ECSとの連携
  7. Docker Compose
  8. ボリュームとネットワーク
  9. ベストプラクティス
  10. 実践演習
  11. トラブルシューティング
  12. チェックリスト

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で”再現できるように”レシピを書く必要があります。

詳細:
  1. そっくりそのままコンテナ化はできない理由
    • コンテナは「軽量な仮想環境」であり、OS全体や物理環境を丸ごとコピーするものではありません。
    • 物理サーバやVMの”状態”や”設定”をそのままコンテナに持ち込むことはできません。
    • 例えば /etc や /var
      の細かい設定、ユーザー管理、カーネルモジュールなどはコンテナでは再現できません。
  2. 再現するための方法
    • 必要なソフトウェア(nginx, php,
      mysqlなど)や設定ファイルを調べて、Dockerfileやdocker-compose.ymlで「再現」します。
    • データや設定は、COPYやVOLUMEで持ち込むことができます。
    • ただし、OSのバージョンや細かい挙動は公式イメージやベースイメージに依存します。
  3. 例外的な方法
    • 物理サーバやVMのイメージを「コンテナ化」するツール(例:docker import,
      Packerなど)はありますが、実務では推奨されません。
    • 理由:不要なものまで持ち込む、セキュリティリスク、サイズが大きくなる、メンテナンス性が悪い

まとめ:

「現環境を調べて、必要なものだけを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マネジメントコンソール
  1. AWS Management Consoleにログイン
  2. 「ECR」サービスを開く
  3. 「リポジトリを作成」をクリック
  4. リポジトリ名を入力(例: my-app)
  5. 「プライベート」を選択(推奨)
  6. オプション: イメージスキャンを有効化
  7. 「リポジトリを作成」をクリック
📋 作成されるリポジトリ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からイメージをプルする場合:

  1. AWS CLIがインストールされていることを確認
  2. 適切なIAM権限(ECRへのアクセス権)があることを確認
  3. 上記の手順でログイン→プルを実行
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コンソールから以下の手順で操作できます:

  1. ECSコンソールを開く
  2. 「クラスターの作成」→ Fargateを選択
  3. 「タスク定義の作成」→ コンテナイメージにECR URIを指定
  4. 「サービスの作成」→ タスク定義とクラスターを選択
  5. ネットワーク設定(VPC、サブネット、セキュリティグループ)を指定
  6. サービスを起動
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. チェックリスト ✅

🎯 学習完了チェック

この章を終えたら、以下を確認してください:








🚀 次のステップ

次は「EC2+RDS環境でWordPress構築」に進みます。ここで学んだDockerの知識を活用して、まず従来環境でWordPressを構築し、その後コンテナ化します。

📚 参考資料

🎉 お疲れ様でした!

Docker基礎を完了しました。実践的なWordPress構築で更なるスキルアップを目指しましょう!

タイトルとURLをコピーしました