0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【IT基礎】Docker Compose触ってみた

Last updated at Posted at 2026-01-10

前回Dockerについて手を動かして学べたので、Docker composeについて学んでいきます。
Dockerの起動、試してみた。の続きです。

目次

  1. Dockerコンテナの管理
  2. Docker Composeの使用
  3. まとめ:Docker

Dockerコンテナの管理

1. ログの確認

# ログを表示
docker logs web-app-container

# リアルタイムでログを表示
docker logs -f web-app-container

# 最新の100行を表示
docker logs --tail 100 web-app-container

スクリーンショット 2026-01-11 6.51.32.png


2. コンテナ内でコマンドを実行

# コンテナ内でシェルを起動
docker exec -it web-app-container sh

# コンテナ内で
ls -la
ps aux
exit

# コンテナ内で1回だけコマンドを実行
docker exec web-app-container node --version

3. コンテナの停止と削除

# コンテナを停止
docker stop web-app-container

# コンテナを削除
docker rm web-app-container

# 停止と削除を同時に
docker rm -f web-app-container

# 全ての停止中のコンテナを削除
docker container prune

スクリーンショット 2026-01-11 6.53.41.png
stopにしたら、docker ps(起動中のプロセス)で表示されなくなった。


4. イメージの削除

# イメージを削除
docker rmi web-app:latest

# 未使用のイメージを全て削除
docker image prune -a

スクリーンショット 2026-01-11 6.55.00.png

Dockerの停止・自分のまとめ

  • Dockは以下のように起動される(同じImageをもとにContainerが起動可能)ので、Dockerの削除とImageの削除は切り分けて考える。
  • イメージは溜まっていっちゃうので、不要であればコンテナを停止、削除した後に一緒に削除する。
  • Containerで使用中のイメージを削除しようとするとアラートが出る。
Dockerfile (設計図)
    ↓ docker build
Docker Image (テンプレート・読み取り専用)
    ↓ docker run (何度でも実行可能)
Container 1, 2, 3... (実行インスタンス・読み書き可能)

Docker Composeの使用

そもそもDocker Composeはなぜ使う?

🎯 複数コンテナの一括管理

実際のアプリケーションは複数のサービスで構成されます:

  • Webアプリケーション
  • データベース
  • リバースプロキシ(Nginx)
  • キャッシュ(Redis)など

❌ docker runの問題点

# 3つのコンテナを個別に起動する必要がある
docker run -d --name db -e POSTGRES_PASSWORD=postgres postgres:15-alpine
docker run -d --name web -p 3000:3000 --link db:db web-app:latest
docker run -d --name nginx -p 80:80 --link web:web nginx:alpine

問題:

  • コマンドが長く複雑
  • 起動順序を手動で管理
  • チーム共有が困難
  • 停止・削除も個別に実行

✅ Docker Composeの利点

# docker-compose.yml で一元管理
services:
  db:
    image: postgres:15-alpine
  web:
    build: .
    depends_on: [db]
  nginx:
    image: nginx:alpine
    depends_on: [web]
# 1コマンドで全て起動
docker-compose up -d

# 1コマンドで全て停止・削除
docker-compose down

メリット:

  • 設定の一元管理(YAMLファイル)
  • 依存関係の自動管理
  • チーム全員が同じ環境を構築可能
  • 開発効率の向上

やってみよう

docker-compose.ymlの作成

nano docker-compose.yml

# web-app-comparison/          ← ここがルートディレクトリ
# ├── Dockerfile               ← 既存
# ├── docker-compose.yml       ← ここに作成
# ├── nginx.conf              ← ここに作成
# ├── package.json            ← 既存
# ├── package-lock.json       ← 既存
# ├── server.js               ← 既存
# └── .dockerignore           ← 既存

内容:

version: '3.8'

services:
  # Webアプリケーション
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - PORT=3000
    depends_on:
      - db
    restart: unless-stopped
    networks:
      - app-network

  # PostgreSQLデータベース
  db:
    image: postgres:15-alpine
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=webapp
    volumes:
      - postgres-data:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    restart: unless-stopped
    networks:
      - app-network

  # Nginx(リバースプロキシ)
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - web
    restart: unless-stopped
    networks:
      - app-network

volumes:
  postgres-data:

networks:
  app-network:
    driver: bridge

Nginx設定ファイルの作成

nano nginx.conf

内容:

events {
    worker_connections 1024;
}

http {
    upstream web_app {
        server web:3000;
    }

    server {
        listen 80;
        server_name localhost;

        location / {
            proxy_pass http://web_app;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

Docker Composeで起動

# 全てのサービスを起動
docker-compose up -d

# 出力例:
# Creating network "web-app-comparison_app-network" with driver "bridge"
# Creating volume "web-app-comparison_postgres-data" with default driver
# Creating web-app-comparison_db_1 ... done
# Creating web-app-comparison_web_1 ... done
# Creating web-app-comparison_nginx_1 ... done

# サービスの状態を確認
docker-compose ps

# 出力例:
# Name                          Command               State           Ports
# ---------------------------------------------------------------------------------
# web-app-comparison_db_1       docker-entrypoint.sh postgres   Up      0.0.0.0:5432->5432/tcp
# web-app-comparison_nginx_1    /docker-entrypoint.sh ngin...   Up      0.0.0.0:80->80/tcp
# web-app-comparison_web_1      docker-entrypoint.sh npm start  Up      0.0.0.0:3000->3000/tcp

# ブラウザでアクセス
# http://localhost

スクリーンショット 2026-01-11 7.16.55.png
この順番で、docker-composeの起動が完了しています!

  • イメージの準備
    • Nginxイメージをダウンロード
    • PostgreSQLイメージをダウンロード
    • Webアプリイメージをビルド
  • リソースの作成
    • ネットワークを作成
    • ボリュームを作成
  • コンテナの起動
    • depends_onの順序に従って、コンテナが起動される。

Docker Composeの管理

# ログを表示
docker-compose logs

# 特定のサービスのログ
docker-compose logs web

# リアルタイムでログを表示
docker-compose logs -f

# サービスを停止
docker-compose stop

# サービスを停止して削除
docker-compose down

# ボリュームも含めて削除
docker-compose down -v

ログを表示するとめっちゃ出てきました。
スクリーンショット 2026-01-11 7.25.04.png
起動順序

1. Nginx起動 → 2. Web App起動 → 3. PostgreSQL初期化・起動

それぞれのステップ

  1. Nginx起動(nginx-1):設定ファイル読み込み、IPv6対応有効化
  2. Web App起動(web-1):Node.jsサーバー起動、ポート3000でリッスン開始
  3. PostgreSQL初期化(db-1):DBクラスター作成、ディレクトリとファイルの準備
  4. PostgreSQL起動テスト(db-1):一時的に起動してDB作成。
  5. PostgreSQL本起動(db-1):本番モードできろう。ポート5432でリッスン開始
  6. 定期処理(db-1):5分ごとにデータを永続化
  7. アクセスログ(nginx-1):ユーザーがブラウザでアクセス。

まとめ:Docker Compose

Docker Composeは、複数のDockerコンテナをdocker-compose.ymlという指令書によって、docker-compose up -dをするだけで一回で立ち上げ・その他管理することができるものとしれました。docker-compose起動で中で、リバースプロキシ、webサーバ、DBサーバが起動していく流れもログで確認できました。


次のステップ

Docker, Docker Composeについて概要が知れたので、目的だったkubernetesも触ってみます!!♪

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?