Docker(도커)로 React와 Nginx를 함께 배포하는 방법에 대해서 알아보겠습니다. React를 배포할 때 Nginx를 세팅하는 것이 귀찮았는데 Docker로 세팅을 해두면 나중에 서버를 변경할 때 편리합니다.
완성된 코드는 GitHub에 있습니다.
이전 글 Nginx로 React를 배포하는 방법에서 nginx 웹서버로 react를 배포하는 방법에 대해서 알아보았습니다.
React를 Dockerizing(도커화)하기
먼저 React 앱이 있어야 합니다. 이전 글과 같이 기본 앱을 만들었습니다.
$ create-react-app myapp
$ cd myapp
그리고 설정파일인 Dockerfile파일을 만들어야 합니다.
프로젝트 폴더에 파일명을 Dockerfile
으로 하고 내용은 아래와 같이 넣어주세요.
FROM node:8.10.0 as builder
# 작업 폴더를 만들고 npm 설치
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@2.1.3 -g --silent
# 소스를 작업폴더로 복사하고 앱 실행
COPY . /usr/src/app
CMD ["npm", "start"]
여기서 node 버전은 8.10.0인데, 저의 PC에서 저 버전을 쓰기 때문에 동일하게 맞춰주었습니다. Dockerfile을 보시면 먼저 앱이 실행될 폴더를 만들고, 그곳에 npm을 설치한 이후 앱을 실행하도록 되어있습니다.
준비는 모두 끝났습니다. 이제 docker 이미지를 만들어야 합니다.
$ docker build -t sample-app .
docker 이미지가 생성되었으면, container를 만들고 실행합니다.(포트는 3000으로 설정)
$ docker run -it -p 3000:3000
잘 동작하나요? 저는 잘 동작됩니다. PC에서 사용하던 개발환경을 Docker에 설정하지 않아 문제가 발생할 수 있습니다. 동작이 잘 안된다면, 다시 한번 확인해주세요.
React와 Nginx를 Dockerizing하기
개발을 마치고 배포를 해야한다면 웹서버와 함께 Dockerizing이 되어야 합니다. 여기서는 웹서버로 Nginx를 사용하여 React와 함께 dockerizing하였습니다.
Dockerfile을 새로 생성해야 합니다.
파일명을 Dockerfile-prod
로 생성해주세요.
FROM node:8.10.0 as builder
# 작업 폴더를 만들고 npm 설치
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@2.1.3 -g --silent
# 소스를 작업폴더로 복사하고 빌드
COPY . /usr/src/app
RUN npm run build
FROM nginx:1.13.9-alpine
# nginx의 기본 설정을 삭제하고 앱에서 설정한 파일을 복사
RUN rm -rf /etc/nginx/conf.d
COPY conf /etc/nginx
# 위에서 생성한 앱의 빌드산출물을 nginx의 샘플 앱이 사용하던 폴더로 이동
COPY --from=builder /usr/src/app/build /usr/share/nginx/html
# 80포트 오픈하고 nginx 실행
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
위와는 조금 다르게, npm을 설치하고 앱을 실행하지 않고 빌드만 합니다. 그 이후의 설정은, nginx설정과 빌드산출물을 nginx 경로의 폴더로 옮기고 nginx를 실행합니다.
nginx를 설정하기 위해, nginx 설정파일을 미리 만들어둬야 합니다.
프로젝트 폴더에 conf/conf.d/default.conf
폴더와 파일을 생성합니다.
default.conf의 내용은 아래와 같습니다.
server {
listen 80;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
주요 설정 내용은, 80포트를 사용하고 root 경로를 react의 빌드 산출물이 있는 폴더로 설정합니다.
이제 설정은 끝났습니다. 도커 이미지를 만들어야 합니다. Dockerfile-prod를 사용하기 때문에 명시적으로 이 파일을 지정해주었습니다.
$ docker build -f Dockerfile-prod -t sample-app-prod .
이미지가 만들어지면 container를 만들고 실행합니다.
$ docker run -it -p 80:80 sample-app-prod
잘 실행되시나요? 문제가 없다면 정상적으로 실행이 되어야 합니다.
정리
React와 Nginx가 실행되도록 도커 이미지를 만들어보았습니다. 도커 이미지를 만드는 과정이 귀찮지만 한번 만들어두면 AWS, Azure, Gcloud와 같은 클라우드에 앱을 세팅하는 과정이 매우 쉬워집니다.
참고
Related Posts
- Python - Yaml 파일 파싱하는 방법
- Python - pip와 requirements.txt로 패키지 관리
- 유튜브 쇼츠(Shorts) 자막 끄기/켜기
- SOLID 원칙, 객체지향 설계 5가지 원칙
- Ubuntu 20.04 - Nginx로 React를 배포하는 방법
- 애드센스 '구글 검색 기능' 블로그에 추가
- 트위터 이메일 안오게, 알림 끄기
- 인스타그램 동영상, 사진 저장 방법
- Git 설치 방법 (Ubuntu, Windows)
- Python pip 설치 (Ubuntu / Windows)
- 마우스 우클릭 복사 방지 해제 방법 (크롬)
- Python 에러 해결, 'conda' 용어가 cmdlet, 함수, 스크립트 ... 인식되지 않습니다.
- Python 에러 해결, AttributeError: module 'jwt' has no attribute 'encode'
- Atom - 코드 자동 정렬
- Sublime Text - 코드 자동 정렬, 단축키 설정
- VSCode에서 탭 간격 설정 (Tab to 4 spaces)
- Visual Studio Code에서 코드 자동 정렬
- 구글 검색 기록 삭제, 자동 저장 끄기 (PC, 모바일)
- 안드로이드 개발자 옵션 활성화, USB 디버깅 켜기
- 유튜브 채널 차단, 해제 방법 (PC, 모바일)
- 유튜브 미리보기 자동재생 끄기 (자동 소리 끄기/켜기)
- PC에서 유튜브 모바일 버전(m.youtube.com)으로 보기
- 모바일에서 유튜브 PC버전으로 보기
- 유튜브 시간 링크 만들기, 댓글에 시간 태그 입력하기
- 유튜브 스크립트 함께 보기, 자막 추출 방법
- 유튜브 알고리즘 초기화, 검색 기록과 시청 기록 삭제
- 유튜브 '싫어요' 숫자 다시 보이게 하기
- 구글 크롬, 방금 닫은 탭 다시 열기
- Maven으로 Java프로젝트 build하는 방법
- node.js, npm 버전 확인 방법 (터미널, cmd 명령어)
- GitLab - 'pre-receive hook declined' 에러 해결
- Javacript Heap Out Of Memory 문제 해결
- SSH key 생성하고 GitHub에 등록
- GMT, UTC의 차이점
- Linux(Ubuntu)에 Adobe Photoshop, Illustrator 설치하는 방법