Docker Compose를 사용한 웹 애플리케이션 배포
Docker Compose를 사용한 웹 애플리케이션 배포
DevOps
Docker Compose
Docker Compose를 사용한 웹 애플리케이션 배포
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
= Flask(__name__)
app
@app.route('/')
def hello():
return "Hello, World! This is Flask running behind Nginx."
if __name__ == '__main__':
='0.0.0.0') app.run(host
설명:
- 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!” 메시지를 확인할 수 있습니다.