[React] Docker Nginx React를 사용해서 배포하기

2022. 12. 12. 14:09·React/실험실
반응형

지난번에는 React와 Nginx를 함께 사용해서 배포하는 작업을 진행했다. 

이번에는 React와 Nginx를 Docker를 사용해서 이미지화 시켜서 컨테이너로 클라이언트를 배포할 계획이다. 

 

환경 정보 

Server : Naver Cloud

os : Ubuntu 20

 

필요한 파일 설치 

apt install npm  // npm 설치

sudo apt-get install build-essential libssl-dev
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
source ~/.bashrc  // nvm 설치

nvm install 18.12.1 // 필요한 npm 버전 설치

npm을 설치하고 default는 10버전이기 때문에 필요한 버전이 18(이건 프로젝트에 따라 다름)이라서

nvm으로 버전을 올려줬다. 

 

apt install nginx

배포를 위해서 nginx를 설치했다. 

 

다음으로 Docker를 설치해야한다. 

설치하기 전 HTTPS를 통해서 Repository를 이용하는 것을 허용할 수 있도록 패키지들을 설치한다. 

apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

Docker에서 공식 GPG key가 있는데 이것을 추가해준다. 

GPG key는 리눅스 패키지 관리 툴이 해당 프로그램 패키지가 유효한지 확인하기 위해서 설치 전 GPG key를 사용해서 검증하는 과정이 필요하다고 한다. 

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

다음으로 apt를 사용해 설치하기 위해서 apt 리스트에 도커를 추가하는 작업을 한다. 

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

 

이제 끝이다 설정을 바탕으로 apt를 업데이트하고, 도커를 설치한다. 

apt-get update
apt-get install docker-ce docker-ce-cli containerd.io

 

본격적으로 작업 시작!

React 프로젝트를 DockerFile을 사용해서 이미지화가 가능하다. 이때 파일명에 prod, dev 등 

표시해두면 배포 환경에 따라 관리하기 편하다 .

FROM node:18.12.1 as builder

RUN mkdir /usr/src/app
WORKDIR /usr/src/app
ENV PATH /usr/src/app/node_modules/.bin:$PATH
COPY package.json /usr/src/app/package.json
RUN npm install --silent
RUN npm install react-scripts@3.4.1 -g --silent

COPY . /usr/src/app
RUN npm run build

FROM nginx:latest
COPY conf.d/default.conf /etc/nginx/conf.d/default.conf

COPY --from=builder /usr/src/app/build /usr/share/nginx/html

EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

하나씩 설명하자면, 

FROM node:18.12.1 as builder

사용할 Node의 버전을 지정한다. 

 

RUN mkdir /usr/src/app
WORKDIR /usr/src/app
ENV PATH /usr/src/app/node_modules/.bin:$PATH
COPY package.json /usr/src/app/package.json
RUN npm install --silent
RUN npm install react-scripts@3.4.1 -g --silent

작업할 폴더를 만들고 npm을 설치한다. 

RUN 명령어는 커맨드를 실행하는 명령어라고 생각하면 된다. 

WORKDIR 명령어를 사용하면 cd 명령어처럼 해당 디렉토리로 이동할 수 있다. 

ENV 명령어는 환경 변수를 설정하기 위해서 사용한다. 

 

npm으로 설치할 때 --slient를 사용하는 이유는 스크립트 출력을 억제하기 위해서다. 

 

COPY . /usr/src/app
RUN npm run build

Dockerfile이 있는 폴더의 코드를 작업하기 위한 폴더로 복사하고, 빌드를 실행한다. 

 

FROM nginx:latest
COPY conf.d/default.conf /etc/nginx/conf.d/default.conf

nginx를 사용할 것이기 때문에 nginx의 버전을 지정하고, 기본 설정을 삭제 후 프로젝트에서 사용할 

설정 파일을 복사한다. 

 

하지만 아직 설정 파일은 작업 안했다. 혹시라도 본인은 conf라는 것을 만들지 않았다고 걱정할 필요 없다.

뒤에 다 나온다~

 

COPY --from=builder /usr/src/app/build /usr/share/nginx/html

앞서 빌드한 결과물을 nginx의 샘플 앱이 사용하던 폴더로 이동시킨다. 

 

EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

