본문으로 건너뛰기
AZ Tools

Docker Run → Compose 변환기

docker run 명령을 docker-compose.yml로 변환 — 포트·볼륨·환경변수·리소스 제한까지 매핑.

docker-compose.yml
services:
  web:
    image: "nginx:1.27-alpine"
    container_name: web
    ports:
      - "8080:80"
      - "8443:443"
    environment:
      TZ: Asia/Seoul
    volumes:
      - "./site:/usr/share/nginx/html:ro"
      - "nginx-cache:/var/cache/nginx"
    restart: unless-stopped

volumes:
  nginx-cache:
참고
  • -d는 파일에 들어가는 설정이 아닙니다. 대신 docker compose up -d로 실행하세요.

사용법

  1. docker run 명령을 붙여넣으세요. 줄 continuation, 따옴표로 감싼 인자, --flag=value 형식 모두 파싱됩니다.
  2. 컨테이너 이름이나 이미지 이름 말고 다른 걸 쓰고 싶으면 서비스 이름을 바꾸세요.
  3. YAML을 docker-compose.yml에 복사한 뒤, 파일 설정으로 표현할 수 없었던 항목은 참고 메모에서 확인하세요.

자세한 설명

펼치기

프로젝트 README에 있는 docker run 명령을 붙여넣으면 대응하는 docker-compose.yml을 돌려줍니다. 포트, 바인드 마운트와 명명된 볼륨, 환경변수, 레이블, 케이퍼빌리티, 디바이스, 리소스 제한 등이 각자의 Compose 키로 매핑되고, 사람들이 흔히 빠뜨리는 두 가지도 처리됩니다. 명명된 볼륨은 최상위 volumes 항목을 따로 얻고, --network로 넘긴 네트워크는 Compose가 만든 것이 아니므로 external로 선언됩니다. 출력에는 version 키가 없습니다. Compose 명세가 오래전에 없앴고 현재 도커는 경고를 띄우는 키입니다. 의도적으로 아무것도 만들지 않는 플래그가 둘 있습니다. -d는 스택이 무엇인지가 아니라 어떻게 시작하는지를 말하고, --rm은 대응하는 설정 자체가 없어서, 없는 것을 지어내는 대신 참고 항목으로 알려 줍니다. 파서가 알아보지 못한 것도 조용히 버리지 않고 목록으로 보여 주므로, 손을 더 대야 할 부분이 무엇인지 정확히 알 수 있습니다.

자주 묻는 질문

맨 위에 version: 줄이 왜 없나요?

Compose 명세가 v2와 v3 형식을 통합하면서 폐기된 키이기 때문입니다. Docker Compose v2는 이 키를 완전히 무시하고 지우라는 경고를 출력하므로, 넣어 봐야 나중에 지워야 할 줄만 늘어납니다. version이 없는 것이 요즘 파일의 정상적인 모습입니다. 아직 version이 남아 있는 기존 파일에 붙여넣는 중이라면 그 줄도 함께 지우세요.

제 네트워크가 왜 external: true로 표시되나요?

--network는 이미 존재하는 네트워크를 가리키기 때문입니다. Compose는 그러지 않으면 프로젝트용 네트워크를 스스로 만들어 서비스를 자동으로 붙이므로, 이름만 적으면 의도한 그 네트워크에 합류하는 대신 같은 이름의 두 번째 네트워크를 만들라는 뜻이 됩니다. external로 표시하면 그 네트워크가 이 파일 밖에서 관리되고 있으니 있는 그대로 붙으라는 의미가 됩니다. Compose가 직접 관리하게 하고 싶다면 networks 블록을 통째로 지우세요. 기본 생성되는 네트워크만으로도 서비스끼리 서비스 이름으로 서로를 찾을 수 있습니다.

-d와 --rm은 어떻게 되나요?

둘 다 파일 설정이 되지 않으며, 조용히 버리는 대신 참고 항목으로 알려 줍니다. -d는 애초에 컨테이너의 속성이 아니라 어떻게 실행했는지를 나타내는 것이고, Compose에서 대응하는 동작은 docker compose up -d로 실행하는 것입니다. --rm은 대응물이 없습니다. Compose는 로그를 읽고 다시 시작할 수 있도록 멈춘 컨테이너를 일부러 남겨 두는데, 이는 --rm이 요구하는 것과 정반대입니다. 가장 가까운 동작은 스스로 정리하는 일회성 컨테이너를 위한 docker compose run --rm입니다.

포트와 일부 값에 왜 따옴표가 붙나요?

그러지 않으면 YAML이 다른 것으로 읽기 때문입니다. 따옴표 없는 22:22는 여러 도구가 아직 쓰는 YAML 1.1에서 60진수이고, 포트 매핑이 아니라 1342로 도착합니다. 환경변수 값도 같은 함정에 걸립니다. yes와 no는 불리언이 되고, 1.10은 부동소수점 1.1이 되어 끝의 0을 잃으며, 콜론이 들어간 값은 매핑을 망가뜨립니다. 잘못 읽힐 수 있는 것에는 따옴표를 붙이고 안전한 것은 그대로 두어 파일이 읽기 좋게 유지됩니다.

처리하지 않는 플래그는 무엇인가요?

키 하나로 깔끔하게 대응되지 않는 것들입니다. --gpus, --sysctl, --ulimit, --health-cmd 계열, 쉼표로 구분하는 긴 형식의 --mount, --link, 그리고 이 페이지보다 나중에 생긴 것들이 여기 해당합니다. 이름과 함께 참고 항목에 나열되므로 알리지 않고 사라지는 것은 없습니다. 헬스체크와 ulimit는 Compose에도 있지만 스칼라가 아니라 중첩 블록을 받으므로, 플래그만 보고 추측하는 것보다 직접 작성하는 편이 낫습니다.

관련 도구