728x90
기본적인 React Application 을 실행시키기 위해서는 다음과 같은 프로세스를 실행한다.
nodejs설치 -> npm install -> npm run build -> server 실행
이러한 일련의 과정을 Docker 는 이미지로 생성해 순서대로 처리할 수 있다.
그리고 이런 이미지 설정파일을 Dockerfile에서 정의한다.
Dockerfile의 생김새는 다음과 같다.
# parent image
FROM node:17-alpine as build-stage
# Run Command (ex. COPY, npm install, ...)이 작업되는 directory 선언
WORKDIR /app
# all source code copy , COPY <src> <dest>
COPY . .
# dependencies
RUN npm install
# container가 어떤 포트를 사용할지 선언한다. app.js에서 4000포트 사용중이므로 4000포트를 expose 한다.
EXPOSE 4000
# 다음 명령어가 안되는 이유: image는 container의 blueprint이지 application을 실행하는 곳이 아니다. container는 image의 running instance이다.
#RUN node app.js
# container가 RUN을 시작한 후 서버가 작동하게 하기 위해서 다음과 같이 CMD 명령어를 쓴다.
CMD ["node", "app.js"]
# 빌드하는 명령어 myapp: image 이름, . : dockerfile build하는 장소로부터의 상대 경로
#docker build -t myapp .
parent image 설정 -> work directory 설정 -> work directory에 source code 복사 -> package dependency 설치 -> 포트 설정 -> 서버 실행
의 순서대로 설정된다.
여기서 주의해야할 것이 2가지가 있다.
- WORKDIR
- 작업이 이뤄지는 경로로서 WORKDIR이 선언된 이후 모든 작업은 선언된 directory에서만 이뤄진다.
- EXPOSE
- 호스트와 연결할 포트 번호 설정.
-
위의 경우 node는 mysql에 3306포트로 접근할 수 있다.db: image: mysql:latest expose: - "3306" node: image: node:latest
- RUN vs CMD
- 두 명령어 모두 Command를 실행시켜주는 명령어이다.
하지만 RUN은 image를 구성하는데 사용하는 명령어로 image는 container의 blueprint이지 application을 실행하는 역할이 아니다. 왜냐하면 container는 image의 running instance이기 때문이다.
CMD는 모든 image구성이 끝난 후 실행할 Command를 실행시켜주기 위해 사용한다.
- 두 명령어 모두 Command를 실행시켜주는 명령어이다.