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가지가 있다.

  1. WORKDIR
    • 작업이 이뤄지는 경로로서 WORKDIR이 선언된 이후 모든 작업은 선언된 directory에서만 이뤄진다.
  2. EXPOSE
    • 호스트와 연결할 포트 번호 설정.
    • db: 
        image: mysql:latest 
        expose: 
          - "3306" 
      
      node: 
        image: node:latest
      위의 경우 node는 mysql에 3306포트로 접근할 수 있다.
  3. RUN vs CMD
    • 두 명령어 모두 Command를 실행시켜주는 명령어이다.
      하지만 RUN은 image를 구성하는데 사용하는 명령어로 image는 container의 blueprint이지 application을 실행하는 역할이 아니다. 왜냐하면 container는 image의 running instance이기 때문이다.
      CMD는 모든 image구성이 끝난 후 실행할 Command를 실행시켜주기 위해 사용한다.

+ Recent posts