Docker Run → Compose

docker run 명령어를 docker-compose.yml로 즉시 변환. 포트, 볼륨, 환경변수, 네트워크, 재시작 정책 등 지원.

  • 브라우저에서 처리
  • 데이터가 브라우저 밖으로 나가지 않습니다
  • 무료 · 회원가입 불필요
현재 명령을 Compose YAML로 변환합니다. 상태 표시줄과 첫 줄 주석에서 변환하지 않은 옵션을 확인하세요. Ctrl/⌘+Enter로도 변환할 수 있습니다.
이름, 포트, 바인드 마운트, 환경변수, 재시작 정책이 포함된 Nginx 예시로 입력을 바꾸고 즉시 변환합니다.
명령어, 생성된 YAML, 상태를 지웁니다. 도구 안에서 Ctrl/⌘+L을 눌러도 같은 내용을 지웁니다.
docker run 또는 docker container run 명령어 하나를 입력하세요. 백슬래시 줄 연결을 지원합니다. 명령을 실행하거나 셸 변수를 펼치지 않습니다.
docker-compose.yml
변환하지 않은 옵션의 주석을 포함해 현재 YAML 전체를 복사합니다. 프로젝트에서 docker-compose.yml로 저장하세요. 빈 출력은 복사하지 않습니다.

docker run 명령어를 입력하거나 예시를 불러와 Compose YAML을 생성하세요.

예시·자세한 설명·자주 묻는 질문 실제 출력이 있는 예시, 다른 도구와의 차이, 자주 묻는 질문.

주요 사용 사례

  • 마이그레이션: 일회성 docker run 명령어를 재현 가능한 compose 구성으로 변환.
  • 문서화: README의 run 명령어를 팀용 compose 형식으로 변환.
  • 멀티 서비스: 각 서비스 블록을 생성하여 하나의 compose 파일로 통합.
  • CI/CD: docker run 쉘 스크립트를 선언적 compose 파일로 대체.

예시: PostgreSQL 컨테이너

입력:

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"
    ports:
      - "5432:5432"
    volumes:
      - "pgdata:/var/lib/postgresql/data"
    environment:
      - "POSTGRES_DB=myapp"
      - "POSTGRES_USER=admin"
      - "POSTGRES_PASSWORD=secret"
    restart: unless-stopped

volumes:
  pgdata:

pgdata는 이름 있는 볼륨이라 최상위 volumes:에 선언합니다. 이 부분이 없으면 Compose가 파일을 거부하며, docker compose config는 service "postgres" refers to undefined volume pgdata를 출력합니다. -d는 docker compose up -d로 백그라운드 실행하므로 뺍니다. --name은 서비스 이름이 됩니다. 정확한 컨테이너 이름에 의존하는 스크립트가 있으면 container_name:을 직접 추가하세요.

예시: 포트, 리소스 제한, 기존 네트워크

docker run --rm -it --network app-net -p 127.0.0.1:8080:80/tcp \
  --restart on-failure:3 --memory 512m --cpus 1.5 --cap-add NET_ADMIN \
  ghcr.io/acme/web:1.2 npm start
services:
  acme_web:
    image: "ghcr.io/acme/web:1.2"
    ports:
      - "127.0.0.1:8080:80/tcp"
    networks:
      - app-net
    restart: "on-failure:3"
    cap_add:
      - NET_ADMIN
    stdin_open: true
    tty: true
    deploy:
      resources:
        limits:
          memory: 512m
          cpus: "1.5"
    command: ["npm", "start"]

networks:
  app-net:
    external: true

--name이 없으면 서비스 이름은 이미지에서 정해집니다(ghcr.io/acme/web:1.2 → acme_web). -it는 짧은 옵션 -i와 -t를 합친 것으로 각각 stdin_open, tty가 됩니다. --rm은 뺍니다. --network는 외부 네트워크가 되므로 미리 만들어 두어야 합니다(docker network create app-net). --network host, none, bridge, container:이름은 network_mode:가 됩니다.

예시: Compose 키가 없는 옵션

docker run -d --name web --env-file .env --entrypoint /bin/sh -u 1000:1000 -w /app --gpus all nginx:1.27 -c "nginx -g 'daemon off;'"
# Not converted: --gpus all
services:
  web:
    image: "nginx:1.27"
    entrypoint: ["/bin/sh"]
    env_file:
      - .env
    user: "1000:1000"
    working_dir: /app
    command: ["-c", "nginx -g 'daemon off;'"]

docker run의 --entrypoint는 실행 파일 하나만 받으므로 항목 하나짜리 목록이 됩니다. 이미지 뒤의 인수는 command입니다. --gpus는 1:1 대응하는 Compose 키가 없어(GPU는 deploy.resources.reservations.devices에 씀) 값을 읽어 이미지 이름을 바르게 유지하고, 첫 줄 주석과 상태 표시줄에 표시합니다.

위 출력은 모두 docker compose config(Docker Compose 5.1)를 통과합니다. 도구의 테스트가 각 예시에 이 검사를 실행합니다.

