大量のフラグを持つ docker run コマンドは1回入力するだけなら問題ありません。しかし、チームメンバーと共有したり、システム再構築後に再実行したり、2つ目のサービスを追加したりすると、メンテナンスの問題になります。Docker Composeはすべてをバージョン管理されたYAMLファイルに収めることで解決します。既存の docker run コマンドをComposeに変換するのは機械的な作業——ツールに任せましょう。

コンバーターの機能

docker run コマンドを貼り付けると、すぐに使える docker-compose.yml が得られます。コンバーターはすべてのフラグをCompose相当のフィールドにマッピングし、出力を正しくフォーマットします。

入力:

docker run -d \
  --name postgres \
  -e POSTGRES_DB=myapp \
  -e POSTGRES_USER=admin \
  -e POSTGRES_PASSWORD=secret \
  -p 5432:5432 \
  -v pgdata:/var/lib/postgresql/data \
  --restart unless-stopped \
  postgres:16-alpine

出力:

services:
  postgres:
    image: postgres:16-alpine
    container_name: postgres
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: secret
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data
    restart: unless-stopped

volumes:
  pgdata:

フラグとComposeフィールドの対応

基本的な識別情報

docker runフラグComposeフィールド備考
IMAGE[:TAG]image:必須
--name NAMEcontainer_name:省略可能だが推奨
-ddocker compose up -d のCLIフラグ)Composeではデタッチモードはクライアント側フラグ

環境変数

# 単一の -e フラグ
docker run -e KEY=value -e OTHER=val image

# .envファイル
docker run --env-file .env image
services:
  app:
    image: image
    environment:
      KEY: value
      OTHER: val
    # またはファイルを参照:
    env_file:
      - .env

本番環境では .gitignore に含まれた .env ファイルで env_file を使用してください。docker-compose.yml に認証情報を直接書かないでください。

ポートマッピング

docker run -p 8080:80 -p 443:443 image
services:
  app:
    image: image
    ports:
      - "8080:80"
      - "443:443"

80:80 のような値がYAMLで60進数として解釈されるのを防ぐため、ポートには引用符を使ってください。

ボリューム

# 名前付きボリューム
docker run -v mydata:/data/db image

# バインドマウント
docker run -v /host/path:/container/path image

# 読み取り専用バインドマウント
docker run -v /host/config:/etc/config:ro image
services:
  app:
    image: image
    volumes:
      - mydata:/data/db
      - /host/path:/container/path
      - /host/config:/etc/config:ro

volumes:
  mydata:  # 名前付きボリュームをトップレベルで宣言

名前付きボリュームはトップレベルの volumes: キーで宣言する必要があります。バインドマウント(絶対ホストパス)は不要です。

ネットワーキング

docker run --network my-network --network-alias myapp image
services:
  app:
    image: image
    networks:
      - my-network

networks:
  my-network:
    driver: bridge

再起動ポリシー

docker run --restart always image
docker run --restart unless-stopped image
docker run --restart on-failure:3 image
services:
  app:
    image: image
    restart: unless-stopped

unless-stopped は本番環境で最もよく使われます:クラッシュ後とホスト再起動後に再起動しますが、明示的に停止した場合は停止したままです。

リソース制限

docker run --memory 512m --cpus 1.5 image
services:
  app:
    image: image
    deploy:
      resources:
        limits:
          memory: 512m
          cpus: '1.5'

エントリーポイントとコマンド

docker run --entrypoint /bin/sh image -c "echo hello"
services:
  app:
    image: image
    entrypoint: /bin/sh
    command: ["-c", "echo hello"]

複数の docker run からマルチサービスCompose

Composeの真の力は複数のサービスを組み合わせたときに発揮されます。典型的なNode.js + PostgreSQL + Redisスタック:

# 3つの別々の docker run コマンド
docker run -d --name postgres -e POSTGRES_DB=app -p 5432:5432 -v pgdata:/var/lib/postgresql/data postgres:16
docker run -d --name redis -p 6379:6379 redis:7-alpine
docker run -d --name api -p 3000:3000 -e DATABASE_URL=postgres://postgres@postgres:5432/app -e REDIS_URL=redis://redis:6379 --link postgres --link redis myapp:latest

--link をデフォルトサービスネットワークに置き換えてComposeに変換:

services:
  postgres:
    image: postgres:16
    container_name: postgres
    environment:
      POSTGRES_DB: app
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    container_name: redis

  api:
    image: myapp:latest
    container_name: api
    ports:
      - "3000:3000"
    environment:
      DATABASE_URL: postgres://postgres@postgres:5432/app
      REDIS_URL: redis://redis:6379
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_started

volumes:
  pgdata:

注意:--link はレガシーです。Composeでは、同じネットワーク上のすべてのサービスがサービス名で互いに到達できます。api サービスはホスト名 postgrespostgres に接続します。

docker run を使い続けるべき場面

Composeはマルチサービスのスタック・開発環境・バージョン管理したいものに適しています。以下の場合は docker run を使い続けてください:

  • 1回限りのデバッグコンテナ(docker run --rm -it image sh
  • 永続性なしでの単一イメージのクイックテスト
  • パイプラインがオーケストレーションを管理しているCIステップ

ツールを試す

docker runをComposeに即座に変換 →

どんな長さの docker run コマンドでも貼り付けると、有効な docker-compose.yml が得られます。すべての標準フラグに対応:環境変数・ボリューム・ポートマッピング・再起動ポリシー・リソース制限・エントリーポイント・ネットワーキング。

出力は現在のCompose v2構文に従います(version: フィールド不要)。そのままプロジェクトにコピーするか、マルチサービスのベースとして使用してください。