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

`docker run` 명령어에 대한 심층 가이드를 통해 Docker 컨테이너의 모든 기능을 활용하세요. 디태치 모드(`-d`), 포트 매핑(`-p`), 볼륨 마운트(`-v`), 환경 변수(`-e`), 컨테이너 이름 지정(`--name`), 자동 정리(`--rm`)를 위한 필수 플래그를 배우십시오. 이러한 옵션을 마스터하여 컨테이너화된 애플리케이션을 자신감 있고 효율적으로 구축, 배포 및 관리하십시오.

31 조회수

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

Docker의 docker run 명령어는 Docker 이미지로부터 컨테이너를 생성하고 시작하는 핵심입니다. 간단한 docker run <이미지_이름>으로 시작할 수 있지만, 컨테이너의 잠재력을 최대한 활용하려면 다양한 옵션을 이해해야 합니다. 이 글에서는 네트워킹 관리, 환경 변수 구성, 볼륨을 사용한 데이터 영속화, 그리고 detached 모드로 컨테이너 실행 제어에 필요한 가장 필수적인 docker run 플래그를 자세히 설명합니다.

이러한 옵션을 이해하는 것은 효율적인 컨테이너화를 위해 중요하며, 견고하고 유연하며 관리 가능한 애플리케이션을 구축할 수 있게 합니다. 웹 서버, 데이터베이스 또는 복잡한 마이크로서비스를 실행하든, docker run을 마스터하면 Docker 워크플로우가 크게 향상될 것입니다.

docker run의 기본

docker run 명령어의 기본 구문은 다음과 같습니다:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  • [OPTIONS]: 컨테이너의 동작을 수정하는 플래그입니다.
  • IMAGE: 컨테이너를 생성할 Docker 이미지의 이름 (예: ubuntu, nginx:latest).
  • [COMMAND]: 이미지의 기본 명령을 재정의하는, 컨테이너 내에서 실행할 선택적 명령어입니다.
  • [ARG...]: 명령어의 인수입니다.

가장 영향력 있는 몇 가지 옵션을 살펴보겠습니다.

주요 docker run 옵션 설명

Detached 모드 (-d 또는 --detach)

기본적으로 docker run은 컨테이너를 포그라운드에서 시작하며, 터미널을 표준 입력, 출력 및 오류 스트림에 연결합니다. 이는 컨테이너가 중지될 때까지 터미널이 점유된다는 의미입니다. Detached 모드 (-d)를 사용하면 컨테이너가 백그라운드에서 실행되어 터미널을 자유롭게 사용할 수 있습니다.

예시:

docker run -d nginx

이 명령어는 Nginx 웹 서버 컨테이너를 백그라운드에서 시작합니다. 터미널에는 긴 컨테이너 ID가 출력되고 프롬프트가 즉시 반환됩니다.

팁: detached 컨테이너의 로그를 보려면 docker logs <컨테이너_ID_또는_이름>을 사용하십시오.

포트 매핑 (-p 또는 --publish)

컨테이너는 격리된 네트워크 환경입니다. 호스트 머신이나 네트워크상의 다른 머신에 컨테이너의 서비스를 노출하려면 포트를 매핑해야 합니다. -p 플래그를 사용하면 컨테이너의 포트를 호스트의 특정 포트로 게시할 수 있습니다.

형식은 -p <호스트_포트>:<컨테이너_포트>입니다.

예시:

Nginx 컨테이너를 실행하고 컨테이너 내부의 80번 포트를 호스트의 8080번 포트로 매핑:

docker run -d -p 8080:80 nginx

이제 웹 브라우저에서 http://localhost:8080으로 이동하여 Nginx 서버에 액세스할 수 있습니다.

여러 포트 매핑: -p 플래그를 여러 번 사용하여 여러 포트를 매핑할 수 있습니다:

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

IP 주소 지정: 호스트의 어떤 IP 주소에 바인딩할지도 지정할 수 있습니다:

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

이것은 호스트의 8080번 포트를 루프백 인터페이스(localhost)에만 바인딩합니다.

볼륨 마운팅 (-v 또는 --volume)

컨테이너 파일 시스템은 기본적으로 일시적입니다. 컨테이너가 제거되면 그 안에서 생성되거나 수정된 모든 데이터는 손실됩니다. 볼륨은 컨테이너의 수명 주기 외부에서 데이터를 영속화하는 메커니즘을 제공합니다. 호스트 머신의 디렉토리를 컨테이너 안으로 마운트하거나 Docker 관리 볼륨을 사용할 수 있습니다.

기본 형식은 -v <호스트_경로>:<컨테이너_경로>입니다.

예시:

로컬 디렉토리 ~/my-nginx-html을 컨테이너 내부의 기본 Nginx HTML 디렉토리 (/usr/share/nginx/html)로 마운트:

docker run -d -p 8080:80 -v ~/my-nginx-html:/usr/share/nginx/html nginx

호스트의 ~/my-nginx-html에 넣은 HTML 파일은 Nginx에 의해 제공됩니다. 이 파일들의 변경 사항은 컨테이너 내부에서 즉시 반영됩니다.

이름 있는 볼륨: Docker 관리 이름 있는 볼륨은 종종 더 나은 이식성과 관리를 위해 선호됩니다:

