Dockerfile 이란 Docker 이미지를 만들게 해주는 파일이다.
Node.js의 Express.js 프로젝트를 Docker 이미지로 만들기 위해 다음과 같이 Dockerfile을 작성하였다.
FROM node:latest
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD [ "node", "app.js" ]
컨테이너에서 사용할 초기 이미지를 지정한다. 이 베이스 이미지를 기반으로 컨테이너에 추가적인 세팅을 할 수 있다.
FROM [이미지명]:[태크명]
FROM node:alpine
FROM ubuntu
태그명을 적지 않으면 latest 버전을 사용한다.
컨테이너의 작업 디레토리로 전환하기 위해 사용한다.
WORK [작업 디렉토리의 절대 경로]
WORKDIR /usr/src/app
WORKDIR 실행 이후에 실행되는 명령문들은 지정한 디렉토리를 기준으로 실행된다.
COPY [복사할 파일 경로] [컨테이너에서 파일이 위치할 경로]
COPY package*.json ./
Dockerfile이 위치한 디렉토리를 기준으로 복사할 파일을 지정하여 컨테이너 내부의 해당 경로에 파일을 복사한다.
이미지 생성 과정에서 실행하는 명령어이다.
의존성, 패키지 설치와 같은 명령어를 RUN을 이용해 실행한다.
RUN [명령문]
RUN npm install
CMD는 컨테이너가 시작할 때마다 실행할 명령어를 설정한다.
Dockerfile에서 한 번만 사용할 수 있다. (여러 개를 사용한다면 마지막 명령만 적용)
CMD ["<파라미터1>", "<파라미터2>"]
CMD <전체 커맨드>
CMD [ "node", "app.js" ]
CMD node app.js
컨테이너 내부에서 사용 중인 포트를 문서화하는 역할이다.
컨테이너에서 사용할 포트를 지정하는 것은 아니다. 포트를 열어두려면 docker run -p 옵션을 사용해야 한다.
EXPOSE [포트 번호]
EXPOSE 3000
이제 아까 보았던 예제가 어떻게 구성되어 있는지 확인해보자.
FROM node:latest # node.js latest 버전을 베이스 이미지로 생성한다
WORKDIR /usr/src/app # 컨테이너의 작업 디렉토리를 /usr/src/app 설정하고
COPY package*.json ./ # package*.json 을 작업 디렉토리의 현재 경로로 복사하여
RUN npm install # npm install 명령어로 패키지를 설치한다
COPY . . # Dockerfile이 위치한 경로의 파일들을 작업 디렉토리의 현재 경로에 복사한다
EXPOSE 3000 # 컨테이너 내부에서 3000번 포트를 활용할 것을 문서화
CMD [ "node", "app.js" ] # 컨테이너 시작 시 node app.js 명령어를 실행한다.
작성된 Dockerfile 은 다음과 같이 빌드하고 실행할 수 있다.
$ docker build -t hello-server ./ # 현재 경로의 Dockerfile을 빌드
$ docker image ls # 이미지 생성 확인
$ docker run -d -p 3000:3000 hello-server # 생성한 이미지를 컨테이너로 실행
$ docker ps # 컨테이너 실행 확인