Docker Run 마스터하기: 필수 명령어 옵션 설명
자주 사용하는 Docker run 플래그(포트, 볼륨, 환경 변수, 이름, 분리 모드, 재시작 정책, 정리)를 알아보세요.
Docker Run 마스터하기: 필수 명령 옵션 설명
docker run은 이미지에서 새 컨테이너를 생성하고 시작합니다. 명령은 처음에 간단해 보이지만, 옵션에 따라 컨테이너가 네트워크에 연결하고, 데이터를 저장하고, 구성을 수신하고, 재시작 후 동작하는 방식이 결정됩니다.
이 가이드는 실행하려는 이미지는 알지만 실제 설정에 필요한 올바른 플래그를 모를 때 사용하세요.
기본 구문
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
IMAGE는 nginx 또는 postgres:16과 같은 이미지 이름입니다. COMMAND와 ARG...는 선택 사항이며 이미지의 기본 명령을 재정의하거나 확장합니다.
빠른 포그라운드 테스트의 경우:
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-stopped가 always보다 더 적합한 경우가 많습니다. 수동 중지가 계속 유지되기 때문입니다.
--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을 사용하세요.