Docker Run 마스터하기: 필수 명령어 옵션 설명

자주 사용하는 Docker run 플래그(포트, 볼륨, 환경 변수, 이름, 분리 모드, 재시작 정책, 정리)를 알아보세요.

Docker Run 마스터하기: 필수 명령 옵션 설명

docker run은 이미지에서 새 컨테이너를 생성하고 시작합니다. 명령은 처음에 간단해 보이지만, 옵션에 따라 컨테이너가 네트워크에 연결하고, 데이터를 저장하고, 구성을 수신하고, 재시작 후 동작하는 방식이 결정됩니다.

이 가이드는 실행하려는 이미지는 알지만 실제 설정에 필요한 올바른 플래그를 모를 때 사용하세요.

기본 구문

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

IMAGEnginx 또는 postgres:16과 같은 이미지 이름입니다. COMMANDARG...는 선택 사항이며 이미지의 기본 명령을 재정의하거나 확장합니다.

빠른 포그라운드 테스트의 경우:

docker run hello-world

실제 서비스의 경우 일반적으로 옵션을 추가합니다.

-d로 백그라운드에서 실행

기본적으로 Docker는 터미널을 컨테이너의 출력에 연결합니다. 분리 모드는 컨테이너를 백그라운드에서 실행합니다:

docker run -d nginx

Docker는 새 컨테이너 ID를 출력하고 프롬프트를 반환합니다. 다음으로 확인하세요:

docker ps

분리된 컨테이너의 로그를 읽으려면:

docker logs <container_id_or_name>

-p로 포트 게시

컨테이너에는 자체 네트워크 네임스페이스가 있습니다. 서비스가 컨테이너 내부에서 수신 대기하는 경우 포트를 게시하여 호스트에서 접근할 수 있도록 합니다:

docker run -d -p 8080:80 nginx

이렇게 하면 호스트 포트 8080이 컨테이너 포트 80에 매핑되어 http://localhost:8080이 Nginx에 도달합니다.

둘 이상의 포트를 게시할 수 있습니다:

docker run -d -p 8080:80 -p 8443:443 nginx

호스트의 localhost에만 바인딩하려면 호스트 IP를 포함하세요:

docker run -d -p 127.0.0.1:8080:80 nginx

이는 모든 호스트 인터페이스에 노출하고 싶지 않은 로컬 도구에 유용합니다.

볼륨으로 데이터 유지

컨테이너 쓰기 가능 계층은 지속적인 데이터에 적합하지 않습니다. 특정 호스트 경로를 컨테이너에 마운트하려면 바인드 마운트를 사용하세요:

docker run -d -p 8080:80 -v "$PWD/html:/usr/share/nginx/html:ro" nginx

이렇게 하면 로컬 html 디렉토리의 파일이 제공됩니다. :ro 접미사는 마운트를 컨테이너 내부에서 읽기 전용으로 만듭니다.

Docker가 스토리지 위치를 관리하도록 하려면 명명된 볼륨을 사용하세요:

docker run -d --name postgres -v pgdata:/var/lib/postgresql/data postgres:16

pgdata가 없으면 Docker가 생성합니다. 볼륨을 검사하려면:

docker volume ls

새 작업의 경우 Docker의 --mount 구문이 더 장황하지만 더 명확합니다:

docker run -d --mount type=volume,src=pgdata,dst=/var/lib/postgresql/data postgres:16

-e--env-file로 구성 전달

환경 변수는 컨테이너화된 앱을 구성하는 일반적인 방법입니다:

docker run -d -e APP_ENV=production my-custom-app:latest

여러 변수에 대해 -e를 여러 번 사용하세요:

docker run -d -e DB_HOST=database.example.com -e DB_USER=app my-app:latest

변수가 많으면 env 파일을 사용하세요:

docker run -d --env-file ./app.env my-app:latest

비밀은 커밋된 .env 파일에 보관하지 마세요. 환경 변수는 호스트와 충분한 액세스 권한이 있는 프로세스에서 쉽게 검사할 수 있으므로 프로덕션 값에는 플랫폼의 비밀 관리자를 사용하세요.

--name으로 컨테이너 이름 지정

Docker는 이름을 생성할 수 있지만, 명확한 이름은 이후 명령을 더 쉽게 만듭니다:

docker run -d --name web -p 8080:80 nginx

그런 다음 다음을 사용할 수 있습니다:

docker logs web
docker stop web
docker exec -it web sh

컨테이너 이름은 고유해야 합니다. web이 이미 존재하는 경우 이름을 재사용하기 전에 이전 컨테이너를 제거하거나 이름을 바꾸세요.

-it로 대화형 모드 사용

셸 및 문제 해결 세션의 경우 대화형 모드와 의사 TTY를 결합하세요:

docker run -it ubuntu bash

셸을 종료하면 컨테이너가 중지됩니다. 일회성 세션에는 --rm을 추가하세요:

docker run --rm -it alpine sh

재시작 정책 선택

재시작 정책은 컨테이너가 종료될 때 Docker가 수행할 작업을 지정합니다:

docker run -d --name web --restart unless-stopped -p 8080:80 nginx

일반적인 정책은 다음과 같습니다:

  • no: 자동으로 재시작하지 않습니다. 기본값입니다.
  • on-failure[:max-retries]: 0이 아닌 종료 코드가 있는 경우에만 재시작합니다.
  • always: 컨테이너가 중지될 때마다 재시작합니다(Docker 데몬 재시작 포함).
  • unless-stopped: 명시적으로 컨테이너를 중지하지 않은 경우에만 재시작합니다.

장기 실행 로컬 서비스의 경우 unless-stoppedalways보다 더 적합한 경우가 많습니다. 수동 중지가 계속 유지되기 때문입니다.

--rm으로 일회용 컨테이너 제거

중지된 컨테이너는 제거할 때까지 디스크에 남아 있습니다. 일회성 명령의 경우 --rm은 컨테이너가 종료된 후 정리합니다:

docker run --rm ubuntu echo "임시 컨테이너에서 안녕하세요"

나중에 중지된 상태를 검사해야 하는 컨테이너에는 --rm을 사용하지 마세요.

실제 예제

이 명령은 안정적인 이름, 게시된 포트, 바인드 마운트된 로그 디렉토리, 환경 변수 및 재시작 정책을 사용하여 웹 앱을 실행합니다:

docker run -d \
  --name my-app \
  --restart on-failure \
  -p 3000:80 \
  -v "$PWD/logs:/app/logs" \
  -e NODE_ENV=production \
  my-node-app:1.0

시작한 후 컨테이너를 확인하고 로그를 확인하세요:

docker ps
docker logs my-app

핵심 내용

작동하는 가장 작은 docker run 명령으로 시작한 다음 필요한 동작에 대한 옵션을 추가하세요: 백그라운드 서비스에는 -d, 액세스에는 -p, 데이터에는 -v 또는 --mount, 구성에는 -e, 작업에는 --name, 복원력에는 --restart, 임시 실행에는 --rm을 사용하세요.