概要
この記事では、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
指定します 。web
web
これで、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 を使用したことがない場合、この記事は少しわかりにくいかもしれません。ただし、これらのツールやフレームワークに慣れると、それらを使用してアプリケーションを構築およびデプロイするのが非常に便利で効率的であることがわかります。
今日の共有は以上です。「いいね!」、収集、転送を歓迎します、ありがとうございます。