Docker Run → Docker Compose 변환기 (역변환 지원)
docker run 명령을 docker-compose.yml 서비스로, Compose 서비스를 다시 docker run으로 바꾸세요.
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에 대응하는 항목이 없는 것은 조용히 버리지 않고 경고로 나열합니다.
사용 방법
- 왼쪽 상자에 docker run 명령을 붙여 넣거나 예시를 클릭하세요. 백슬래시로 이어진 여러 줄 명령도 괜찮습니다.
- 오른쪽에 생성된 docker-compose.yml을 읽고, 아래의 안내와 경고를 확인하세요.
- YAML을 복사하거나 docker-compose.yml로 다운로드해 프로젝트 디렉터리에 넣고 docker compose up -d를 실행하세요.
- 반대로 변환하려면 “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로 확인하세요. 무료, 브라우저에서 실행.