우선 우리는 Dockerfile을 알기 전에 Docker에 대해서 간단하게 알아야 됩니다. 물론 이 블로그 앞에서 Docker 내용을 다룬적이 있습니다. 그래도 새로운 내용을 다루는 것 처럼, 다시 설명을 해보겠습니다.
Docker란?
도커는 우선 컨테이너 기반의 오픈소스 가상화 플랫폼이라고 부릅니다. 여기에서 컨테이너라고 이야기하는 부분은 우리가 물건을 다른나라로 보낼 때나 화물 운송할 때 컨테이너를 사용하곤 하는데요? 그 Container이라는 의미와 같습니다.
컨테이너마다 내용물이 다른거처럼 Docker 컨테이너 안에 내용도 격리된 공간에서 프로세스가 동작하는 기술입니다. 가상머신처럼 비슷한 느낌을 받을 수 있지만, 실제 내부에는 다른 방식으로 되어있습니다. 주로 Linux kernel의 컨테이너로 돌아가게 되어있습니다. 이러한 Docker 기술을 반가상화라고도 불립니다.
우리는 이러한 Docker를 실행하기 위해서는 간단한 docker 명령어들이 있지만, 이걸 OS를 설치하는 ISO 이미지 처럼 파일을 만들어낼 수 있는 파일이 있습니다. 그것은 바로 Dockerfile이라고 부릅니다.
Dockerfile란?
앞에서 이야기를 했듯이 Dockerfile는 docker에서 이미지를 생성하기 위한 용도의 파일이며, 이미지 정보를 담아두고있는 파일입니다. 우선 아래는 Dockerfile인데, 여기에서 중요한 명령어를 한번 체크해보고자 합니다.
# 예제파일
FROM node:21 AS builder
# Docker를 build할때 개발 모드 구분용 환경 변수를 명시함
ARG ENV_MODE
# 명령어를 실행할 디렉터리 지정
WORKDIR /usr/src/app
# node_modules 등의 dependancy를 복사함.
COPY ./node_modules ./node_modules
COPY . .
# 구축 환경에 따라 env 변수를 다르게 가져가야 하는 경우 환경 변수를 이용해서 env를 구분해준다.
COPY .env ./.env
RUN npm install
# pm2 설치
RUN npm install -g pm2
# prisma 세팅
RUN npx prisma generate
RUN npm run build
EXPOSE 3000
CMD ["pm2-runtime", "start", "ecosystem.config.js"]
- FROM 명령어는 우선 base 이미지를 무엇으로 할건지 처리를 하는 명령어입니다.
- WORKDIR : 이 명령어는 명령어를 실행할 디렉터리 지정을 하는것입니다.
- COPY: 이것은 `COPY <docker 반가상화에 복사될 위치> <복사할 파일 경로>` 이러한 원리로 사용하게 됩니다.
- RUN : 도커 이미지 빌드시 실행이 되는 부분입니다. 커널 명령어를 입력할 수 있습니다.
- EXPOSE : 이것을 이용하여 외부포트를 3000으로 맞춰줄수있습니다.
- CMD: 컨테이너가 시작될 때 실행되는 기본 명령을 정의합니다.
- 위에서는 사용하지는 않았지만, docker 실행할때 --build-arg 옵션을 넣어서 ARG ENV_MODE를 변수지정하여 사용할수있는 것입니다.
//해당 경로 위치에서 dockerfile을 참고하여 build합니다.
docker build --tag [도커이미지 네이밍 지정] .
// 빌드한 이미지로 도커 컨테이너 실행할 때
docker run --build-arg ENV_MODE=QA -d --rm -p [외부포트]:[연결할내부포트] [도커이미지] --name [도커 컨테이너 이름]
위에 명령어를 참고로 사용하면 됩니다. 위에서 여러가 옵션중에서 추가적으로 말씀드릴건 다음 아래와 같습니다.
- -p, -P : 이거는 대문자와 소문자의 차이에서 기능이 달라지는데 둘다 포트를 연결해주는데, 대문자는 자동으로 포트를 연결해준다면 소문자는 직접 포트를 연결을 해줘야합니다.
- --env : 이 옵션은 컨테이너가 실행이 되었을때 사용하는 환경변수 지정을 의미합니다.
- --build-arg : 이 옵션은 도커 빌드하기전에 미리 환경변수를 지정하는 것을 의미합니다.
- -tag : 도커 이미지 네이밍을 할때 처리합니다.
이처럼 dockerfile을 이용하여 조금더 쉽게 배포할 수 있는 환경을 만들어 보았고, 이것을 이용하여 다음 서버에 제공을 하기 위해서는 쉽게 개발을 할 수 있게 되어습니다. 원래는 dockerfile만 이용하게 된다면 거기에 추가 옵션을 docker 명령어를 이용하여 사용해야 된다는 불편함이 있어, docker-compose가 있는데 이것은 다음시간에 알아보도록 하겠습니다.