AWS EC2 + Docker + Github Actions + React + CI/CD
궁금한 점이나 오류는 댓글로 달아주시면, 답변 혹은 수정하겠습니다! “:)”
EC2 + Docker + Nginx + GitHub Actions CI/CD 매뉴얼
1. EC2 설정
1.1 EC2 인스턴스 생성
- AWS Management Console에 로그인합니다.
- EC2 > 인스턴스 시작을 선택합니다.
- 아래 설정으로 인스턴스를 생성합니다:
- AMI: Amazon Linux 2 또는 Ubuntu 20.04 LTS
- 인스턴스 유형: t2.micro (Free Tier)
- 보안 그룹:
- HTTP (80), HTTPS (443), SSH (22) 인바운드 규칙 추가.
1.2 EC2에 연결
로컬 머신에서 EC2에 SSH로 연결합니다:
ssh -i <your-key.pem> ubuntu@<your-ec2-public-ip>
2. Docker 및 필수 도구 설치
2.1 시스템 업데이트
sudo apt update -y && sudo apt upgrade -y
2.2 Docker 설치
sudo apt install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker $USER
logout # 이후 다시 로그인
2.3 Git 및 Node.js 설치
sudo apt install -y git
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
3. React 프로젝트 생성 및 테스트
3.1 React 앱 생성
npx create-react-app my-react-app
cd my-react-app
3.2 앱 실행 및 테스트
npm start
브라우저에서 http://
4. Docker로 React 앱 설정
4.1 Dockerfile 생성
React 앱 디렉토리 my-react-app에서 Dockerfile을 작성합니다:
nano Dockerfile
다음 내용을 추가합니다:
# Stage 1: Build the React app
FROM node:20 AS build
WORKDIR /app
COPY package.json ./
RUN npm install
COPY . ./
RUN npm run build
# Stage 2: Serve the app with Nginx
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
4.2 Docker 이미지 빌드 및 테스트
docker build -t my-react-app:latest .
docker run --name react-app -d -p 3000:80 my-react-app:latest
브라우저에서 http://
5. Docker Hub 설정
5.1 Docker Hub 로그인
docker login
5.2 이미지 태그 및 푸시
docker tag my-react-app:latest devsungyeon1103/my-react-app:latest
docker push devsungyeon1103/my-react-app:latest
Docker Hub에서 my-react-app 이미지를 확인합니다.
6. Nginx와 Docker Compose 설정
6.1 프로젝트 디렉토리 생성
mkdir -p ~/my-project/nginx-config
cd ~/my-project
6.2 docker-compose.yml 생성
nano docker-compose.yml
다음 내용을 추가합니다:
version: '3.3'
services:
nginx:
image: nginx:latest
container_name: nginx-container
ports:
- "80:80"
volumes:
- ./nginx-config/nginx.conf:/etc/nginx/conf.d/default.conf:ro
networks:
- react-network
react-app-3001:
image: devsungyeon1103/my-react-app:latest
container_name: react-app-3001
ports:
- "3001:80"
networks:
- react-network
react-app-3002:
image: devsungyeon1103/my-react-app:latest
container_name: react-app-3002
ports:
- "3002:80"
networks:
- react-network
networks:
react-network:
driver: bridge
6.3 Nginx 설정 파일 추가
nano nginx-config/nginx.conf
다음 내용을 추가합니다:
upstream react_servers {
server react-app-3001:80;
server react-app-3002:80;
}
server {
listen 80;
location / {
proxy_pass http://react_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
7. Docker Compose 실행 및 테스트
7.1 Docker Compose 실행
docker-compose up -d
7.2 확인
브라우저에서 http://
8. GitHub Actions 설정
8.1 GitHub Actions Workflow 파일 작성
리포지토리의 .github/workflows/main.yml 파일을 생성합니다:
name: CI/CD for React App
on:
push:
branches:
- main
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: 20
- name: Install dependencies
run: npm install
- name: Build React app
run: npm run build
- name: Login to Docker Hub
run: echo "$" | docker login -u "$" --password-stdin
- name: Build and Push Docker Image
uses: docker/build-push-action@v4
with:
context: .
file: ./Dockerfile
push: true
tags: devsungyeon1103/my-react-app:latest
- name: Deploy to EC2
uses: appleboy/ssh-action@v0.1.8
with:
host: $
username: ubuntu
key: $
port: 22
script: |
cd ~/my-project
git pull origin main
docker-compose down
docker-compose pull
docker-compose up -d
9. GitHub Secrets 설정
GitHub에서 다음 Secrets를 추가합니다:
DOCKER_USERNAME: devsungyeon1103 DOCKER_PASSWORD: Docker Hub 비밀번호 또는 토큰. EC2_HOST: EC2 퍼블릭 IP. EC2_PRIVATE_KEY: .pem 파일 내용.
10. 전체 테스트
10.1 코드를 GitHub에 푸시
git add .
git commit -m "Set up CI/CD pipeline"
git push origin main
10.2 GitHub Actions 실행 확인
GitHub의 Actions 탭에서 실행 상태를 확인합니다.
10.3 EC2에서 최신 React 앱 확인
docker ps
추가 질문이나 도움이 필요하면 언제든 문의해주세요! 😊
댓글남기기