Docker Compose를 사용한 웹 애플리케이션 배포

Docker Compose를 사용한 웹 애플리케이션 배포

DevOps
Docker Compose
Docker Compose를 사용한 웹 애플리케이션 배포
Author

gabriel yang

Published

October 7, 2024


Docker Compose를 사용하여 간단한 웹 애플리케이션을 배포하는 방법에 대해 설명해드리겠습니다. 이 예제에서는 Nginx 웹 서버와 Flask 백엔드 애플리케이션을 배포하는 방법을 단계별로 알아봅니다.

목표:

  • Flask: 간단한 파이썬 웹 애플리케이션을 백엔드로 설정.
  • Nginx: 프론트엔드 웹 서버로 사용.
  • Docker Compose: 두 컨테이너를 함께 관리하고, 애플리케이션을 배포.

1. 프로젝트 구조 설정

먼저 프로젝트 디렉토리 구조를 정의합니다.

my-web-app/
├── docker-compose.yml
├── nginx/
   └── default.conf
└── web/
    ├── app.py
    └── requirements.txt

각 파일의 역할:

  • docker-compose.yml: Docker Compose 설정 파일.
  • nginx/default.conf: Nginx 설정 파일.
  • web/app.py: Flask 웹 애플리케이션.
  • web/requirements.txt: Flask와 같은 파이썬 패키지 의존성 목록.

2. Flask 애플리케이션 작성

my-web-app/web/app.py 파일을 생성하고 간단한 Flask 애플리케이션을 작성합니다.

# web/app.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello, World! This is Flask running behind Nginx."

if __name__ == '__main__':
    app.run(host='0.0.0.0')

설명:

  • Flask 애플리케이션은 / 경로에서 “Hello, World!” 메시지를 반환합니다.
  • app.run(host='0.0.0.0')를 통해 모든 네트워크 인터페이스에서 Flask 서버를 접근할 수 있게 설정합니다.

3. 파이썬 의존성 파일 작성

my-web-app/web/requirements.txt 파일에 Flask 의존성을 추가합니다.

Flask==2.0.1

4. Nginx 설정 파일 작성

my-web-app/nginx/default.conf 파일에 Nginx 설정을 작성합니다.

server {
    listen 80;

    location / {
        proxy_pass http://web:5000;
        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;
    }
}

설명:

  • Nginx는 80번 포트에서 요청을 수신하고, Flask 백엔드 컨테이너(web)의 5000번 포트로 프록시합니다.
  • proxy_pass http://web:5000;에서 web은 Docker Compose에서 정의한 서비스 이름을 참조합니다.

5. Docker Compose 파일 작성

my-web-app/docker-compose.yml 파일을 작성하여 두 개의 서비스(Nginx와 Flask)를 정의합니다.

version: '3'

services:
  web:
    build: ./web
    ports:
      - "5000:5000"
    volumes:
      - ./web:/app

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - web

설명:

  • web: Flask 애플리케이션을 빌드하고 5000번 포트에서 실행합니다.
    • build: ./web: Flask 애플리케이션을 정의한 디렉토리에서 빌드합니다.
    • volumes: 호스트의 ./web 디렉토리를 컨테이너 내부의 /app 디렉토리에 마운트합니다.
  • nginx: Nginx 이미지를 사용하여 80번 포트에서 실행합니다.
    • volumes: 호스트의 Nginx 설정 파일을 컨테이너에 마운트합니다.
    • depends_on: web 서비스가 먼저 실행되도록 설정합니다.

6. Flask용 Dockerfile 작성

my-web-app/web/Dockerfile 파일을 작성하여 Flask 애플리케이션의 이미지를 빌드합니다.

# web/Dockerfile
FROM python:3.9-alpine

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

COPY . .

CMD ["python", "app.py"]

설명:

  • FROM python:3.9-alpine: 파이썬 3.9을 기반으로 하는 Alpine 이미지를 사용합니다.
  • WORKDIR /app: 애플리케이션이 실행될 디렉토리입니다.
  • COPY: 호스트의 파일을 컨테이너로 복사합니다.
  • CMD: Flask 애플리케이션을 실행합니다.

7. 애플리케이션 실행

모든 설정이 완료되었으면, Docker Compose 명령을 사용하여 애플리케이션을 실행할 수 있습니다.

docker-compose up --build

설명:

  • --build: 컨테이너를 처음 빌드할 때 사용합니다. 이후에는 docker-compose up만 사용해도 됩니다.
  • 이 명령어는 Nginx와 Flask 컨테이너를 동시에 실행합니다.

8. 웹 애플리케이션 접속

애플리케이션이 성공적으로 실행되었다면, 브라우저에서 http://localhost에 접속하면 Nginx를 통해 Flask 애플리케이션의 “Hello, World!” 메시지를 확인할 수 있습니다.