Docker, Kubernetes, Helm 및 AWS를 사용한 2계층 애플리케이션의 엔드투엔드 배포
Source: Dev.to
위에 제공된 링크에 포함된 전체 텍스트를 제공해 주시면, 해당 내용을 한국어로 번역해 드리겠습니다.
(코드 블록, URL 및 마크다운 형식은 그대로 유지됩니다.)
목차
- 2계층 애플리케이션이란?
- 배포 접근 방식
- EC2 인스턴스 준비
- Ubuntu에 Docker 설치
- Dockerfile 만들기
- 컨테이너 빌드 및 실행
- Docker 네트워킹
- 이미지 Docker Hub에 푸시하기
- Docker Compose
- 애플리케이션 접근
- 핵심 메시지
- 마무리
- 단일 명령 및 다음 단계
Two‑Tier 애플리케이션이란?
A Two‑Tier Application consists of:
| 계층 | 설명 |
|---|---|
| Application Tier (Backend) | • Flask 기반 서비스 • 비즈니스 로직, API 요청 및 데이터베이스와의 통신을 처리 |
| Database Tier | • MySQL 데이터베이스 • 애플리케이션 데이터를 저장 및 관리하고, 백엔드로부터의 쿼리를 처리 |
백엔드는 애플리케이션의 동작 방식을 정의하고, 데이터베이스는 데이터 영속성과 일관성을 보장합니다.
배포 접근 방식
간단하고 구조화된 방식을 유지하기 위해 배포는 두 단계로 수행됩니다:
- Dockerfile (단일‑컨테이너 중심) – Flask 백엔드를 컨테이너화합니다.
- Docker Compose (다중‑컨테이너 설정) – Flask 백엔드 와 MySQL 데이터베이스를 함께 실행합니다.
이는 실제 개발 워크플로우를 반영하며 이후 Kubernetes로의 마이그레이션을 위한 기반이 됩니다.
EC2 인스턴스 준비
- Ubuntu EC2 인스턴스(예:
t2.micro)를 시작하고 이름을2-tier-App-DEPLOYMENT로 지정합니다. - SSH 접근을 위한 개인 키를 연결합니다.
- 현재는 기본 보안 그룹 설정을 사용합니다; 이후 인바운드 규칙을 조정할 예정입니다(포트
22와5000허용).
# Example SSH command
ssh -i /path/to/your-key.pem ubuntu@<public‑ip>
Source: …
Ubuntu에 Docker 설치하기
인스턴스에서 다음 명령을 실행합니다:
# 패키지 인덱스 업데이트
sudo apt-get update
# 필수 패키지 설치
sudo apt-get install -y \
ca-certificates \
curl \
gnupg \
lsb-release
# Docker 공식 GPG 키 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 안정적인 저장소 설정
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] \
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Docker Engine 설치
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
# 설치 확인
docker --version
팁:
Permission denied while trying to connect to the docker daemon socket오류가 발생하면, 현재 사용자를docker그룹에 추가합니다:
sudo usermod -aG docker $USER
newgrp docker # 현재 세션에서 그룹 멤버십 새로 고침
Dockerfile 만들기
- 저장소를 복제합니다:
git clone https://github.com/SAFI-ULLAHSAFEER/two-tier-flask-app.git
cd two-tier-flask-app
- 기존
Dockerfile을 삭제하고 새 파일을 만듭니다:
rm -f Dockerfile
cat > Dockerfile :5000`.
(원본 스니펫이 갑자기 끝납니다; 그대로 유지하십시오.)
컨테이너 빌드 및 실행
(섹션 자리표시자 – 원본 내용에는 Dockerfile 생성 외에 명시적인 단계가 포함되지 않았습니다.)
Docker 네트워킹
--link를 사용하는 대신, 격리된 네트워크를 생성합니다:
docker network create twotier
docker network connect twotier mysql-db
docker network connect twotier flask-app
네트워크 멤버십을 확인할 수 있습니다:
docker network inspect twotier
Docker Hub에 이미지 푸시하기
# Log in (you’ll be prompted for Docker Hub credentials)
docker login
# Tag the image for your repository (replace <your‑repo> with your Docker Hub repo)
docker tag two-tier-flask-app:latest <your‑repo>/two-tier-flask-app:latest
# Push the image
docker push <your‑repo>/two-tier-flask-app:latest
이미지가 이제 공개적으로 사용 가능하며 모든 호스트에서 풀할 수 있습니다.
Source: …
Docker Compose
Docker Compose를 사용하는 이유
Docker Compose를 사용하면 두 개의 컨테이너(Flask와 MySQL)를 하나의 YAML 파일에 정의하고 한 번의 명령으로 시작할 수 있습니다.
Docker Compose 설치
sudo curl -L "https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-$(uname -s)-$(uname -m)" \
-o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
docker-compose.yml 설명
프로젝트 루트에 docker-compose.yml 파일을 생성합니다:
version: "3.9"
services:
db:
image: mysql:8.0
container_name: mysql-db
environment:
MYSQL_ROOT_PASSWORD: RootPass123
MYSQL_DATABASE: two_tier
MYSQL_USER: appuser
MYSQL_PASSWORD: AppPass123
volumes:
- mysql-data:/var/lib/mysql
- ./message.sql:/docker-entrypoint-initdb.d/message.sql # optional seed data
ports:
- "3306:3306"
web:
build: .
container_name: flask-app
depends_on:
- db
environment:
DB_HOST: db
DB_USER: appuser
DB_PASSWORD: AppPass123
DB_NAME: two_tier
ports:
- "5000:5000"
volumes:
mysql-data:
핵심 포인트
| 지시자 (Directive) | 이유 (Reason) |
|---|---|
depends_on | MySQL 컨테이너가 Flask보다 먼저 시작되도록 보장하여 연결 오류를 방지합니다. |
volumes (named) | 컨테이너 재시작 시에도 MySQL 데이터가 유지되도록 합니다. |
./message.sql | 첫 실행 시 데이터베이스를 미리 채우는 선택적 스크립트입니다. |
build: . | 현재 디렉터리의 Dockerfile을 사용해 Flask 이미지를 빌드합니다. |
팁: 온라인 YAML 포맷터나
yamllint를 사용해 들여쓰기가 올바른지 확인하세요.
Compose로 애플리케이션 실행
# 이전 단계에서 남은 컨테이너가 있으면 정리
docker compose down
# 이미지 빌드 및 서비스 시작
docker compose up -d
상태 확인:
docker compose ps
이제 모든 컨테이너가 동일한 네트워크에 연결되어 실행 중이며, Flask 앱은 http://<host‑ip>:5000에서 접근할 수 있습니다.
애플리케이션 접근
- 보안 그룹 – 인바운드 규칙이 포트 5000(SSH용 22 포함)에서 TCP 트래픽을 허용하는지 확인합니다.
- 브라우저를 열고 다음 주소로 이동합니다:
http://<host‑ip>:5000
Flask 애플리케이션의 기본 페이지 또는 API 응답이 표시됩니다.
핵심 메시지
AWS Cloud Club MUST
AWS Student Community Day Mirpur 2025
이 문자열들은 애플리케이션이나 문서 내에 표시하고자 하는 모든 브랜드 또는 이벤트‑특정 메시지의 자리표시자입니다.
마무리
우리는:
- Containerized a two‑tier Flask + MySQL app using a Dockerfile. → Dockerfile을 사용해 2계층 Flask + MySQL 앱을 컨테이너화했습니다.
- Built and run the containers individually, then networked them. → 컨테이너를 개별적으로 빌드하고 실행한 뒤 네트워크를 연결했습니다.
- Pushed the Flask image to Docker Hub for easy distribution. → Flask 이미지를 Docker Hub에 푸시하여 손쉽게 배포할 수 있게 했습니다.
- Orchestrated the full stack with Docker Compose, handling startup order, persistent storage, and environment configuration. → Docker Compose로 전체 스택을 오케스트레이션하여 시작 순서, 영구 저장소, 환경 설정을 관리했습니다.
이 워크플로는 프로덕션‑급 DevOps 파이프라인을 반영하며, Kubernetes, Helm, 그리고 전체 규모의 AWS 배포로 나아가기 위한 탄탄한 디딤돌이 됩니다. 컨테이너화 즐기세요!
단일 명령 및 다음 단계
이 워크플로를 사용하면 로컬 머신부터 클라우드까지 어디서든 애플리케이션을 공유하고 실행하며 확장할 수 있습니다. 🚀
다음 단계
- Kubernetes와 Helm을 탐색하여 더 큰 애플리케이션을 오케스트레이션하세요.
- AWS와 같은 클라우드 플랫폼에 배포하여 컨테이너화 기술을 한 단계 끌어올리세요!
계속 실험하고, 공유하며, 더 스마트하고 빠르며 확장 가능한 애플리케이션을 함께 구축합시다.