개요
이 기사에서는 Docker 및 Nginx를 사용하여 Django 웹 프로젝트를 배포하는 방법을 설명합니다. Docker 이미지 빌드 방법, Docker Compose 파일 작성 방법 및 Nginx 구성 방법을 단계별로 설명합니다.
1. Docker 빌드 Django 웹 프로젝트
1.1 Django 프로젝트 구성
시작하기 전에 Django 프로젝트가 필요합니다. 아직 Django 프로젝트가 없는 경우 공식 Django 문서에 따라 프로젝트를 만들 수 있습니다. Django 프로젝트를 myproject
.
1.2 Dockerfile 쓰기
다음으로 Dockerfile을 작성해야 합니다. Dockerfile은 Docker 이미지를 빌드하는 데 사용되는 스크립트입니다. myproject
라는 디렉토리 아래에 파일을 만들고 Dockerfile
다음 내용을 추가합니다 .
# 基础镜像
FROM python:3.9
# 在容器中创建项目目录
RUN mkdir /code
# 设置工作目录
WORKDIR /code
# 将当前目录下的所有文件复制到容器中的 /code 目录
COPY . /code/
# 安装项目依赖
RUN pip install -r requirements.txt
위의 Dockerfile에서 먼저 Python 3.9를 기본 이미지로 지정합니다. 그런 다음 컨테이너에 라는 디렉터리를 만들고 /code
현재 디렉터리의 모든 파일을 /code
컨테이너의 디렉터리에 복사합니다. 마지막으로 프로젝트에 필요한 종속 항목을 설치합니다.
1.3 도커 이미지 빌드
이제 Dockerfile을 사용하여 Docker 이미지를 빌드할 수 있습니다. 디렉토리 에서 터미널을 열고 myproject
다음 명령을 실행합니다.
docker build -t myproject .
위의 명령은 myproject
디렉터리의 Dockerfile을 사용하여 myproject
이라는 Docker 이미지를 빌드합니다.
1.4 도커 이미지 실행하기
이제 Docker 이미지를 실행할 수 있습니다. 터미널에서 다음 명령을 실행합니다.
docker run -it --rm -p 8000:8000 myproject
위의 명령은 Docker 이미지를 실행 myproject
하고 컨테이너의 포트 8000을 호스트의 포트 8000에 매핑합니다. 이제 브라우저에서 방문하여 http://localhost:8000
Django 프로젝트가 작동하는지 확인할 수 있습니다.
2. Docker Compose를 사용하여 Django 웹 프로젝트 조정
위의 방법은 Docker 이미지를 빌드하고 실행하는 데 사용할 수 있지만 데이터베이스를 처리하는 방법, 환경 변수를 설정하는 방법 등과 같은 몇 가지 중요한 문제를 고려하지 않습니다. 이러한 문제를 해결하기 위해 Docker Compose를 사용할 수 있습니다.
2.1 Docker Compose 파일 작성
myproject
라는 디렉토리 아래에 파일을 만들고 docker-compose.yml
다음 내용을 추가합니다 .
version: '3'
services:
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
environment:
- DJANGO_SETTINGS_MODULE=myproject.settings
- DATABASE_URL=postgres://postgres:postgres@db:5432/postgres
db:
image: postgres
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
위의 Docker Compose 파일에서 두 가지 서비스를 정의했습니다. 하나는 web
서비스이고 다른 하나는 db
서비스입니다. web
서비스는 방금 빌드한 Django 웹 프로젝트이고 db
서비스는 PostgreSQL 데이터베이스입니다.
web
서비스 에서 build
키워드를 사용하여 Dockerfile의 경로를 지정합니다. command
키워드는 컨테이너가 시작될 때 실행할 명령을 지정하는 데 사용되며 여기서는 Django의 개발 서버를 실행합니다. volumes
키워드는 로컬 디렉터리를 컨테이너 내부의 디렉터리와 매핑하는 데 사용되므로 로컬에서 파일을 편집하고 컨테이너 내에서 실행할 수 있습니다. ports
키워드는 컨테이너 내부의 포트를 호스트의 포트에 매핑하는 데 사용됩니다. environment
키워드는 환경 변수를 설정하는 데 사용되며 여기서는 Django의 구성과 데이터베이스 연결의 URL을 설정합니다.
db
서비스 에서는 image
키워드를 사용하여 PostgreSQL의 공식 이미지를 지정합니다. environment
키워드는 PostgreSQL 사용자 이름, 암호 및 데이터베이스 이름을 설정하는 데 사용됩니다.
2.2 Docker Compose 실행
이제 Docker Compose를 사용하여 Docker 이미지를 빌드하고 실행할 수 있습니다. 터미널에서 다음 명령을 실행합니다.
docker-compose up
docker-compose.yml
위의 명령은 파일을 사용하여 Docker 이미지를 빌드하고 실행합니다. 컨테이너가 시작된 후 브라우저에서 컨테이너를 방문하여 http://localhost:8000
Django 프로젝트가 작동하는지 확인할 수 있습니다.
3. Nginx 리버스 프록시 구성
Django 웹 프로젝트를 Docker에 성공적으로 배포했지만 Nginx로 리버스 프록시를 구성하는 방법은 다루지 않았습니다. 이 섹션에서는 Nginx로 리버스 프록시를 구성하는 방법을 설명합니다.
3.1 Nginx 구성 파일 작성
myproject
라는 디렉토리 아래에 파일을 만들고 nginx.conf
다음 내용을 추가합니다 .
upstream web {
server web:8000;
}
server {
listen 80;
location / {
proxy_pass http://web;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
위의 구성 파일에서 명명된 업스트림을 정의하여 web
Docker Compose의 서비스를 가리킵니다 web
. 그런 다음 포트 80에서 수신 대기하는 Nginx 서버를 정의했습니다. 위치에서 업스트림 web
서비스에 대한 요청을 프록시하고 호스트 및 X-Real-IP 헤더를 설정합니다.
위의 구성은 ip에 액세스하기 위한 프로젝트를 엽니다. 도메인 이름을 바인딩하려면 다음과 같이 변경할 수 있습니다.
upstream web {
server web:8000;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://web;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
example.com을 자신의 IP로 해석한 후 도메인 이름에 액세스하여 프로젝트를 열 수 있습니다.
3.2 Dockerfile 쓰기
우리가 작성한 구성 파일을 Nginx에서 사용하려면 Dockerfile을 작성해야 합니다.
myproject
라는 디렉토리 아래에 파일을 만들고 Dockerfile.nginx
다음 내용을 추가합니다 .
# 基础镜像
FROM nginx:latest
# 删除默认配置文件
RUN rm /etc/nginx/conf.d/default.conf
# 将自定义配置文件复制到容器中的 /etc/nginx/conf.d/ 目录下
COPY nginx.conf /etc/nginx/conf.d/
위의 Dockerfile에서 먼저 Nginx의 최신 버전을 기본 이미지로 지정합니다. 그런 다음 기본 구성 파일을 삭제하고 작성한 구성 파일을 /etc/nginx/conf.d/
컨테이너의 디렉터리에 복사합니다.
3.3 Docker 이미지 빌드 및 실행
이제 Dockerfile.nginx를 사용하여 Docker 이미지를 빌드할 수 있습니다. 터미널에서 다음 명령을 실행합니다.
docker build -t myproject-nginx -f Dockerfile.nginx .
위의 명령은 다음을 사용하여 이름이 지정된 Docker 이미지를 Dockerfile.nginx
빌드합니다. myproject-nginx
다음으로 Docker Compose를 사용하여 Nginx 서비스를 시작해야 합니다. docker-compose.yml
다음을 추가합니다 .
version: '3'
services:
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .
ports:
- "8000:8000"
environment:
- DJANGO_SETTINGS_MODULE=myproject.settings
- DATABASE_URL=postgres://postgres:postgres@db:5432/postgres
db:
image: postgres
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
nginx:
build: .
ports:
- "80:80"
depends_on:
- web
nginx
위의 Docker Compose 파일에서 이전에 작성된 것을 사용하여 Dockerfile.nginx
Docker 이미지를 빌드하는 이라는 서비스를 정의했습니다 . 컨테이너의 포트 80을 호스트의 포트 80에 매핑하고 Nginx가 서비스 에 요청을 프록시할 수 있도록 서비스를 depends_on
지정합니다 .web
web
이제 Docker Compose를 사용하여 Docker 이미지를 빌드하고 실행할 수 있습니다. 터미널에서 다음 명령을 실행합니다.
docker-compose up
docker-compose.yml
위의 명령은 파일을 사용하여 Docker 이미지를 빌드하고 실행합니다. 컨테이너가 시작된 후 브라우저를 방문하여 Django 프로젝트가 정상적으로 작동하는지 확인할 수 있으며 요청은 Nginx에 의해 서비스 http://localhost
에 프록시됩니다 .web
4. 정적 파일 제공 및 HTTPS 지원 구성
Django 프로젝트에 정적 파일이 포함된 경우 별도의 정적 파일 제공으로 구성해야 합니다. 또한 웹 애플리케이션에 대한 HTTPS 지원을 구성해야 할 수도 있습니다. 이 섹션에서는 정적 파일 제공 및 HTTPS 지원을 구성하는 방법에 대해 설명합니다.
4.1 정적 파일 서비스 구성
Nginx가 정적 파일을 제공하려면 nginx.conf
파일에 다음을 추가해야 합니다.
upstream web {
server web:8000;
}
server {
listen 80;
location /static/ {
alias /code/static/;
}
location / {
proxy_pass http://web;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
위의 구성 파일에서 Nginx가 정적 파일을 클라이언트에 제공할 수 있도록 명명된 위치를 추가 /static/
하고 별칭을 설정했습니다 ./code/static/
4.2 HTTPS 지원 구성
HTTPS 지원을 구성하려면 SSL 인증서를 사용해야 합니다. SSL 인증서를 구입하거나 무료 Let's Encrypt 인증서를 사용할 수 있습니다.
4.2.1 Let's Encrypt 인증서 사용
Let's Encrypt 인증서를 사용하려는 경우 아래 단계에 따라 구성할 수 있습니다.
먼저 Certbot 도구를 설치합니다. Certbot의 공식 웹사이트에서 자세한 설치 지침을 찾을 수 있습니다.
그런 다음 Certbot 도구를 사용하여 인증서를 요청합니다. 터미널에서 다음 명령을 실행합니다.
sudo certbot certonly --webroot --webroot-path=/code/static -d example.com
위의 명령은 webroot 플러그인을 사용하여 인증서를 요청합니다. --webroot-path
옵션은 지정된 디렉토리에서 확인 파일을 찾도록 Certbot을 구성합니다. -d
옵션은 도메인 이름을 지정합니다.
nginx.conf
마지막으로 파일 에 다음을 추가합니다 .
upstream web {
server web:8000;
}
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location /static/ {
alias /code/static/;
}
location / {
proxy_pass http://web;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
위의 구성 파일에서 우리는 두 개의 서버를 정의했습니다. 첫 번째 서버는 포트 80에서 수신하고 포트 443으로 요청을 리디렉션하고 두 번째 서버는 포트 443에서 수신하고 SSL 인증서를 사용하여 HTTPS 지원을 활성화합니다. SSL 인증서와 개인 키에 대한 경로를 각각 지정합니다 ssl_certificate
. ssl_certificate_key
4.3 Docker Compose 파일 업데이트
마지막으로 새로운 Nginx 구성 및 정적 파일 제공을 포함하도록 Docker Compose 파일을 업데이트해야 합니다. 다음은 업데이트된 Docker Compose 파일입니다.
version: "3"
services:
web:
build:
context: .
dockerfile: Dockerfile
ports:
- "8000:8000"
environment:
- DJANGO_SETTINGS_MODULE=myproject.settings
- DATABASE_URL=postgres://postgres:postgres@db:5432/postgres
db:
image: postgres
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
nginx:
build:
context: .
dockerfile: Dockerfile.nginx
ports:
- "80:80"
- "443:443"
depends_on:
- web
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./certbot:/etc/letsencrypt
위의 Docker Compose 파일에서 nginx
HTTPS를 지원하기 위해 포트 443이라는 서비스를 추가하고 호스트의 포트 443에 매핑했습니다. 또한 컨테이너 외부의 구성 및 인증서 관리를 위해 호스트에 /etc/nginx/nginx.conf
및 디렉터리를 마운트합니다./etc/letsencrypt
이제 Docker Compose를 사용하여 Docker 이미지를 빌드 및 실행하고 브라우저에서 해당 이미지를 방문하여 https://example.com
Django 프로젝트가 작동하는지 확인할 수 있습니다.
5. 기술 요약
이전에 Docker를 사용해 본 적이 없다면 이 문서가 다소 모호할 수 있습니다. 그러나 이러한 도구와 프레임워크에 익숙해지면 이를 사용하여 애플리케이션을 구축하고 배포하는 것이 매우 편리하고 효율적이라는 것을 알게 될 것입니다.
오늘의 공유는 여기까지입니다. 좋아요, 수집 및 전달을 환영합니다. 감사합니다.