수십 개의 플래그가 있는 docker run 명령은 한 번 입력하는 것으로는 괜찮습니다. 하지만 팀원과 공유하거나, 시스템 재설치 후 다시 실행하거나, 두 번째 서비스를 추가하면 유지 보수 문제가 됩니다. 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:선택이지만 권장
-d(docker 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"

YAML이 80:80 같은 값을 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 스택:

# 세 개의 별도 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을 사용하세요:

  • 일회성 디버깅 컨테이너 (docker run --rm -it image sh)
  • 영속성 없이 단일 이미지를 빠르게 테스트
  • 파이프라인이 이미 오케스트레이션을 관리하는 CI 단계

도구 사용해보기

docker run을 Compose로 즉시 변환 →

어떤 길이의 docker run 명령이든 붙여 넣으면 유효한 docker-compose.yml이 생성됩니다. 모든 표준 플래그 지원: 환경 변수, 볼륨, 포트 매핑, 재시작 정책, 리소스 제한, 엔트리포인트, 네트워킹.

출력은 현재 Compose v2 문법을 따릅니다(version: 필드 불필요). 프로젝트에 직접 복사하거나 멀티 서비스 스택의 기반으로 사용하세요.