docker を使用して Django テクノロジー スタック プロジェクトをデプロイする方法

docker を使用して Django テクノロジー スタック プロジェクトをデプロイする方法

Docker の人気と成熟に伴い、Docker は徐々にプロジェクトをデプロイするための第一の選択肢になってきました。今日は、Docker を使用して Django テクノロジー スタック プロジェクトをデプロイする方法を紹介します。

ここで説明する Django テクノロジー スタックは、python3.6、Django2.2、redis、mysql、celery、gunicorn、nginx です。実際の運用プロジェクトでは、これらのコンポーネントはクラスター内の異なるマシンに分散されます。たとえば、Nginx、redis、Mysql は別々のチームまたは部門によって管理される場合があります。関連するデプロイメント アーキテクチャとコンテナー オーケストレーションはより複雑なので、この記事では詳しく説明しません。この記事では主に、docker-compose を使用してこれらのコンポーネントをオーケストレーションする方法を紹介します。この方法は、テスト環境や個人のサイドプロジェクトの展開に適しています。

この記事では、読者がすでに docker と docker-compose に関する基本的な知識を持っていることを前提としています。そうでない場合は、次の資料をお読みください。

  • Docker の知識
  • Docker公式ドキュメント
  • Docker Compose ドキュメント

展開方法についてお話ししましょう。

プロジェクト組織構造

まず、プロジェクトの組織構造を見てみましょう。次のようになります。

├── ライセンス
├── README.md
├── 作曲する
│ ├── セロリ
│ │ ├── Dockerfile
│ │ ├── celery-beat.sh
│ │ └── celery.sh
│ ├── MySQL の
│ │ └── my.cnf
│ ├── nginx
│ │ └── nginx.conf
│ └── ウェブ
│ ├── Dockerファイル
│ ├── エントリポイント.sh
│ ├── gunicorn.conf
│ └── gunicorn.sh
├── docker-compose.yml
├── docker_django_demo
│ ├── __init__.py
│ ├── celery.py
│ ├── 設定.py
│ ├── urls.py
│ └── wsgi.py
├── env.tpl
├── manage.py
├── 要件.txt

Django プロジェクト ファイルに加えて、主な追加は、compose 構成ファイル ディレクトリと docker-compose.yml 構成ファイルです。

  • Compose ディレクトリには、主に各コンポーネントの dockerfile ファイルと起動スクリプトが保存されます。
  • docker-compose.yml は、docker-compose のオーケストレーション構成ファイルです。

Dockerfileを書いて初期化スクリプトを起動する

docker-compose では、コンテナを起動する方法が 2 つあります。1 つはパブリック イメージを直接使用してコンテナを起動する方法、もう 1 つは自分で記述した Dockerfile を使用する方法です。追加のツールキットをインストールし、関連する構成を初期化する必要があるため、Web および Celery コンポーネントにはカスタム Dockerfile を使用します。

Web コンテナ用の compose/web/Dockerfile:

Python:3.6 から
環境変数 PYTHONUNBUFFERED 1

mkdir /code を実行
WORKDIR /コード

コピー ./requirements.txt /code/
pip install --no-cache-dir -r requirements.txt を実行します \
  && rm -rf 要件.txt

