
이미지를 제대로 다루려면 실행 명령(CMD/ENTRYPOINT), 포트 정의(EXPOSE), 태깅 규칙, Hub 업로드까지 전체 흐름을 이해해야 한다. 이 글은 세 언어(Node·Python·PHP)를 최소 예제로 사용해 실무에서 바로 재활용 가능한 형태로 정리한다.
도커 이미지 빌드에서 가장 자주 혼동되는 지점은 EXPOSE, ENTRYPOINT, CMD의 역할이다.
3줄 요약하면 다음과 같다.
ENTRYPOINT는 “고정 명령”, CMD는 “재정의 가능 명령”으로 이해하면 된다.
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
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 도구, 스크립트 실행형 프로젝트에서 유용하다.
FROM php:8.2-apache
WORKDIR /var/www/html
COPY . .
EXPOSE 80
ENTRYPOINT ["apache2-foreground"]
포인트:
실행:
docker build -t demo-php .
docker run -p 8080:80 demo-php
태깅은 배포 안정성과 버전 관리를 위해 필수적이다.
형식:
<repository>:<tag>
예시:
docker build -t my-app:1.0.0 .
docker build -t my-app:latest .
실무 기준 태깅 전략:
latest, dev, 브랜치명이미지 목록 확인:
docker images
삭제:
docker rmi <image>
먼저 로그인:
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 등 어떤 배포 방식에서도 공통적으로 사용된다.