플래그 대응표

docker rundocker-compose.yml
-p, --publishports:
-v, --volumevolumes:; named volumes also in the top-level volumes:
-e, --env, --env-fileenvironment:, env_file:
--networknetworks: plus a top-level external: true network; host, none, bridge, container:… become network_mode:
--entrypointentrypoint: (one-item list)
-u, -w, -h, --domainnameuser:, working_dir:, hostname:, domainname:
--restart, --pull, --platformrestart:, pull_policy:, platform:
-l, --label, --annotationlabels:, annotations:
--add-host, --dns, --dns-option, --dns-search, --link, --exposeextra_hosts:, dns:, dns_opt:, dns_search:, links:, expose:
--cap-add, --cap-drop, --privileged, --security-opt, --devicecap_add:, cap_drop:, privileged:, security_opt:, devices:
--init, --read-only, -i, -tinit:, read_only:, stdin_open:, tty:
--tmpfs, --volumes-from, --shm-size, --sysctltmpfs:, volumes_from:, shm_size:, sysctls:
--memory, -m, --cpusdeploy.resources.limits
--memory-reservation, --memory-swap, --cpu-shares, --cpuset-cpus, --pids-limitmem_reservation:, memswap_limit:, cpu_shares:, cpuset:, pids_limit:
--pid, --ipc, --uts, --userns, --cgroupns, --stop-signalpid:, ipc:, uts:, userns_mode:, cgroup:, stop_signal:
--nameservice key
-d, --rm, -q, --detach-keysdropped
image and the arguments after itimage: and command: (JSON array)

옵션은 --flag value, --flag=value, -p 80:80, -p80:80처럼 쓸 수 있고, Docker CLI와 같이 묶어 쓸 수도 있습니다(-dit, -dp 80:80).

직접 추가해야 하는 옵션

다음 옵션은 읽지만 변환하지 않습니다. Compose 키의 구조가 다르기 때문입니다(services 레퍼런스):

docker runCompose key
--health-cmd "curl -f http://localhost/" and the other --health-*healthcheck: { test: ["CMD-SHELL", "curl -f http://localhost/"] }
--log-driver, --log-optlogging: { driver: …, options: { … } }
--network-alias api, --ipnetworks: { app-net: { aliases: [api], ipv4_address: … } }
--mountthe long syntax of volumes: (type, source, target)
--gpusdeploy.resources.reservations.devices
--ulimit nofile=1024:2048ulimits: { nofile: { soft: 1024, hard: 2048 } }
--stop-timeout 30stop_grace_period: 30s

제한 사항

  • 한 번에 docker run 명령어 하나를 변환합니다. 여러 컨테이너는 각각 변환한 뒤 서비스 블록을 하나의 services: 아래에 합치세요.
  • docker run과 docker container run을 인식하며 podman run은 인식하지 않습니다.
  • $(...), $VAR, && 같은 셸 문법은 글자 그대로 남습니다. 변수는 변환 전에 펼치거나, 결과에서 Compose 변수 보간을 쓰세요.
  • ./data 같은 상대 바인드 경로는 Compose에서는 compose 파일이 있는 디렉터리, docker run에서는 현재 디렉터리를 기준으로 합니다.

FAQ

어떤 docker run 플래그를 지원하나요?

docker run이 받는 모든 옵션(Docker CLI 29.4)을 읽습니다. 그중 Compose 키가 있는 약 60개를 변환합니다: ports, volumes, environment, env_file, entrypoint, user, working_dir, networks, restart, labels, extra_hosts, cap_add, devices, tmpfs 등(아래 대응표 참고). 나머지는 변환하지 않은 옵션으로 표시합니다.

생성되는 Compose 파일 버전은?

version 키를 쓰지 않습니다. Compose Specification은 최상위 version을 더 이상 쓰지 않는 필드로 보며, Docker Compose v2는 이 값이 있으면 경고만 출력합니다.

서비스 이름은 어떻게 결정되나요?

--name을 지정하면 해당 값이 서비스 이름이 됩니다. 그렇지 않으면 이미지 이름에서 레지스트리 접두사와 태그를 제거하고 슬래시를 언더스코어로 바꾼 이름을 사용합니다.

여러 줄 docker run 명령어도 지원하나요?

네. 백슬래시로 줄을 연속한 명령어를 붙여넣으면 올바르게 처리됩니다.

Compose 키가 없는 옵션은 어떻게 되나요?

값은 읽으므로 이미지 이름이 어긋나지 않습니다. 상태 표시줄과 파일 첫 줄 주석(예: # Not converted: --gpus all)에 표시되니, 대응하는 Compose 설정을 직접 추가하세요. docker run이 모르는 옵션은 docker run과 마찬가지로 오류가 납니다.

이름 있는 볼륨을 선언하나요?

네. -v의 소스가 이름이면(pgdata:/var/lib/postgresql/data 등) 최상위 volumes:에 추가합니다. /, ., ~로 시작하는 경로는 바인드 마운트라 선언하지 않습니다.