Docker Run → Docker Compose 변환기 (역변환 지원)

docker run 명령을 docker-compose.yml 서비스로, Compose 서비스를 다시 docker run으로 바꾸세요.

예시:
\로 이어지는 여러 줄 명령, 따옴표, --flag=value 형식도 사용할 수 있습니다.
docker-compose.yml
services:
  db:
    image: postgres:16
    container_name: db
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: change-me
      POSTGRES_DB: app
    volumes:
      - pgdata:/var/lib/postgresql/data
    ports:
      - "127.0.0.1:5432:5432"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      retries: 5
volumes:
  pgdata:
    name: pgdata
참고
  • -d / --detach 제외: 백그라운드로 실행하려면 "docker compose up -d"를 사용하세요.
  • 이름 있는 볼륨은 정확한 이름("name:")을 유지하므로, Compose가 새로 빈 "<project>_<volume>" 볼륨을 만들지 않고 docker run이 만든 볼륨을 재사용합니다.

모든 처리는 브라우저 안에서 이루어집니다. 명령과 Compose 파일은 그 안의 비밀번호까지 포함해 어디로도 전송되지 않습니다. 모든 무료 도구 보기.

문제를 발견하셨거나 개선할 점이 있나요? 모든 메시지를 읽고 빠르게 고칩니다.

이 docker run → Docker Compose 변환기는 프로젝트 README에서 복사해 오는 docker run 명령을 docker-compose.yml 서비스로 바꿔 줍니다. 포트, 볼륨, 환경 변수, 네트워크, 재시작 정책, 헬스체크, capabilities, 디바이스, GPU 접근 등 수십 가지 옵션을 처리합니다. 반대 방향도 지원해서, Compose 파일의 각 서비스를 빠른 테스트용이나 Compose가 없는 시스템용 docker run 명령으로 바꿔 줍니다.

변환은 실제 배포를 망가뜨리는 세부 사항에 신경 씁니다. YAML 1.1은 따옴표 없는 22:22를 60진수로 읽기 때문에 포트에 따옴표를 붙입니다. 명명된 볼륨은 이름을 정확히 유지하므로, Compose가 빈 “<project>_<volume>”을 새로 만들지 않고 docker run이 만든 데이터를 재사용합니다. $(pwd)는 상대 경로가 됩니다. -d, --rm처럼 CLI 세션에만 영향을 주는 플래그는 안내와 함께 제외하고, Compose에 대응하는 항목이 없는 것은 조용히 버리지 않고 경고로 나열합니다.

사용 방법

  1. 왼쪽 상자에 docker run 명령을 붙여 넣거나 예시를 클릭하세요. 백슬래시로 이어진 여러 줄 명령도 괜찮습니다.
  2. 오른쪽에 생성된 docker-compose.yml을 읽고, 아래의 안내와 경고를 확인하세요.
  3. YAML을 복사하거나 docker-compose.yml로 다운로드해 프로젝트 디렉터리에 넣고 docker compose up -d를 실행하세요.
  4. 반대로 변환하려면 “Compose → docker run”으로 전환하고 Compose 파일을 붙여 넣은 뒤 서비스별 명령을 복사하세요.

자주 묻는 질문

docker run과 docker compose의 차이는 무엇인가요?

docker run은 명령줄 옵션으로 컨테이너 하나를 시작합니다. Docker Compose는 하나 이상의 컨테이너와 그 네트워크, 볼륨을 YAML 파일에 기술하고 docker compose up으로 함께 시작합니다. Compose는 버전 관리에 넣고, 검토하고, 똑같이 다시 실행하기가 더 쉬우며, 같은 Compose 프로젝트의 서비스끼리는 서비스 이름으로 서로 접근할 수 있습니다.

docker-compose.yml에 아직 version: 줄이 필요한가요?

아니요. 최상위 version 키는 Docker Compose v2가 쓰는 Compose Specification에서 더 이상 쓰이지 않으며, 현재 버전은 무시된다는 경고를 출력합니다. 이 변환기는 version을 넣지 않습니다. 요즘 파일 이름은 보통 compose.yaml이지만 docker-compose.yml도 여전히 읽힙니다.

Compose로 바꾼 뒤 볼륨 데이터가 사라진 이유는 무엇인가요?

Compose는 명명된 볼륨 앞에 프로젝트 이름을 붙이므로, pgdata라는 볼륨은 myproject_pgdata가 되어 비어 있는 새 볼륨이 됩니다. docker run이 만든 볼륨을 재사용하려면 최상위에 name: pgdata로 선언하거나(이 변환기가 그렇게 합니다) external: true로 표시하세요. 바인드 마운트(/나 ./로 시작하는 경로)는 영향을 받지 않습니다.

