前回Dockerについて手を動かして学べたので、Docker composeについて学んでいきます。
Dockerの起動、試してみた。の続きです。
目次
Dockerコンテナの管理
1. ログの確認
# ログを表示
docker logs web-app-container
# リアルタイムでログを表示
docker logs -f web-app-container
# 最新の100行を表示
docker logs --tail 100 web-app-container
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

stopにしたら、docker ps(起動中のプロセス)で表示されなくなった。
4. イメージの削除
# イメージを削除
docker rmi web-app:latest
# 未使用のイメージを全て削除
docker image prune -a
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

この順番で、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
1. Nginx起動 → 2. Web App起動 → 3. PostgreSQL初期化・起動
それぞれのステップ
- Nginx起動(nginx-1):設定ファイル読み込み、IPv6対応有効化
- Web App起動(web-1):Node.jsサーバー起動、ポート3000でリッスン開始
- PostgreSQL初期化(db-1):DBクラスター作成、ディレクトリとファイルの準備
- PostgreSQL起動テスト(db-1):一時的に起動してDB作成。
- PostgreSQL本起動(db-1):本番モードできろう。ポート5432でリッスン開始
- 定期処理(db-1):5分ごとにデータを永続化
- アクセスログ(nginx-1):ユーザーがブラウザでアクセス。
まとめ:Docker Compose
Docker Composeは、複数のDockerコンテナをdocker-compose.ymlという指令書によって、docker-compose up -dをするだけで一回で立ち上げ・その他管理することができるものとしれました。docker-compose起動で中で、リバースプロキシ、webサーバ、DBサーバが起動していく流れもログで確認できました。
次のステップ
Docker, Docker Composeについて概要が知れたので、目的だったkubernetesも触ってみます!!♪


