# Docker란?
Docker의 개념
Docker는 컨테이너 기반 가상화 기술로, 애플리케이션과 그 의존성을 하나의 패키지로 묶어서 어디서든 동일하게 실행할 수 있게 해주는 도구입니다.
1. Docker를 사용하는 이유
# 개발자 A의 환경
Windows 11 + Node.js 18.2.0 + React 18
# 개발자 B의 환경
macOS + Node.js 18.2.0 + React 18
# 서버 환경
Ubuntu 22.04 + Node.js 18.2.0 + React 18
→ Docker로 모든 환경이 동일하게 보장됨
# 기존 방식: "내 컴퓨터에서는 되는데..."
npm install
npm start # 실패할 수 있음
# Docker 방식: 항상 동일한 결과
docker run my-app # 항상 성공
# 기존 방식
1. 서버에 Node.js 설치
2. 의존성 설치
3. 환경 변수 설정
4. 빌드
5. 실행
# Docker 방식
docker run my-app # 한 번에 끝!
2. Dockerfile 사용법
Dockerfile이란?
Docker 이미지를 만드는 설계도입니다.
# 1. 베이스 이미지 선택
FROM node:18-alpine
# 2. 작업 디렉토리 설정
WORKDIR /app
# 3. 파일 복사
COPY package*.json ./
# 4. 의존성 설치
RUN npm install
# 5. 소스 코드 복사
COPY . .
# 6. 빌드
RUN npm run build
# 7. 포트 노출
EXPOSE 3000
# 8. 실행 명령
CMD ["npm", "start"]
# React 앱을 위한 Dockerfile
FROM node:18-alpine as build
WORKDIR /app
# 패키지 파일 복사 및 의존성 설치
COPY frontend/package*.json ./
RUN npm ci --legacy-peer-deps
# 소스 코드 복사 및 빌드
COPY frontend/ ./
RUN npm run build
# nginx를 사용한 프로덕션 서버
FROM nginx:alpine
# 빌드된 파일을 nginx에 복사
COPY --from=build /app/build /usr/share/nginx/html
# nginx 설정 파일 복사
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
※ Dockerfile 명령어 설명
- FROM: 베이스 이미지
- WORKDIR: 작업 디렉토리
- COPY: 파일 복사
- RUN: 명령어 실행
- EXPOSE: 포트 노출
- CMD: 컨테이너 시작 시 실행할 명령
3. Docker Compose 사용법
Docker Compose란?
여러 개의 Docker 컨테이너를 하나의 애플리케이션으로 관리하는 도구입니다.
Docker Compose를 사용하는 이유
1. 멀티 컨테이너 관리
# 프론트엔드 + 백엔드 + 데이터베이스를 한 번에!
services:
frontend: # React 앱
backend: # Spring Boot
database: # MariaDB
2. 네트워킹 자동화
# 컨테이너 간 통신 자동 설정
networks:
app-network:
driver: bridge
3. 환경 변수 관리
environment:
- NODE_ENV=production
- DATABASE_URL=mysql://db:3306/mydb
docker-compose.yml 구조
services:
# 서비스 1: 프론트엔드
frontend:
build:
context: .
dockerfile: Dockerfile
ports:
- "80:80"
depends_on:
- backend
networks:
- app-network
# 서비스 2: 백엔드
backend:
build:
context: .
dockerfile: backend.Dockerfile
ports:
- "8080:8080"
depends_on:
- db
networks:
- app-network
# 서비스 3: 데이터베이스
db:
image: mariadb:10.11
environment:
MYSQL_ROOT_PASSWORD: rootpassword
volumes:
- db_data:/var/lib/mysql
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
db_data:
Docker Compose 명령어
# 서비스 시작
docker compose up
# 백그라운드 실행
docker compose up -d
# 빌드와 함께 시작
docker compose up --build
# 서비스 중지
docker compose down
# 로그 확인
docker compose logs -f
# 특정 서비스만 재시작
docker compose restart frontend
4. EC2 Ubuntu에서 Docker 배포하기
1. EC2 인스턴스 준비
# Ubuntu 22.04 LTS 인스턴스 생성
# t3.medium 이상 권장 (2GB RAM 이상)
2. Docker 설치
# SSH로 EC2 접속
ssh -i your-key.pem ubuntu@your-ec2-ip
# 시스템 업데이트
sudo apt update && sudo apt upgrade -y
# Docker 설치
sudo apt install -y docker.io docker-compose
# Docker 서비스 시작
sudo systemctl start docker
sudo systemctl enable docker
# 사용자를 docker 그룹에 추가
sudo usermod -aG docker ubuntu
# 재로그인 또는 다음 명령 실행
newgrp docker
3. 프로젝트 파일 업로드
# 방법 1: Git 사용
git clone <https://github.com/your-repo/sakai_project.git>
cd sakai_project
# 방법 2: SCP 사용
scp -i your-key.pem -r ./sakai_project ubuntu@your-ec2-ip:~/
# 방법 3: rsync 사용
rsync -avz -e "ssh -i your-key.pem" ./sakai_project/ ubuntu@your-ec2-ip:~/sakai_project/
4. 백엔드 파일 준비
# 백엔드 파일도 함께 업로드
scp -i your-key.pem -r ../sakai_backend ubuntu@your-ec2-ip:~/
5. Docker Compose 실행
# EC2에서 실행
cd sakai_project
# Docker Compose로 서비스 시작
docker compose up -d --build
# 상태 확인
docker compose ps
# 로그 확인
docker compose logs -f
6. 보안 그룹 설정
# AWS 콘솔에서 보안 그룹 설정
# 인바운드 규칙 추가:
# - HTTP (80) - 0.0.0.0/0
# - HTTPS (443) - 0.0.0.0/0 (선택사항)
# - SSH (22) - Your IP
7. 도메인 설정 (선택사항)
# Nginx 설정으로 도메인 연결
# /etc/nginx/sites-available/default 수정
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass <http://localhost:80>;
}
}
5. 완전한 배포 스크립트
#!/bin/bash
# EC2 배포 스크립트
echo "🚀 Sakai 프로젝트 배포 시작..."
# 1. 시스템 업데이트
sudo apt update && sudo apt upgrade -y
# 2. Docker 설치 (이미 설치되어 있다면 스킵)
if ! command -v docker &> /dev/null; then
sudo apt install -y docker.io docker-compose
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker ubuntu
fi
# 3. 프로젝트 디렉토리로 이동
cd ~/sakai_project
# 4. 기존 컨테이너 정리
docker compose down
docker system prune -f
# 5. 새로 빌드 및 실행
docker compose up -d --build
# 6. 상태 확인
echo "✅ 배포 완료!"
echo "📊 서비스 상태:"
docker compose ps
echo "🌐 접속 URL:"
echo "Frontend: <http://$>(curl -s ifconfig.me):80"
echo "Backend API: <http://$>(curl -s ifconfig.me):8080"
# 스크립트 실행 권한 부여
chmod +x deploy.sh
# 배포 실행
./deploy.sh
6. 배포 체크리스트
배포 전 확인사항
- [ ] [ ] EC2 인스턴스 생성 완료
- [ ] 보안 그룹 설정 (80, 8080 포트 열기)
- [ ] 프로젝트 파일 업로드 완료
- [ ] 백엔드 파일 업로드 완료
- [ ] [ ] Docker 설치 완료
배포 후 확인사항