Dandy Now!
  • Docker 컨테이너의 시작점: ENTRYPOINT 명령어 완벽 이해
    2025년 07월 15일 20시 05분 49초에 업로드 된 글입니다.
    작성자: DandyNow
    728x90
    반응형

    Docker 컨테이너의 시작점: ENTRYPOINT 명령어 완벽 이해

    1. Dockerfile과 컨테이너 실행의 기본 개념

    1-1. Dockerfile의 역할과 핵심 명령어

    Dockerfile은 Docker 이미지를 빌드하기 위한 명령어들을 담고 있는 텍스트 문서이다. 이 파일에 명시된 명령어들은 순차적으로 실행되어 최종 이미지를 생성한다. Dockerfile 내에서 사용되는 다양한 명령어 중 FROMENTRYPOINT는 이미지의 기반과 컨테이너 실행의 핵심을 담당하고 있다.

    • FROM 명령어는 빌드할 이미지의 베이스 이미지를 지정한다. 모든 DockerfileFROM 명령어로 시작하는 것이 일반적이며, 이는 특정 운영체제 또는 이미 설치된 소프트웨어가 포함된 이미지를 기반으로 작업을 시작함을 의미한다. 본 실습에서는 ubuntu 이미지를 기반으로 사용된다.

      FROM ubuntu
    • ENTRYPOINT 명령어는 Docker 컨테이너가 시작될 때 항상 실행되는 명령어를 정의한다. 이는 컨테이너를 특정 애플리케이션이나 서비스로 실행되도록 설정할 때 유용하게 활용된다. ENTRYPOINTdocker run 명령어의 인자를 자신의 인자로 받아들여 함께 실행될 수 있는 특성을 지닌다.

      ENTRYPOINT ["/bin/bash", "-c", "echo hello"]

    1-2. 컨테이너 실행 흐름에서의 ENTRYPOINT의 중요성

    ENTRYPOINT는 컨테이너가 실행될 때 고정적으로 실행되는 명령어를 지정함으로써, 컨테이너의 주요 목적을 명확히 정의하는 역할을 수행한다. 예를 들어, 웹 서버 컨테이너의 경우 웹 서버 시작 명령어를 ENTRYPOINT에 설정하여 컨테이너가 시작됨과 동시에 웹 서버가 구동되도록 할 수 있다. 이는 컨테이너의 일관된 동작을 보장하며, 사용자가 docker run 명령어를 통해 컨테이너를 실행할 때 별도의 명령어를 지정할 필요 없이 미리 정의된 작업을 수행하게 한다.

    2. ENTRYPOINT 실습: "echo hello" 예제를 통한 이해

    2-1. 실습용 Dockerfile 작성

    ENTRYPOINT 명령어의 동작을 이해하기 위해 간단한 Dockerfile을 작성한다. 이 Dockerfileubuntu 이미지를 기반으로 하며, 컨테이너가 시작될 때 /bin/bash -c "echo hello" 명령어를 실행하도록 ENTRYPOINT를 설정한다.

    FROM ubuntu
    
    ENTRYPOINT ["/bin/bash", "-c", "echo hello"]

    Dockerfile에서 ENTRYPOINT 뒤에 오는 ["/bin/bash", "-c", "echo hello"]는 배열 형태로 명령어를 지정하는 "exec" 형식이다. 이 형식은 셸 프로세스를 거치지 않고 직접 명령어를 실행하므로, 예측 가능한 동작과 더 나은 성능을 제공한다. 여기서 /bin/bash -cecho 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-server

      C:\Users\dandycode\Documents\GitHub\docker-practice>docker run -d my-server
      4256589b5941ea186aebfe2adef6f27af890fbf5401994abadd93b40e3af3ace

      -d 옵션은 컨테이너를 백그라운드에서 실행하며, 컨테이너 ID를 반환한다. ENTRYPOINT에 의해 echo hello 명령어가 실행되므로, 컨테이너는 이 명령어를 실행한 후 종료된다. 따라서 docker ps만으로는 실행 중인 컨테이너를 확인할 수 없으므로, -a 옵션을 사용하여 모든 컨테이너를 확인해야 한다.

    • 명령어: docker ps -a

      C:\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
      hello

      docker logs 명령어를 통해 해당 컨테이너의 로그를 확인하면 ENTRYPOINT에 정의된 echo hello의 결과인 "hello"가 출력된 것을 확인할 수 있다. 이로써 ENTRYPOINT 명령어가 컨테이너 실행 시 자동으로 동작함을 명확히 알 수 있다.

    3. ENTRYPOINT와 CMD의 차이점

    Dockerfile에는 ENTRYPOINT와 유사하게 컨테이너 실행 시 명령어를 지정하는 CMD 명령어도 존재한다. 두 명령어는 함께 사용되거나 단독으로 사용될 수 있으며, 동작 방식에 중요한 차이가 있다.

    • ENTRYPOINT: 컨테이너의 주 실행 파일을 정의하며, docker run 명령어의 인자를 ENTRYPOINT의 인자로 전달한다. 이는 컨테이너를 특정 프로그램처럼 동작하게 할 때 유용하다.
    • CMD: ENTRYPOINT가 지정되지 않았을 경우 기본적으로 실행되는 명령어를 정의하거나, ENTRYPOINT의 기본 인자로 사용된다. docker run 명령어에 직접 인자를 전달하면 CMD에 정의된 명령어는 무시되는 특성이 있다.

    간단히 요약하자면, ENTRYPOINT는 컨테이너의 "진입점"으로 항상 실행되는 명령어이고, CMDENTRYPOINT에 대한 "기본 인자" 또는 ENTRYPOINT가 없을 때 "기본 명령어"의 역할을 수행한다.

    4. 결론

    ENTRYPOINT 명령어는 Docker 컨테이너의 핵심적인 동작을 정의하고 자동화하는 데 매우 중요한 역할을 수행한다. 이 명령어를 통해 컨테이너가 시작될 때마다 특정 애플리케이션이나 스크립트가 실행되도록 설정할 수 있으며, 이는 컨테이너화된 애플리케이션의 일관성과 사용 편의성을 크게 향상시킨다.


    728x90
    반응형
    댓글