docker-compose.yml

docker-compose.yml は、複数のDockerコンテナ構成を1つの設定ファイルで定義・管理するための YAML ファイルである。このファイルには、使用するイメージ、ビルド方法、ネットワーク、ボリューム、環境変数、起動順序などを記述し、 docker compose up コマンドにより、定義された複数のコンテナをまとめて起動・停止できる。

docker-compose.yml の設定

services(コンテナ定義)

項目説明
image
【例】image: nginx:alpine
使用するDockerイメージ
build
【例】build: .
Dockerfileからビルド
container_name
【例】container_name: my-web
コンテナ名を指定
command
【例】command: npm start
起動コマンドを上書き
ports
【例】ports:
    - "8080:80"
    - "3000:3000"
ポートマッピング
expose
【例】expose:
    - "3000"
内部ポート公開
networks
【例】networks:
    - frontend
    - backend
接続するネットワーク
environment
【例】environment:
    - NODE_ENV=production
    - DB_URL=postgres://db:5432/mydb
環境変数を設定
env_file
【例】env_file:
    - .env
環境変数ファイル
volumes
【例】volumes:
    - db-data:/var/lib/mysql
    - ./app:/app
    - ./config:/etc/config:ro
ボリュームマウント
depends_on
【例】depends_on:
    - db
    - cache
起動順序の依存関係
restart
【例】restart: always
再起動ポリシー

networks(ネットワーク定義)

項目説明
(名前のみ)
【例】networks:
    frontend:
シンプルな定義
driver
【例】networks:
    frontend:
    driver: bridge
ネットワークドライバー
ipam.config
【例】networks:
    frontend:
    ipam:
    config:
    - subnet: 172.20.0.0/16
    gateway: 172.20.0.1
サブネット・ゲートウェイ
internal
【例】networks:
    backend:
    internal: true
内部専用ネットワーク
external
【例】networks:
    existing:
    external: true
    name: my-network
既存ネットワークを使用

volumes(ボリューム定義)

項目説明
(名前のみ)
【例】volumes:
    db-data:
シンプルな定義
driver
【例】volumes:
    db-data:
    driver: local
ボリュームドライバー
external
【例】volumes:
    existing:
    external: true
    name: my-volume
既存ボリュームを使用

docker-compose.yml の設定例

基本的な構成

version: '3.8'

services:
  web:
    image: nginx:alpine
    container_name: web-server
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
    networks:
      - frontend
    restart: always

Web + データベース

version: '3.8'

services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80"
    depends_on:
      - api
    networks:
      - frontend
      
  api:
    build: ./api
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgres://user:pass@db:5432/mydb
    ports:
      - "3000:3000"
    depends_on:
      - db
    networks:
      - frontend
      - backend
      
  db:
    image: postgres:15
    environment:
      - POSTGRES_PASSWORD=secret
      - POSTGRES_DB=mydb
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend

volumes:
  db-data:

networks:
  frontend:
  backend:

マイクロサービス構成

version: '3.8'

services:
  gateway:
    image: nginx:alpine
    ports:
      - "80:80"
    networks:
      - services
      
  user-service:
    build: ./services/user
    environment:
      - DATABASE_URL=postgres://postgres:secret@user-db:5432/users
    networks:
      - services
      
  user-db:
    image: postgres:15
    environment:
      - POSTGRES_PASSWORD=secret
      - POSTGRES_DB=users
    volumes:
      - user-data:/var/lib/postgresql/data
    networks:
      - services
      
  order-service:
    build: ./services/order
    environment:
      - DATABASE_URL=postgres://postgres:secret@order-db:5432/orders
    networks:
      - services
      
  order-db:
    image: postgres:15
    environment:
      - POSTGRES_PASSWORD=secret
      - POSTGRES_DB=orders
    volumes:
      - order-data:/var/lib/postgresql/data
    networks:
      - services

volumes:
  user-data:
  order-data:

networks:
  services: