Python 웹 실전 | Docker+Nginx는 Python Django 웹 프로젝트 세부 단계를 배포합니다. [건어물]

 


개요

이 기사에서는 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 지정합니다  .webweb

이제 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를 사용해 본 적이 없다면 이 문서가 다소 모호할 수 있습니다. 그러나 이러한 도구와 프레임워크에 익숙해지면 이를 사용하여 애플리케이션을 구축하고 배포하는 것이 매우 편리하고 효율적이라는 것을 알게 될 것입니다.

오늘의 공유는 여기까지입니다. 좋아요, 수집 및 전달을 환영합니다. 감사합니다.

추천

출처blog.csdn.net/Rocky006/article/details/131958056