Docker 이미지 빌드 실전: Node·Python·PHP로 배우는 CMD·ENTRYPOINT·태깅

okorion·2025년 12월 6일

🐬 Docker

목록 보기
3/10
post-thumbnail

이미지를 제대로 다루려면 실행 명령(CMD/ENTRYPOINT), 포트 정의(EXPOSE), 태깅 규칙, Hub 업로드까지 전체 흐름을 이해해야 한다. 이 글은 세 언어(Node·Python·PHP)를 최소 예제로 사용해 실무에서 바로 재활용 가능한 형태로 정리한다.


1. Dockerfile 실행 명령 구조 핵심

도커 이미지 빌드에서 가장 자주 혼동되는 지점은 EXPOSE, ENTRYPOINT, CMD의 역할이다.
3줄 요약하면 다음과 같다.

  • EXPOSE: 컨테이너 내부에서 사용하는 포트 정보 메타데이터
  • ENTRYPOINT: 컨테이너가 실행될 때 항상 실행되는 기본 명령
  • CMD: ENTRYPOINT에 전달되는 기본 인자 또는 실행 명령(ENTRYPOINT 없을 때 단독 실행)

ENTRYPOINT는 “고정 명령”, CMD는 “재정의 가능 명령”으로 이해하면 된다.


2. Node.js 예제 — 가장 흔한 웹 서비스 컨테이너

FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]

핵심 해석:

  • EXPOSE 3000: 문서용 선언이다. 실제 포트 개방은 docker run -p 3000:3000이 결정
  • CMD ["node", "server.js"]: 실행 명령. 로컬 실행 파라미터로 쉽게 재정의 가능

실행:

docker build -t demo-node .
docker run -p 3000:3000 demo-node

3. Python 예제 — ENTRYPOINT와 CMD 분리 예시

FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 5000
ENTRYPOINT ["python"]
CMD ["app.py"]

해석:

  • 항상 python 인터프리터로 실행됨

  • CMD는 기본 인자(app.py)이며 실행 시 변경 가능

    • 예: docker run image-name other_script.py

이 구조는 CLI 도구, 스크립트 실행형 프로젝트에서 유용하다.


4. PHP 예제 — ENTRYPOINT를 웹 서버 패턴으로 사용

FROM php:8.2-apache
WORKDIR /var/www/html
COPY . .
EXPOSE 80
ENTRYPOINT ["apache2-foreground"]

포인트:

  • Apache 기반 공식 이미지에는 이미 ENTRYPOINT가 정의되어 있어 명령 재정의는 거의 없음
  • PHP 코드를 넣기만 해도 즉시 동작하는 구조

실행:

docker build -t demo-php .
docker run -p 8080:80 demo-php

5. 이미지 태깅(Tag) 규칙과 관리

태깅은 배포 안정성과 버전 관리를 위해 필수적이다.

형식:

<repository>:<tag>

예시:

docker build -t my-app:1.0.0 .
docker build -t my-app:latest .

실무 기준 태깅 전략:

  • 개발용: latest, dev, 브랜치명
  • 배포용: 명확한 버전(예: 1.0.3), Git SHA 일부 활용
  • 실수 방지: latest에만 의존하지 않기

이미지 목록 확인:

docker images

삭제:

docker rmi <image>

6. Docker Hub 업로드(push/pull)

먼저 로그인:

docker login

태그를 Hub 레포지토리 기준으로 재지정:

docker tag my-app:1.0.0 myid/my-app:1.0.0

업로드:

docker push myid/my-app:1.0.0

서버 또는 다른 PC에서 다운로드:

docker pull myid/my-app:1.0.0

이 흐름은 ECS·Kubernetes 등 어떤 배포 방식에서도 공통적으로 사용된다.


요약 체크리스트

  • EXPOSE는 메타데이터 역할이며 실제 포트 매핑은 run 옵션에서 처리
  • ENTRYPOINT는 고정 실행 명령, CMD는 기본 인자 또는 실행 명령
  • Node·Python·PHP는 패턴이 다르지만 구조 이해는 동일
  • 태그는 버전 관리의 핵심이며 latest 단독 사용은 위험
  • Hub push/pull은 이미지 배포의 기본 단계
profile
Tech Blog

0개의 댓글