80번 포트를 오픈하고 nginx를 실행한다. 

 

이로써, node, react-script, nginx의 버전을 설정하고 필요한 작업을 마쳤다. 

다음으로 nginx 설정 파일을 만들어준다. 

// config.d/default.conf

server {
    listen 80;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;
    }
    
    location /api {
        proxy_pass http://localhost:8000;
    }
    
    error_page   500 502 503 504  /50x.html;
    
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

기본적인 설정을 따로 없지만 /api의 경우 서버 요청 시 설정할 Proxy 설정이라 꼽사리 껴봤다

 

이제 설정을 끝났다. Docker 이미지를 생성하면 된다!

docker build -f Dockerfile-prod -t deploy .

-f Dockerfile-prod : 해당 Dockerfile을 기준으로 Docker Image를 생성한다. 

-f deploy : 생성할 이미지를 지정한다. 

 

마지막의 . 은 PATH가 . 임을 나타낸다. 

 

docker run -it -p 80:80 이미지명
or 
docker run -it -p 80:80 -d 이미지명

실행하면 프론트엔드 확인이 가능하다. 

-d 옵션은 백드라운드에서 확인하는 옵션이다. 

 

이후 실행 상태를 확인하고 싶다면 

docker ps

 

실행을 중지하려면 

docker stop 컨테이너명

실행하면 된다. 

반응형
저작자표시 비영리 변경금지 (새창열림)

'React > 실험실' 카테고리의 다른 글

[React] form 태그를 사용해서 value 가져오기 feat. TypeScript  (0) 2022.12.18
[React] React-Query - useQuery  (0) 2022.12.13
[React] Nginx를 사용해서 배포하기  (0) 2022.12.10
[React] React-Query - Dev Tools  (0) 2022.12.01
[React] Library vs Framework  (0) 2022.11.29
'React/실험실' 카테고리의 다른 글
  • [React] form 태그를 사용해서 value 가져오기 feat. TypeScript
  • [React] React-Query - useQuery
  • [React] Nginx를 사용해서 배포하기
  • [React] React-Query - Dev Tools
잉여개발자
잉여개발자
풀스택 개발자를 목표로 잉여롭게 개발 공부도 하면서 다양한 취미 생활도 즐기고 있는 잉여 개발자입니다.
  • 잉여개발자
    잉여로운 개발일지
    잉여개발자
    • 분류 전체보기 (789)
      • 개발정보 (36)
      • 개발환경 (7)
      • 개발생활 (19)
      • React (141)
        • 이론 (23)
        • 기능 (12)
        • 실험실 (88)
        • 버그 (6)
        • 패스트캠퍼스 (9)
        • Npm (3)
      • React Native (28)
        • 공통 (6)
        • TypeScript (3)
        • JavaScript (18)
        • 버그 (1)
      • Next.js (30)
        • 이론 (13)
        • 실험실 (13)
        • 버그 (3)
      • Web (35)
      • 알고리즘 (202)
        • 풀이 힌트 (39)
      • JavaScript (47)
      • TypeScript (29)
        • 기초 (27)
        • 실험실 (2)
      • Node.js (13)
        • 이론 (0)
        • 기능 (3)
        • 실험실 (9)
        • 버그 (1)
      • 도커 (4)
      • CCNA (22)
        • 이론 (4)
        • 문제 (18)
      • 취미생활 (167)
        • 잉여로운 칵테일 (2)
        • 잉여의 식물키우기 (130)
        • 잉여로운 여행기 (11)
        • 잉여의 제2외국어 (21)
        • 잉여로운 책장 (2)
      • Java (1)
        • Java의 정석 (1)
      • 꿀팁 공유 (3)
  • 태그

    redux
    타입스크립트
    알고리즘
    타일러영어
    webpack
    식물
    자바스크립트
    ChatGPT
    ReactNative
    바질
    영어회화
    프로그래머스
    typescript
    영어독학
    리얼학습일기
    Babel
    리액트
    리얼클래스
    react
    javascript
    CSS
    Docker
    CCNA
    네이버 부스트캠프
    덤프
    바질 키우기
    Node.js
    next.js
    네트워크
    다이소
  • hELLO· Designed By정상우.v4.10.1
잉여개발자
[React] Docker Nginx React를 사용해서 배포하기
상단으로

티스토리툴바