이미지를 직접 만들려면 Dockerfile 이라는 설정 파일이 필요합니다. 어떤 베이스 위에, 무엇을 복사하고, 어떻게 실행할지를 순서대로 적어두는 파일이에요.
Dockerfile 주요 지시어
| 지시어 | 설명 |
|---|---|
FROM | 베이스 이미지 지정 |
WORKDIR | 작업 디렉토리 설정 |
COPY | 호스트 파일·디렉토리를 컨테이너로 복사 |
RUN | 이미지 빌드 중 명령 실행 |
EXPOSE | 컨테이너가 수신할 포트 명시 |
CMD | 컨테이너 시작 시 실행할 기본 명령 (덮어쓰기 쉬움) |
ENTRYPOINT | 항상 실행돼야 하는 필수 명령 |
CMD 와 ENTRYPOINT 가 자주 헷갈리는데, CMD 는 실행 시 인자로 쉽게 덮어쓸 수 있는 “기본값”이고, ENTRYPOINT 는 컨테이너의 고정된 실행 지점이라고 생각하면 됩니다.
예시: Node.js 앱
FROM node:20
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD ["node", "app.js"]
package*.json 을 먼저 복사해 npm install 을 하고, 그다음 소스 전체를 복사하는 순서가 포인트입니다. 소스만 바뀌었을 때 종속성 설치 레이어는 캐시에서 재사용되어 빌드가 빨라져요.
빌드하기
docker build -t [이미지명]:[태그] .
마지막의 . 은 “현재 경로의 Dockerfile로 빌드하라”는 뜻입니다.
원격 저장소에 올릴 이미지는 이름 앞에 저장소 주소를 붙여 빌드합니다.
docker build -t [저장소IP]:[포트]/[이미지명]:[태그] .
예를 들어 AWS ECR에 올릴 이미지라면 이런 형태가 됩니다.
docker build -t 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/myapp/back:1-a938b16 .
푸시하기
docker push [이미지명]
빌드할 때 이미지 이름을 잘못 지었다면 태그를 다시 붙일 수 있습니다.
docker tag localhost:5000/test:1 registry.example.com/test:1
정리
Dockerfile은 결국 “재현 가능한 실행 환경”을 코드로 남기는 일입니다. 레이어 캐시를 의식해서 자주 안 바뀌는 것(종속성)을 위쪽에, 자주 바뀌는 것(소스)을 아래쪽에 두면 빌드 속도까지 챙길 수 있어요.