Docker, Kubernetes, Helm 및 AWS를 사용한 2계층 애플리케이션의 엔드투엔드 배포

발행: (2026년 1월 2일 오전 07:58 GMT+9)
10 분 소요
원문: Dev.to

Source: Dev.to

위에 제공된 링크에 포함된 전체 텍스트를 제공해 주시면, 해당 내용을 한국어로 번역해 드리겠습니다.
(코드 블록, URL 및 마크다운 형식은 그대로 유지됩니다.)

목차

  1. 2계층 애플리케이션이란?
  2. 배포 접근 방식
  3. EC2 인스턴스 준비
  4. Ubuntu에 Docker 설치
  5. Dockerfile 만들기
  6. 컨테이너 빌드 및 실행
  7. Docker 네트워킹
  8. 이미지 Docker Hub에 푸시하기
  9. Docker Compose
  10. 애플리케이션 접근
  11. 핵심 메시지
  12. 마무리
  13. 단일 명령 및 다음 단계

Two‑Tier 애플리케이션이란?

A Two‑Tier Application consists of:

계층설명
Application Tier (Backend)• Flask 기반 서비스
• 비즈니스 로직, API 요청 및 데이터베이스와의 통신을 처리
Database Tier• MySQL 데이터베이스
• 애플리케이션 데이터를 저장 및 관리하고, 백엔드로부터의 쿼리를 처리

백엔드는 애플리케이션의 동작 방식을 정의하고, 데이터베이스는 데이터 영속성과 일관성을 보장합니다.

배포 접근 방식

간단하고 구조화된 방식을 유지하기 위해 배포는 두 단계로 수행됩니다:

  1. Dockerfile (단일‑컨테이너 중심) – Flask 백엔드를 컨테이너화합니다.
  2. Docker Compose (다중‑컨테이너 설정) – Flask 백엔드 MySQL 데이터베이스를 함께 실행합니다.

이는 실제 개발 워크플로우를 반영하며 이후 Kubernetes로의 마이그레이션을 위한 기반이 됩니다.

EC2 인스턴스 준비

  1. Ubuntu EC2 인스턴스(예: t2.micro)를 시작하고 이름을 2-tier-App-DEPLOYMENT 로 지정합니다.
  2. SSH 접근을 위한 개인 키를 연결합니다.
  3. 현재는 기본 보안 그룹 설정을 사용합니다; 이후 인바운드 규칙을 조정할 예정입니다(포트 225000 허용).
# 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 만들기

  1. 저장소를 복제합니다:
git clone https://github.com/SAFI-ULLAHSAFEER/two-tier-flask-app.git
cd two-tier-flask-app
  1. 기존 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_onMySQL 컨테이너가 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에서 접근할 수 있습니다.

애플리케이션 접근

  1. 보안 그룹 – 인바운드 규칙이 포트 5000(SSH용 22 포함)에서 TCP 트래픽을 허용하는지 확인합니다.
  2. 브라우저를 열고 다음 주소로 이동합니다:
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 배포로 나아가기 위한 탄탄한 디딤돌이 됩니다. 컨테이너화 즐기세요!

단일 명령 및 다음 단계

이 워크플로를 사용하면 로컬 머신부터 클라우드까지 어디서든 애플리케이션을 공유하고 실행하며 확장할 수 있습니다. 🚀

다음 단계

  • KubernetesHelm을 탐색하여 더 큰 애플리케이션을 오케스트레이션하세요.
  • AWS와 같은 클라우드 플랫폼에 배포하여 컨테이너화 기술을 한 단계 끌어올리세요!

계속 실험하고, 공유하며, 더 스마트하고 빠르며 확장 가능한 애플리케이션을 함께 구축합시다.

Back to Blog

관련 글

더 보기 »

RGB LED 사이드퀘스트 💡

markdown !Jennifer Davis https://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%...

Mendex: 내가 만드는 이유

소개 안녕하세요 여러분. 오늘은 제가 누구인지, 무엇을 만들고 있는지, 그리고 그 이유를 공유하고 싶습니다. 초기 경력과 번아웃 저는 개발자로서 17년 동안 경력을 시작했습니다.