navis
React 애플리케이션 Docker 및 AWS 배포 가이드 본문
728x90
React 애플리케이션을 Docker를 통해 컨테이너화하고, AWS EC2에 배포하는 방법을 정리합니다. 이 과정은 CI/CD 환경을 구축하여 GitHub Actions로 자동화 배포까지 구현합니다.
목차
- 프로젝트 준비
1.1 필요한 파일 생성 - Docker 이미지 생성
2.1 Dockerfile 작성 - Nginx 설정
3.1 nginx.conf 작성 - Docker 이미지 빌드 및 푸시
4.1 Docker 이미지 빌드
4.2 Docker Hub에 이미지 푸시 - AWS 서버 설정
5.1 배포 스크립트 작성
5.2 Nginx 설정 파일 작성 - GitHub Actions로 CI/CD 설정
6.1 GitHub Actions Workflow 작성
6.2 GitHub Secrets 설정 - 테스트
- 결과 화면
1. 프로젝트 준비
1.1 필요한 파일 생성
아래 파일들을 프로젝트 루트에 생성합니다.
- Dockerfile
- nginx.conf
- .github/workflows/ci-cd.yml (GitHub Actions 설정)
2. Docker 이미지 생성
2.1 Dockerfile 작성
React 애플리케이션을 배포하기 위해 Docker 이미지를 생성합니다.
# Step 1: Build React app
FROM node:16-slim AS builder
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
RUN npm run build
# Step 2: Nginx to serve the build
FROM nginx:stable-alpine
WORKDIR /usr/share/nginx/html
# Nginx 설정 파일 복사
COPY nginx.conf /etc/nginx/conf.d/default.conf
# Build 결과물 복사
COPY --from=builder /app/build /usr/share/nginx/html
# Nginx를 3000번 포트에서 실행
EXPOSE 3000
CMD ["nginx", "-g", "daemon off;"]
3. Nginx 설정
3.1 nginx.conf 작성
React 애플리케이션의 build 디렉토리를 서빙하기 위한 Nginx 설정입니다.
server {
listen 3000; # 3000번 포트에서 Nginx가 동작하도록 설정
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html;
try_files $uri /index.html;
}
error_page 404 /index.html;
}
4. Docker 이미지 빌드 및 푸시
4.1 Docker 이미지 빌드
docker build -t junuyang/portfolio-react-app:latest .
4.2 Dockerhub에 이미지 푸시
docker push junuyang/portfolio-react-app:latest
5. AWS 서버 설정
5.1 deploy-react.sh 생성
AWS 서버에서 컨테이너를 실행하기 위해 배포 스크립트를 작성합니다.
deploy-react.sh:
#!/bin/bash
# 환경 변수 설정
IMAGE_NAME="junuyang/portfolio-react-app:latest"
CONTAINER_NAME="portfolio-react-app"
NETWORK_NAME="my_network"
APP_PORT=3000
# Docker 네트워크 생성 (이미 존재하면 무시)
echo "Creating Docker network..."
docker network create $NETWORK_NAME || true
# 최신 React Docker 이미지 가져오기
echo "Pulling latest React Docker image..."
docker pull $IMAGE_NAME
# 기존 컨테이너 중지 및 삭제
echo "Stopping and removing existing container if it exists..."
docker rm -f $CONTAINER_NAME || true
# 새로운 React 컨테이너 실행
echo "Running new React container on port $APP_PORT..."
docker run -d -p $APP_PORT:$APP_PORT --name $CONTAINER_NAME $IMAGE_NAME
# Docker 네트워크 연결
echo "Connecting container to network..."
docker network connect $NETWORK_NAME $CONTAINER_NAME
# Nginx 서비스 재시작 (필요한 경우)
echo "Restarting Nginx..."
sudo systemctl restart nginx
echo "React application has been deployed successfully on port $APP_PORT."
5.2 nginx 파일 작성
/etc/nginx/sites-available/default 파일을 수정합니다.
~$ sudo nano /etc/nginx/sites-available/default
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name kyleportfolio.site www.kyleportfolio.site;
# React 개발 서버를 프록시로 연결
location / {
proxy_pass http://localhost:3000; # React 컨테이너가 사용하는 3000번 포트
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 404 에러 발생 시 React 라우팅 처리 (Optional)
error_page 404 /index.html;
}
6. GitHub Actions로 CI/CD 설정
6.1 GitHub Actions Workflow 파일 작성
.github/workflows/ci-cd.yml 파일을 생성하고 다음 내용을 작성합니다:
name: React CI/CD
on:
push:
branches:
- master # master 브랜치에 Push될 때 실행
pull_request:
branches:
- master # master 브랜치로 PR이 생성될 때 실행
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
# 1. 코드 체크아웃
- name: Checkout code
uses: actions/checkout@v3
# 2. Node.js 설정
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: 16
# 3. 의존성 설치
- name: Install dependencies
run: npm install
# 4. React 애플리케이션 빌드
- name: Build React app
run: npm run build
# 5. Docker 이미지 빌드
- name: Build Docker image
run: docker build -t junuyang/portfolio-react-app:latest .
# 6. Docker Hub 로그인
- name: Log in to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
# 7. Docker 이미지 푸시
- name: Push Docker image to Docker Hub
run: docker push junuyang/portfolio-react-app:latest
# 8. SSH로 서버에 배포 스크립트 실행
- name: Deploy to AWS
uses: appleboy/ssh-action@v0.1.8
with:
host: ${{ secrets.AWS_HOST }}
username: ubuntu
key: ${{ secrets.AWS_KEY }}
script: |
./deploy-react.sh
6.2 GitHub Secrets 설정
GitHub Repository > Settings > Secrets에서 아래 항목 추가:
- DOCKER_USERNAME: Docker Hub 사용자명
- DOCKER_PASSWORD: Docker Hub 비밀번호
- AWS_HOST: AWS EC2 Public IP
- AWS_KEY: AWS SSH Private Key
7. 테스트
- 코드를 GitHub main 브랜치에 Push합니다.
- GitHub Actions에서 Workflow가 실행됩니다.
- Docker Hub에 최신 이미지가 푸시되고, AWS EC2에 배포됩니다.
- 브라우저에서 EC2 IP 주소를 입력하여 React 애플리케이션이 정상적으로 작동하는지 확인합니다.
8. 결과 화면
- React 애플리케이션이 배포된 URL: http://<EC2-Public-IP>
- GitHub Actions Workflow 실행 로그에서 CI/CD 성공 여부 확인.
'AWS' 카테고리의 다른 글
GitHub Actions와 Docker를 이용한 AWS EC2 자동 배포 가이드 (1) | 2024.11.08 |
---|---|
AWS EC2에서 Docker 컨테이너 자동 배포 스크립트 작성 및 실행하기 (0) | 2024.10.30 |
AWS S3 버킷 만들기 (0) | 2024.10.30 |
카페 24 외부 SSL 인증서 설치 (ZeroS) (1) | 2024.09.03 |
도메인 (0) | 2024.03.16 |