- Docker 컨테이너의 시작점: ENTRYPOINT 명령어 완벽 이해2025년 07월 15일 20시 05분 49초에 업로드 된 글입니다.작성자: DandyNow728x90반응형
Docker 컨테이너의 시작점: ENTRYPOINT 명령어 완벽 이해
1. Dockerfile과 컨테이너 실행의 기본 개념
1-1. Dockerfile의 역할과 핵심 명령어
Dockerfile은 Docker 이미지를 빌드하기 위한 명령어들을 담고 있는 텍스트 문서이다. 이 파일에 명시된 명령어들은 순차적으로 실행되어 최종 이미지를 생성한다.Dockerfile내에서 사용되는 다양한 명령어 중FROM과ENTRYPOINT는 이미지의 기반과 컨테이너 실행의 핵심을 담당하고 있다.FROM명령어는 빌드할 이미지의 베이스 이미지를 지정한다. 모든Dockerfile은FROM명령어로 시작하는 것이 일반적이며, 이는 특정 운영체제 또는 이미 설치된 소프트웨어가 포함된 이미지를 기반으로 작업을 시작함을 의미한다. 본 실습에서는ubuntu이미지를 기반으로 사용된다.FROM ubuntuENTRYPOINT명령어는 Docker 컨테이너가 시작될 때 항상 실행되는 명령어를 정의한다. 이는 컨테이너를 특정 애플리케이션이나 서비스로 실행되도록 설정할 때 유용하게 활용된다.ENTRYPOINT는docker run명령어의 인자를 자신의 인자로 받아들여 함께 실행될 수 있는 특성을 지닌다.ENTRYPOINT ["/bin/bash", "-c", "echo hello"]
1-2. 컨테이너 실행 흐름에서의 ENTRYPOINT의 중요성
ENTRYPOINT는 컨테이너가 실행될 때 고정적으로 실행되는 명령어를 지정함으로써, 컨테이너의 주요 목적을 명확히 정의하는 역할을 수행한다. 예를 들어, 웹 서버 컨테이너의 경우 웹 서버 시작 명령어를ENTRYPOINT에 설정하여 컨테이너가 시작됨과 동시에 웹 서버가 구동되도록 할 수 있다. 이는 컨테이너의 일관된 동작을 보장하며, 사용자가docker run명령어를 통해 컨테이너를 실행할 때 별도의 명령어를 지정할 필요 없이 미리 정의된 작업을 수행하게 한다.2. ENTRYPOINT 실습: "echo hello" 예제를 통한 이해
2-1. 실습용 Dockerfile 작성
ENTRYPOINT명령어의 동작을 이해하기 위해 간단한Dockerfile을 작성한다. 이Dockerfile은ubuntu이미지를 기반으로 하며, 컨테이너가 시작될 때/bin/bash -c "echo hello"명령어를 실행하도록ENTRYPOINT를 설정한다.FROM ubuntu ENTRYPOINT ["/bin/bash", "-c", "echo hello"]위
Dockerfile에서ENTRYPOINT뒤에 오는["/bin/bash", "-c", "echo hello"]는 배열 형태로 명령어를 지정하는 "exec" 형식이다. 이 형식은 셸 프로세스를 거치지 않고 직접 명령어를 실행하므로, 예측 가능한 동작과 더 나은 성능을 제공한다. 여기서/bin/bash -c는echo hello명령어를 셸에서 실행하도록 지시하는 명령어이다.2-2. Docker 이미지 빌드 과정
작성된
Dockerfile을 사용하여 Docker 이미지를 빌드한다.docker build명령어는 현재 디렉토리(.으로 표현)에 있는Dockerfile을 기반으로my-server라는 이름의 이미지를 생성한다.명령어:
docker build -t my-server .C:\Users\dandycode\Documents\GitHub\docker-practice>docker build -t my-server . [+] Building 1.7s (6/6) FINISHED docker:desktop-linux => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 96B 0.0s => [internal] load metadata for docker.io/library/ubuntu:latest 1.7s => [auth] library/ubuntu:pull token for registry-1.docker.io 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 50B 0.0s => CACHED [1/1] FROM docker.io/library/ubuntu:latest@sha256:440dcf6a5640b2ae5c77724e68787a906afb8ddee98bf86db94eea8528c2c076 0.0s => exporting to image 0.0s => => exporting layers 0.0s => => writing image sha256:bb8e778b4c5bcafe0e5b0f023fef6c5b4adb2522ac3ccbeca7e026f42417cd71 0.0s => => naming to docker.io/library/my-server 0.0s이 과정은Dockerfile에 명시된 단계를 따라 이미지를 생성하며, 각 단계의 성공적인 실행을 보여준다. 최종적으로my-server`라는 태그를 가진 이미지가 생성된다.
2-3. Docker 컨테이너 실행 및 ENTRYPOINT 동작 확인
빌드된
my-server이미지를 사용하여 Docker 컨테이너를 실행하고,ENTRYPOINT에 의해 정의된 명령어가 자동으로 실행되는지 확인한다.명령어:
docker run -d my-serverC:\Users\dandycode\Documents\GitHub\docker-practice>docker run -d my-server 4256589b5941ea186aebfe2adef6f27af890fbf5401994abadd93b40e3af3ace-d옵션은 컨테이너를 백그라운드에서 실행하며, 컨테이너 ID를 반환한다.ENTRYPOINT에 의해echo hello명령어가 실행되므로, 컨테이너는 이 명령어를 실행한 후 종료된다. 따라서docker ps만으로는 실행 중인 컨테이너를 확인할 수 없으므로,-a옵션을 사용하여 모든 컨테이너를 확인해야 한다.명령어:
docker ps -aC:\Users\dandycode\Documents\GitHub\docker-practice>docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4256589b5941 my-server "/bin/bash -c 'echo …" 18 seconds ago Exited (0) 18 seconds ago vigilant_jackson // ... (이전 컨테이너들)출력된
STATUS를 보면Exited (0)로 되어 있음을 알 수 있다. 이는echo hello명령어가 성공적으로 실행된 후 컨테이너가 종료되었음을 의미한다.명령어:
docker logs <CONTAINER_ID_PREFIX>(예:docker logs 425)C:\Users\dandycode\Documents\GitHub\docker-practice>docker logs 425 hellodocker logs명령어를 통해 해당 컨테이너의 로그를 확인하면ENTRYPOINT에 정의된echo hello의 결과인 "hello"가 출력된 것을 확인할 수 있다. 이로써ENTRYPOINT명령어가 컨테이너 실행 시 자동으로 동작함을 명확히 알 수 있다.
3. ENTRYPOINT와 CMD의 차이점
Dockerfile에는ENTRYPOINT와 유사하게 컨테이너 실행 시 명령어를 지정하는CMD명령어도 존재한다. 두 명령어는 함께 사용되거나 단독으로 사용될 수 있으며, 동작 방식에 중요한 차이가 있다.ENTRYPOINT: 컨테이너의 주 실행 파일을 정의하며,docker run명령어의 인자를ENTRYPOINT의 인자로 전달한다. 이는 컨테이너를 특정 프로그램처럼 동작하게 할 때 유용하다.CMD:ENTRYPOINT가 지정되지 않았을 경우 기본적으로 실행되는 명령어를 정의하거나,ENTRYPOINT의 기본 인자로 사용된다.docker run명령어에 직접 인자를 전달하면CMD에 정의된 명령어는 무시되는 특성이 있다.
간단히 요약하자면,
ENTRYPOINT는 컨테이너의 "진입점"으로 항상 실행되는 명령어이고,CMD는ENTRYPOINT에 대한 "기본 인자" 또는ENTRYPOINT가 없을 때 "기본 명령어"의 역할을 수행한다.4. 결론
ENTRYPOINT명령어는 Docker 컨테이너의 핵심적인 동작을 정의하고 자동화하는 데 매우 중요한 역할을 수행한다. 이 명령어를 통해 컨테이너가 시작될 때마다 특정 애플리케이션이나 스크립트가 실행되도록 설정할 수 있으며, 이는 컨테이너화된 애플리케이션의 일관성과 사용 편의성을 크게 향상시킨다.728x90반응형'DevOps > Docker' 카테고리의 다른 글
Dockerfile `RUN` 명령어: 컨테이너에 Git 설치해 보기 (0) 2025.07.17 Spring Boot 애플리케이션 Docker 이미지 빌드 및 실행 가이드 (0) 2025.07.15 Dockerfile의 COPY 명령어와 .dockerignore 파일 활용 실습 (1) 2025.07.15 도커(Docker) 기본 명령어 실습: 컨테이너 생성 및 관리 (3) 2025.07.14 Docker 볼륨을 이용한 데이터 영속성 확보 실습(PostgreSQL, MongoDB) (5) 2025.07.11 다음글이 없습니다.이전글이 없습니다.댓글