Docker の人気と成熟に伴い、Docker は徐々にプロジェクトをデプロイするための第一の選択肢になってきました。今日は、Docker を使用して Django テクノロジー スタック プロジェクトをデプロイする方法を紹介します。 ここで説明する Django テクノロジー スタックは、python3.6、Django2.2、redis、mysql、celery、gunicorn、nginx です。実際の運用プロジェクトでは、これらのコンポーネントはクラスター内の異なるマシンに分散されます。たとえば、Nginx、redis、Mysql は別々のチームまたは部門によって管理される場合があります。関連するデプロイメント アーキテクチャとコンテナー オーケストレーションはより複雑なので、この記事では詳しく説明しません。この記事では主に、docker-compose を使用してこれらのコンポーネントをオーケストレーションする方法を紹介します。この方法は、テスト環境や個人のサイドプロジェクトの展開に適しています。 この記事では、読者がすでに 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 構成ファイルです。
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 コンテナのその他のファイル:
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の起動設定ファイルを書き込む docker-compose の構成は次のとおりです。 バージョン: '2' サービス: レディス: 画像: redis ポート: - 「6379:6379」 デシベル: 再起動: 常に イメージ:mysql:5.7.19 # コマンド: --character-set-server=utf8mb4 --collation-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 --collation-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 を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: MySql が常に mySqlInstallerConsole ウィンドウをポップアップする問題の解決策
>>: Vueは複数のカウントダウンを同時に設定する機能を実装しています
NFSが提供するサービスマウント: サーバー上で /usr/sbin/rpc.mountd サーボ ...
静的ファイルNginx は高いパフォーマンスで知られており、フロントエンドのリバース プロキシ サー...
<br />みなさんこんにちは!ここで皆さんとチャットできて光栄です! (*^__^*)...
1. 以前のバージョン yum 削除 docker docker-client docker-cli...
目次プロジェクトにおける一般的な支払い方法Alipay決済微信ペイプロジェクトにおける一般的な支払い...
クイックリーディングSQL ステートメントを監視する必要があるのはなぜか、監視方法と監視手段について...
WIN10 64ビットに最新のMySQL8.0.18をインストールダウンロード公式サイトから最新バ...
デフォルトでは、CentOS 7 上の PHP は apache または nobody として実行さ...
TypeScript を使用する場合、TypeScript が提供する型システムを使用してコードのあ...
目次1. イメージをプルする2. ローカルデータボリュームを作成する3. コンテナを作成する4. J...
1. MySQL rpm パッケージのインストール # インストールソースをダウンロードします [r...
MySQL はネストされたトランザクションをサポートしていますが、それを実行する人は多くありません....
高性能分散メモリオブジェクトキャッシュシステムMemcachedについては、別の記事「Windows...
Web フロントエンド開発では、ページに多くの記事を表示することが避けられません。記事の最後にあるク...
目次1. ブール2. 表現3. マルチクラスパッケージ4. v-bind でクラス class を直...