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は複数のカウントダウンを同時に設定する機能を実装しています

推薦する

AIX マウント NFS の書き込み効率が低い場合の解決策

NFSが提供するサービスマウント: サーバー上で /usr/sbin/rpc.mountd サーボ ...

Nginx 静的サービス設定の詳細な説明 (ルートとエイリアスの指示)

静的ファイルNginx は高いパフォーマンスで知られており、フロントエンドのリバース プロキシ サー...

ウェブデザインの仕事に応募する方法

<br />みなさんこんにちは!ここで皆さんとチャットできて光栄です! (*^__^*)...

CentOS 8 に Docker をインストールする詳細なチュートリアル

1. 以前のバージョン yum 削除 docker docker-client docker-cli...

Vue プロジェクトでの支払い機能の実装 (WeChat 支払いと Alipay 支払い)

目次プロジェクトにおける一般的な支払い方法Alipay決済微信ペイプロジェクトにおける一般的な支払い...

MySQLステートメントを監視する方法の詳細な説明

クイックリーディングSQL ステートメントを監視する必要があるのはなぜか、監視方法と監視手段について...

Win10 64 ビットで圧縮パッケージを使用して最新の MySQL 8.0.18 をインストールするチュートリアル (画像とテキスト付き)

WIN10 64ビットに最新のMySQL8.0.18をインストールダウンロード公式サイトから最新バ...

CentOS 7 に PHP5 用の suPHP をインストールする方法 (Peng Ge)

デフォルトでは、CentOS 7 上の PHP は apache または nobody として実行さ...

TypeScript でオブジェクト キーの値の範囲を制限する方法

TypeScript を使用する場合、TypeScript が提供する型システムを使用してコードのあ...

Dockerを使用してJenkinsをインストールする方法

目次1. イメージをプルする2. ローカルデータボリュームを作成する3. コンテナを作成する4. J...

MySQL のインストール方法と設定に関するいくつかの問題の概要

1. MySQL rpm パッケージのインストール # インストールソースをダウンロードします [r...

MySQLのネストされたトランザクションで発生する問題

MySQL はネストされたトランザクションをサポートしていますが、それを実行する人は多くありません....

CentOS に Memcached と PHP Memcached 拡張機能をインストールする

高性能分散メモリオブジェクトキャッシュシステムMemcachedについては、別の記事「Windows...

ウェブページにコンテンツが多すぎる場合に、下から上へ素早く戻る方法

Web フロントエンド開発では、ページに多くの記事を表示することが避けられません。記事の最後にあるク...

Vueでクラススタイルを使用する方法の詳細

目次1. ブール2. 表現3. マルチクラスパッケージ4. v-bind でクラス class を直...