Python Web実戦 | Docker+NginxでPython Django Webプロジェクトをデプロイする詳細手順【乾物】

 


概要

この記事では、Docker と Nginx を使用して Django Web プロジェクトをデプロイする方法について説明します。Docker イメージの構築方法、Docker Compose ファイルの作成方法、Nginx の構成方法を段階的に説明します。


1. Docker ビルド Django Web プロジェクト

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 Dockerイメージのビルド

これで、Dockerfile を使用して Docker イメージを構築できるようになりました。myproject ディレクトリで ターミナルを開き、次のコマンドを実行します。

docker build -t myproject .

上記のコマンドは、 myproject ディレクトリ内の Dockerfile を使用して、myproject という名前の Docker イメージを構築します。

1.4 Docker イメージの実行

これで、Docker イメージを実行できるようになりました。ターミナルで次のコマンドを実行します。

docker run -it --rm -p 8000:8000 myproject

上記のコマンドは、 myproject という Docker イメージを実行し、コンテナーのポート 8000 をホストのポート 8000 にマップします。これで、ブラウザでアクセスして、  http://localhost:8000 Django プロジェクトが動作しているかどうかを確認できるようになりました。

2. Docker Compose を使用して Django Web プロジェクトを調整する

上記の方法は 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 ファイルでは、2 つのサービスを定義しました。1 つは web サービスで、もう 1 つは db サービスです。web このサービスは先ほど構築した Django Web プロジェクトであり、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 Web プロジェクトを 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 サービスにプロキシし、Host ヘッダーと 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

上記の Docker Compose ファイルでは、  以前に作成したものを使用して Docker イメージを構築するnginx というサービス を定義しました。Dockerfile.nginxコンテナのポート 80 をホストのポート 80 にマップし、  Nginx が サービス へのリクエストをプロキシできるようにサービスを depends_on 指定します 。webweb

これで、Docker Compose を使用して Docker イメージを構築して実行できるようになりました。ターミナルで次のコマンドを実行します。

docker-compose up

上記のコマンドは、 docker-compose.yml そのファイルを使用して Docker イメージを構築し、実行します。コンテナーが起動したら、ブラウザーで Django プロジェクトが正常に動作しているかどうかを確認できます 。リクエストは Nginx によってサービスhttp://localhost にプロキシされます 。web

4. 静的ファイルの提供と HTTPS サポートを構成する

Django プロジェクトに静的ファイルが含まれている場合は、それらを別の静的ファイル提供として構成する必要があります。さらに、Web アプリケーションの 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 の公式 Web サイトをご覧ください。

次に、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;
    }
}

上記の構成ファイルでは、2 つのサーバーを定義しました。最初のサーバーはポート 80 でリッスンし、リクエストをポート 443 にリダイレクトします。2 番目のサーバーはポート 443 でリッスンし、SSL 証明書を使用して HTTPS サポートを有効にします。 SSL 証明書と秘密キーへのパスをそれぞれ指定しますssl_certificate 。 ssl_certificate_key

4.3 Docker Compose ファイルの更新

最後に、Docker Compose ファイルを更新して、新しい Nginx 構成と静的ファイルの提供を含める必要があります。更新された 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