コピー ./code/
./compose/web/*.sh /code/ をコピーします。
sed -i 's/\r//' gunicorn.sh \ を実行します
  && chmod +x gunicorn.sh \
  && sed -i 's/\r//' エントリポイント.sh \
  && chmod +x エントリポイント.sh

エントリポイント ["/bin/bash", "entrypoint.sh"]

Web コンテナのその他のファイル:

  • compose/web/entrypoint.sh は、Web コンテナの起動スクリプトであり、いくつかの初期化または検出ロジックを実行します。
  • compose/web/gunicorn.conf Gunicorn 設定ファイル。
  • compose/web/gunicorn.sh は gunicorn の起動スクリプトです。

Celery の Dockerfile:

Python:3.6 から
環境変数 PYTHONUNBUFFERED 1

mkdir /code を実行
WORKDIR /コード

コピー ./requirements.txt /code/
./compose/celery/*.sh /code/ をコピーします。
pip install --no-cache-dir -r requirements.txt を実行します \
  && rm -rf requirements.txt && sh init_env.sh

コピー ./code/
./compose/celery/*.sh /code/ をコピーします。
sed -i 's/\r//' celery.sh \ を実行します
  && chmod +x celery.sh \
  && sed -i 's/\r//' celery-beat.sh \
  && chmod +x celery-beat.sh

セロリのその他のファイル:

  • compose/celery/celery.sh Celery 起動スクリプト。
  • compose/celery/celery-beat.sh celery-beat の起動スクリプト。

Composeの起動設定ファイルを書き込む

docker-compose の構成は次のとおりです。

バージョン: '2'

サービス:
 レディス:
  画像: redis
  ポート:
   - 「6379:6379」

 デシベル:
  再起動: 常に
  イメージ:mysql:5.7.19
  # コマンド: --character-set-server=utf8mb4 --collat​​ion-server=utf8mb4_unicode_ci
  ボリューム:
   - ./compose/mysql/:/etc/mysql/conf.d
   - ./db:/var/lib/mysql
  # テスト用
  ポート:
   - 「127.0.0.1:3307:3306」
   # (ホスト:コンテナ)
  環境変数:
   - .env

 ウェブ:
  # 再起動: 常に
  建てる:
   コンテクスト: 。
   Dockerファイル: ./compose/web/Dockerfile
  コマンド: sh gunicorn.sh # ["/bin/bash", "gunicorn.sh"]
  ポート:
   - 「8080:8002」
   # (ホスト:コンテナ)
  ボリューム:
   - ./logs:/var/logs/
   - ./collect_static:/code/collect_static
   - ./static:/code/static
   - ./templates:/code/templates
   - ./uploads:/code/uploads
  環境ファイル: .env
  依存:
   - レディス
   -db

 nginx:
  再起動: 常に
  イメージ: nginx:1.13.0
  ボリューム:
   nginx のディレクトリを /etc/nginx/conf.d/ に変更します。
   - ./staticfiles:/code/staticfiles
   - ./logs:/var/log/nginx
  ポート:
   - 「80:80」
   # (ホスト:コンテナ)
  依存:
   - ウェブ

 セロリ:
  建てる:
   コンテクスト: 。
   Dockerファイル: ./compose/celery/Dockerfile
  コマンド: sh celery.sh
  ボリューム:
   - ./logs:/var/logs/
   - ./uploads:/code/uploads
  依存:
   - レディス
   -db
  環境ファイル: .env

 セロリビート:
  建てる:
   コンテクスト: 。
   Dockerファイル: ./compose/celery/Dockerfile
  コマンド: sh celery-beat.sh
  ボリューム:
   - ./logs:/var/logs/
  依存:
   - レディス
   -db
  環境ファイル: .env

Celery ワーカーと beat ここでは、同じイメージの Dockerfile を使用します。 1 つのイメージと 1 つのプロセスの原則に従って、ワーカー プロセスと beat プロセスをそれぞれ実行するために 2 つのコンテナーを起動します。

コンパイルテスト

設定ファイルを書き込んだ後、イメージをコンパイルしてテストします。

docker-compose ビルド 
docker-compose up # フォアグラウンドで実行 docker-compose up -d # すべてが正しいことを確認したらバックグラウンドで実行

docker-compose ps 起動したコンテナを確認できます:

$ docker-compose ps  
       名前 コマンド 状態 ポート     
--------------------------------------------------------------------------------------------------
docker djangodemo_celery-beat_1 sh celery-beat.sh アップ               
docker djangodemo_celery_1 sh celery.sh アップ               
dockerdjangodemo_db_1 docker-entrypoint.sh mysqld アップ 127.0.0.1:3307->3306/tcp
dockerdjangodemo_nginx_1 nginx -g デーモンをオフ; 0.0.0.0:80->80/tcp を起動   
dockerdjangodemo_redis_1 docker-entrypoint.sh redis ... 0.0.0.0:6379->6379/tcp を起動します 
dockerdjangodemo_web_1 /bin/bash entrypoint.sh sh ... 0.0.0.0:8080->8002/tcp をアップします 

マッピング ポートは実際の状況に応じて調整できます。

質問

構築プロセス中に注意する必要があるいくつかの問題を以下に示します。

mysql エンコーディングの問題

Docker によって提供される MySQL イメージのデフォルトのエンコーディングは latin1 であるため、中国語を保存すると文字化けした文字が表示されます。公式サイトではエンコード方法を変更する方法が紹介されています。スクリプトを起動した後、エンコード形式を指定できます。ドキュメントはここにあります。 MySQL コンテナ バージョン 5.7.19 の場合、docker-compose.yml のコマンドの直後に、パラメータ --character-set-server=utf8mb4 --collat​​ion-server=utf8mb4_general_ci を追加できます。このメソッドは、サーバー側のエンコードのみを変更します。構成ファイルを直接使用して、すべてのエンコード形式を上書きおよび指定できます。

構成は次のとおりです。

[mysqld]
デフォルトのストレージエンジン=INNODB
文字セットサーバー=utf8mb4
照合サーバー=utf8mb4_general_ci
init-connect='名前をutf8mb4に設定'
init_connect = '照合接続を utf8mb4_general_ci に設定'
skip-character-set-client-handshake # クライアントのエンコーディング設定をスキップし、クライアントはサーバーのエンコーディング設定を直接使用します。bind-address = 0.0.0.0

注意: MySQL 5.7.19 の設定ファイル方式は成功しますが、5.7.4 および 5.7.17 は失敗します。これを参考にしてください。

WebはMySQLの起動を待ってから続行します

mysql コンテナは、起動する前にデータベース リンクを受け入れることができません。Web が初期化されたときに、データベースがまだ起動していないと、Web コンテナは起動に失敗し、直接終了します。 Web コンテナーの起動時に検出スクリプトを追加し、データベースが接続された後に続行することができます。

スクリプトは次のとおりです。

#!/usr/bin/env バッシュ
-o errexit を設定する
-o パイプフェイルを設定する

$MYSQL_PASSWORD をエコーし​​ます
$MYSQL_DATABASE をエコーし​​ます
$MYSQL_HOST をエコーする
$MYSQL_USERをエコーする
$MYSQL_PORTをエコーする

関数mysql_ready(){
python << 終了
インポートシステム
pymysqlをインポートする
試す:
  conn = pymysql.connect(ホスト="db", ポート=3306, ユーザー="root", パスワード="$MYSQL_ROOT_PASSWORD", db='$MYSQL_DATABASE', 文字セット='utf8')
pymysql.err.OperationalErrorを除く:
  sys.exit(-1)
sys.exit(0)
終わり
}

mysql_readyまで;
 >&2 echo "MySQL は利用できません - スリープ中です"
 睡眠1
終わり

>&2 echo "MySQL が起動しています - 継続中..."

要約する

この時点で、Docker を使用した Django テクノロジー スタック サービスのデプロイは完了です。完全なプロジェクト コードについては、docker-django-demo を参照してください。

冒頭でも述べたように、この展開方法は大規模な Web サイトのオンライン本番サービスには適していません。結合度が高く、メンテナンスが不十分であるなど、多くの問題があります。ただし、ハードウェア リソースが限られている場合は、独自のサイド プロジェクトまたはテスト環境を展開することが依然として非常に有効です。環境の展開やセットアップの手間が軽減されるほか、移行も非常に便利です。

デモプロジェクトには開発環境でのdockerの使い方の例もいくつかありますが、個人的にはdockerの方がデプロイメントに適しており、開発環境で直接構築するほど柔軟で便利ではないと思います。ぜひメッセージを残して、開発とデプロイメントにおける Docker の使用経験について話し合いましょう。

参照する

クッキーカッター-ジャンゴ

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Docker-compose を使用して Django アプリケーションをオフラインでデプロイする方法
  • Docker を使用して Django プロジェクトをデプロイする方法の例
  • Docker+Jenkins+Gitlab+Djangoアプリケーションデプロイ実践の詳細な説明
  • Docker で Django アプリケーションをデプロイする例
  • Docker を使用して Django、Nginx、R、Python のデプロイメント環境を構築する方法

<<:  MySql が常に mySqlInstallerConsole ウィンドウをポップアップする問題の解決策

>>:  Vueは複数のカウントダウンを同時に設定する機能を実装しています

推薦する

VMware WorkStation 14 pro インストール Ubuntu 17.04 チュートリアル

この記事では、VMware Workstation14 ProにUBuntu17.04をインストール...

Vueコンポーネントドキュメント生成ツールライブラリのメソッド

目次.vue ファイルの解析文書情報を抽出するコンポーネント名、説明、プロパティ、メソッド、モデルを...

ページコンテンツ全体を中央に配置して、高さがコンテンツに合わせて自動的に拡張されるようにする方法

ページコンテンツ全体を中央に配置する方法と、コンテンツに合わせて高さを自動的に拡大縮小する方法。これ...

Linux ホスト上で複数の MySQL データベースを起動する方法

今日は、Linux ホスト上で 4 つの MySQL データベースを起動する方法について説明します。...

MySQLのSQLモードの特徴のまとめ

序文SQL モードは、MySQL がサポートする SQL 構文と、実行されるデータ検証チェックに影響...

jQueryはショッピングカートの完全な機能を実現します

この記事では、ショッピングカートの完全な機能を実現するためのjQueryの具体的なコードを参考までに...

mysqlパラメータsql_safe_updatesを使用して更新/削除範囲を制限する方法の詳細な説明

序文皆さんご存知のとおり、MySQL の運用・保守において、更新/削除条件が誤っているためにデータが...

Vue3 のレンダリング関数における互換性のない変更の詳細な説明

目次レンダリングAPIの変更レンダリング関数のパラメータレンダリング関数のシグネチャの変更VNode...

MySQL における USING と HAVING の使用法の簡単な分析

この記事では、例を使用して MySQL での USING と HAVING の使用方法を説明します。...

TypeScript 列挙の基本と例

目次序文TypeScript の列挙型とは何ですか? TypeScriptで列挙型を使用する際に注意...

CentOS7でルートパスワードをリセットする方法

レンガを移動するプロセスでは、さまざまな環境および構成の問題があり、毎回異なるエラーが発生します。 ...

CSS を使用してプログレスバーと順序プログレスバーを実装する例

この半月、期末試験の準備にかなりのエネルギーを費やしました。今日はしっかり復習するべきだったのですが...

5つのCSSスクロール天井実装方法の比較(パフォーマンス向上版)

改訂版のプレビューこの記事は 3 日前に書かれたものです。先輩の同僚から改訂の提案をいくつかいただき...

Nginx Linux のインストールと展開の詳細なチュートリアル

1. Nginx の紹介Nginxは負荷分散やリバースプロキシにも使えるWebサーバーです。現在最も...

docker を使用して influxdb と mongo をデプロイするための一般的なコマンド

Docker ベースのデータベースをデプロイするsudo docker pull influxdb ...