[DevOps] 01. 도커와 AWS EC2를 활용한 리액트 앱 배포하기

hands-on lab : Working with Docker Containers

Goal

리액트 앱을 빌드하고 nginx와 함께 도커 이미지로 만든 뒤 aws ec2에 배포해보자.

Overview

  • 리액트 앱 빌드
  • Nginx 기반의 웹 컨테이너 구동
  • Nginx configure 커스텀
  • 빌드된 리액트 리소스 파일 복사
  • Nginx 서버 재시작
  • 리액트 앱 실행
  • 웹 컨테이너 이미지 배포
  • AWS EC2로 서비스하기

Getting Started

step1. 리액트 앱 빌드

npm run build

step2. Nginx 기반의 웹 컨테이너 구동

docker run --name web -p 80:80 -dt nginx

브라우저에서 localhost로 접속하여 웰컴 페이지 확인

step3. Nginx configure 커스텀

nginx는 default.conf 에 작성되어있는 root 디렉터리를 파싱해서 웹을 띄워준다. 우리는 default.conf 파일의 root 디렉터리를 /var/www/html/ 으로 커스텀 해서 작성해주고 설정한 root 디렉터리에 빌드된 리액트 리소스 파일들을 모조리 넣어줄 것이다. 그러면 nginx가 /var/www/html/index.html 파일을 실행시켜 줄 것이다. 우선, 설정 파일을 넣어주면 기존의 default.conf 파일이 덮어씌워지기 때문에 백업을 먼저 진행한다.

기존 default.conf 백업

docker exec web mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.origin

check.

docker exec web ls /etc/nginx/conf.d/

커스텀 default.conf 생성

vi ./default.conf

server {
   listen       80   default_server;
   listen  [::]:80   default_server;
   
   root /var/www/html/;
}

/var/www/html/ 내부에 있는 리소스 파일들을 파싱하겠다.

웹 컨테이너에 default.conf 넣어주기

docker cp ./default.conf web:/etc/nginx/conf.d/

check.

docker exec web ls /etc/nginx/conf.d/

step4. 빌드된 리액트 리소스 파일 복사

이제 /var/www/html/ 디렉터리를 생성하고 빌드된 리액트 리소스 파일들을 모조리 넣어주자.

/var/www/html/ 디렉터리 생성

docker exec web mkdir /var/wwww/html/

빌드된 리소스 파일 복사

docker cp {build디렉터리경로}/ web:/var/www/html/

check.

docker exec ls /var/www/html/

warning.

: index.html을 포함한 모든 파일들은 html 디렉터리 하위에 존재해야 한다.

/var/www/html/build/ 와 같이 디렉터리를 옮겨버렸을 경우

  • docker exec web sh -c 'mv /var/www/html/build/* /var/www/html/'

왜 sh -c 를 사용하는가?

  • *,&,| 과 같은 문자들을 리터럴로 즉, 데이터 그 자체로 해석하기 때문에 쉘을 이용하여 도커 내부로 명령을 전달해줘야 한다.
  • 참고 : [도커 docs] [스택 오버플로우]

step6. Nginx 재시작

docker exec web nginx -s reload

step7. 리액트 앱 실행

웹 컨테이너에서 실행

컨테이너에는 브라우저가 없기 때문에 curl 명령어로 컨테이너의 IPAddress 로 요청을 보내보고 index.html 코드가 응답되는지 확인해보자.

컨테이너 private IPAddress 확인

docker inspect web | grep IPAddress

curl 요청 보내기

curl IPAddress

curl localhost 과 같다.

컨테이너 ip로 요청을 보낸다는 것은 컨테이너 입장에서 localhost 로 요청을 보내는 것과 같기 때문이다.

로컬 브라우저에서 실행

http://localhost:80

step8. 웹 컨테이너 이미지 배포

컨테이너 이미지로 만들기

docker commit web {prefix}/web-image:v1

prefix: docker hub id 입력

도커 허브에 배포하기

docker push {prefix}/web-image:v1

step9. AWS EC2로 서비스하기

이제 배포한 웹 컨테이너 이미지로 EC2에서 구동하면 제공받은 EC2의 퍼블릭 ip로 접속할 수 있고, 우리가 만든 리액트 앱을 어디에서나 띄울 수 있게 된다.

EC2에서 nginx서버 띄우기

  1. 도커 허브에 배포해둔 이미지 받아서 구동하는 방법(기본적인 방법)
  2. 우분투에 직접 nginx 설치하는 방법(로드밸런서가 도커 이미지를 지원하지 않을 때)