Dockerfile과 이미지 빌드

이미지를 직접 만들려면 Dockerfile 이라는 설정 파일이 필요합니다. 어떤 베이스 위에, 무엇을 복사하고, 어떻게 실행할지를 순서대로 적어두는 파일이에요.

Dockerfile 주요 지시어

지시어설명
FROM베이스 이미지 지정
WORKDIR작업 디렉토리 설정
COPY호스트 파일·디렉토리를 컨테이너로 복사
RUN이미지 빌드 중 명령 실행
EXPOSE컨테이너가 수신할 포트 명시
CMD컨테이너 시작 시 실행할 기본 명령 (덮어쓰기 쉬움)
ENTRYPOINT항상 실행돼야 하는 필수 명령

CMDENTRYPOINT 가 자주 헷갈리는데, 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은 결국 “재현 가능한 실행 환경”을 코드로 남기는 일입니다. 레이어 캐시를 의식해서 자주 안 바뀌는 것(종속성)을 위쪽에, 자주 바뀌는 것(소스)을 아래쪽에 두면 빌드 속도까지 챙길 수 있어요.