docker run -d -p 8080:80 -v my-nginx-data:/usr/share/nginx/html nginx

my-nginx-data가 존재하지 않으면 Docker가 생성합니다. docker volume ls, docker volume create, docker volume rm을 사용하여 이러한 볼륨을 관리할 수 있습니다.

환경 변수 (-e 또는 --env)

환경 변수는 컨테이너 내에서 실행되는 애플리케이션을 구성하는 데 사용할 수 있는 키-값 쌍입니다. -e 플래그를 사용하여 이러한 변수를 설정할 수 있습니다.

예시:

애플리케이션을 위한 사용자 정의 구성 변수 설정:

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

여러 변수 설정: -e를 여러 번 사용하십시오:

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

.env 파일 사용: 많은 변수를 관리하려면 --env-file 플래그를 사용할 수 있습니다:

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

여기서 app.env는 다음과 같은 내용을 포함할 수 있습니다:

DB_HOST=database.example.com
DB_USER=admin

팁: 비밀번호와 같은 민감한 정보를 버전 관리에 커밋되는 환경 변수나 .env 파일에 직접 포함하는 것에 주의하십시오.

컨테이너 이름 지정 (--name)

컨테이너를 실행할 때 Docker는 무작위의, 종종 긴, 16진수 이름을 할당합니다. --name 플래그를 사용하여 사용자 지정의 읽기 쉬운 이름을 할당하면 나중에 docker stop, docker logs 또는 docker exec와 같은 명령에서 컨테이너를 참조하기가 훨씬 쉬워집니다.

예시:

docker run -d --name my-webserver -p 8080:80 nginx

이제 이 컨테이너를 ID 대신 my-webserver로 참조할 수 있습니다.

경고: 컨테이너 이름은 고유해야 합니다. 해당 이름을 가진 컨테이너가 이미 존재하면 docker run이 실패합니다.

대화형 모드 및 TTY (-i, -t 또는 -it)

사용자 상호작용이나 의사 터미널(쉘과 같은)이 필요한 명령을 실행하려면 -i(대화형) 및 -t(의사 TTY 할당) 플래그를 사용합니다. 종종 -it로 결합됩니다.

예시:

Ubuntu 컨테이너 내에서 대화형 bash 쉘 실행:

docker run -it ubuntu bash

이 명령어는 Ubuntu 컨테이너를 시작하고 bash를 실행하며, 터미널을 거기에 연결하여 마치 Linux 시스템에 로그인한 것처럼 명령을 입력할 수 있게 합니다. 쉘에서 나가면(exit), 컨테이너가 중지됩니다.

재시작 정책 (--restart)

재시작 정책은 컨테이너가 중지될 때 자동으로 재시작해야 하는지, 그리고 어떤 조건에서 재시작해야 하는지를 정의합니다.

  • no: 컨테이너를 자동으로 재시작하지 않음 (기본값).
  • on-failure[:max_retries]: 컨테이너가 0이 아닌 종료 코드로 종료된 경우에만 재시작합니다. 선택적으로 최대 재시도 횟수를 지정할 수 있습니다.
  • always: 컨테이너가 중지되면 종료 상태에 관계없이 항상 재시작합니다.
  • unless-stopped: 컨테이너가 사용자 또는 Docker 데몬에 의해 명시적으로 중지되지 않는 한 항상 재시작합니다.

예시:

웹 서버가 충돌 시 자동으로 재시작되도록 하려면:

docker run -d --name my-resilient-webserver --restart always -p 8080:80 nginx

종료 시 컨테이너 자동 제거 (--rm)

임시 컨테이너, 특히 테스트 또는 개발 중에 컨테이너가 종료되면 자동으로 제거되기를 원할 때가 많습니다. --rm 플래그가 이를 처리합니다.

예시:

임시 컨테이너에서 명령을 실행하고 사후에 제거되도록 함:

docker run --rm ubuntu echo "Hello from a temporary container" 

echo 명령이 완료되고 컨테이너가 종료된 후 자동으로 제거됩니다. 이렇게 하면 오래된 중지된 컨테이너로 시스템이 깨끗하게 유지됩니다.

종합: 실용적인 예시

몇 가지 옵션을 결합하여 사용자 정의 웹 애플리케이션을 실행해 보겠습니다:

  • Detached 모드에서 실행 (-d).
  • 이름 할당 (--name my-app).
  • 호스트 포트 3000을 컨테이너 포트 80으로 매핑 (-p 3000:80).
  • 로그용 로컬 디렉토리 마운트 (-v $(pwd)/logs:/app/logs).
  • 환경 변수 설정 (-e NODE_ENV=production).
  • 실패 시 재시작 보장 (--restart on-failure).
  • 특정 이미지 사용 (my-node-app:1.0).
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 run 명령어는 기본 사용법보다 훨씬 다재다능합니다. -d, -p, -v, -e, --name, --rm과 같은 옵션을 활용하여 컨테이너화된 애플리케이션을 세밀하게 제어할 수 있습니다. 이러한 필수 플래그를 마스터하는 것은 정교한 컨테이너화된 환경을 효율적이고 안정적으로 구축하고 관리하기 위한 근본적인 단계입니다. 이러한 옵션을 계속 실험하여 Docker 워크플로우에 완전히 통합하십시오.