-d, -it, --rm은 어떻게 되나요?

-d는 컨테이너를 시작하는 방식의 속성이므로 docker compose up -d를 쓰세요. -i와 -t는 stdin_open: true와 tty: true가 됩니다. --rm은 서비스별로 대응하는 항목이 없습니다. docker compose down이 컨테이너를 제거하고, 일회성 명령에는 docker compose run --rm이 있습니다.

GPU 옵션은 어떻게 변환되나요?

--gpus all은 deploy.resources.reservations.devices 아래에 driver: nvidia, count: all, capabilities: [gpu]를 갖는 디바이스 예약이 되며, 이는 Docker Compose 문서에 나온 형식입니다. 특정 GPU(--gpus '"device=0,1"')는 device_ids가 됩니다. 호스트에는 여전히 NVIDIA Container Toolkit이 설치되어 있어야 합니다.

명령이 서버로 전송되나요?

아니요. 파싱과 변환은 브라우저에서 이루어지므로 명령에 든 환경 변수, 비밀번호, 내부 호스트 이름은 기기 밖으로 나가지 않습니다. 그래도 비밀 값이 들어 있는 Compose 파일은 비밀번호 파일처럼 다루세요. 비밀 값은 .gitignore에 등록한 env_file로 옮기세요.

docker run 플래그와 대응하는 Compose 키

• -p 8080:80 → ports: ["8080:80"] · --expose → expose

• -v /host:/ctr 또는 -v name:/ctr → volumes · --mount → 긴 문법의 volumes · --tmpfs → tmpfs

• -e KEY=value → environment · --env-file → env_file · -l / --label → labels

• --name → container_name · -h → hostname · -u → user · -w → working_dir

• --restart → restart · --network → networks 또는 network_mode (host, none, container:…) · --network-alias, --ip → 네트워크별 aliases와 ipv4_address

• --entrypoint → entrypoint · 이미지 뒤의 인수 → command

• --health-cmd/-interval/-timeout/-retries/-start-period → healthcheck · --no-healthcheck → healthcheck.disable

• --cap-add/--cap-drop → cap_add/cap_drop · --device → devices · --privileged, --read-only, --init → 같은 이름

• -m / --memory → mem_limit · --cpus → cpus · --shm-size → shm_size · --ulimit → ulimits · --sysctl → sysctls

• --log-driver/--log-opt → logging · --add-host → extra_hosts · --dns → dns · --gpus → deploy.resources.reservations.devices

변환 후: 제대로 된 Compose 프로젝트로 만들기

일대일 변환은 출발점일 뿐입니다. 여러 컨테이너가 한 파일에 모이면 --link와 하드코딩된 컨테이너 IP를 서비스 이름으로 바꾸세요(앱은 db:5432로 데이터베이스에 접근합니다). 앱이 데이터베이스의 헬스체크를 기다리도록 depends_on에 condition: service_healthy를 추가하고, Compose 밖의 무언가가 고정 이름을 필요로 하지 않는다면 container_name은 빼세요. 서비스를 확장할 수 없게 만들기 때문입니다. 비밀번호는 environment에서 .env 파일이나 Compose secrets로 옮기고, 그 파일은 Git에 넣지 마세요.

관련 무료 도구

  • 서브넷 계산기 — 모든 CIDR의 네트워크, 브로드캐스트, 호스트 범위, 마스크를 계산하고, VLSM으로 네트워크를 나누고, IPv6를 확장하고, 겹치는 범위를 찾으세요.
  • Chmod 계산기 — 읽기, 쓰기, 실행 체크박스를 선택해 8진수 모드와 chmod 명령어를 얻거나, 755, 644, rwxr-xr-x를 해석하세요.
  • .gitignore 생성기 — 언어, 프레임워크, 편집기, 운영체제별 .gitignore 템플릿을 하나의 깔끔한 파일로 합치세요.
  • JSON 포매터 — JSON을 보기 좋게 정렬하고, 압축하고, 검증하세요. 파싱 오류는 줄과 열 위치까지 알려 줍니다. 브라우저에서 실행, 업로드 없음.
  • Cron 표현식 생성기 — 드롭다운으로 cron 일정을 만들거나 붙여 넣어 쉬운 말로 읽고, 다음 실행 10회를 내 시간대와 UTC로 확인하세요. 무료, 브라우저에서 실행.