Docker を使用して Nginx+Flask+Mongo アプリケーションをデプロイする

Docker を使用して Nginx+Flask+Mongo アプリケーションをデプロイする

サーバーにはNginx、データベースサポートにはMongo、Python言語のWebフレームワークにはFlaskを採用しています。Dockerのコンテナ特性を活かし、Linuxサーバー上に簡単に導入できます。

プロジェクト準備

プロジェクトのメインディレクトリは次のとおりです。

__プロジェクト名
  |__ docker ファイル
    |__ ニングス
      |__ Dockerファイル
      |__conf
        |__ nginx.conf
    |__フラスコ
      |__ Dockerファイル
      |__ 要件.txt
    |__ モンゴ
      |__ Dockerファイル
      |__ セットアップ.sh
    __docker-compose.yml は、
  |__ソース
    |__ アプリ
      |__ ...
    |__run.py

簡単な説明

docker-fileディレクトリはdockerデプロイメントの設定ファイルです

srcディレクトリはFlaskアプリケーションのPythonコードです

Dockerの詳細設定

docker-compose の設定

バージョン: '2.2'
サービス:
 モンゴ:
  ビルド: ./mongo
  ボリューム:
   - 「./mongo/db:/data/db」
  再起動: 常に
  ポート:
   - 「27017:27017」
  環境:
   MONGO_INITDB_ROOT_USERNAME: ルート
   MONGO_INITDB_ROOT_パスワード: 123456
 フラスコ:
  ビルド: ./flask
  リンク:
   - モンゴ
  ポート:
   - 「5000:5000」
  さらす:
   - 「5000」
  ボリューム:
   - ../src:/home/web
 nginx:
   ビルド: ./nginx
   リンク:
    - フラスコ
   ボリューム:
    - 「./nginx/log:/var/log/nginx」
    - 「../:/usr/share/nginx/html」
   ポート:
    - 「80:80」
    - 「8080:8080」
    - 「443:443」
   再起動: 常に

MongoDB の設定

/mongo/Dockerfileの内容は次のとおりです。

mongo:3.6より
# タイムゾーンを設定 ENV TZ=Asia/Shanghai
実行 ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 作業ディレクトリを設定する ENV WORKDIR /usr/local/work
環境変数 AUTO_RUN_DIR /docker-entrypoint-initdb.d
ENV INSTALL_MONGO_SHELL セットアップ.sh
mkdir -p $WORKDIR を実行します。
# データベース初期化コマンドをコピーします COPY ./$INSTALL_MONGO_SHELL $AUTO_RUN_DIR/
chmod +x $AUTO_RUN_DIR/$INSTALL_MONGO_SHELL を実行します。

/mongo/setup.shの内容は次のとおりです

このファイルの目的は、MongoDBを起動した後にパスワードtestを持つユーザーtestを作成し、データベースtestに対する読み取りおよび書き込み操作を許可することです。

#!/bin/bash
モンゴ <<EOF
管理者を使用します。
db.auth('ルート', '123456');
dmx_aluminum を使用します。
db.createUser({user:'test',pwd:'test',roles:[{role:'readWrite',db:'test'}]});
db.createCollection("ユーザー");
終了

Flaskアプリケーションの構成

/flask/Dockerfileの内容は次のとおりです。

Python:3.6 から
# タイムゾーンを設定 ENV TZ=Asia/Shanghai
実行 ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# ワークスペースを設定する RUN mkdir -p /home/web
ワークディレクトリ /home/web
# 依存関係を追加する ADD requirements.txt /home/web/requirements.txt
pip3 install -i https://pypi.douban.com/simple/ -r requirements.txt を実行します。

# gunicorn を使用してアプリケーションを起動します CMD gunicorn -w 4 -b 0.0.0.0:5000 run:app

/src/app/run.py コード

ここではデバッグ用の app.run() がコメントアウトされており、公開時に gunicorn で起動されます。

アプリからインポートcreate_app
アプリ = create_app('デフォルト')
app.debug=False
# __name__ == '__main__' の場合:
# アプリを実行()

Nginx の設定

/nginx/Dockerfileの内容は次のとおりです

nginx:1.14より
# タイムゾーンを設定 ENV TZ=Asia/Shanghai
実行 ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 設定をコピー COPY conf/nginx.conf /etc/nginx/nginx.conf

/nignx/conf/nginx.confの内容は次のとおりです。

ユーザー nginx;
ワーカープロセス 1;

error_log /var/log/nginx/error.log 警告;
pid /var/run/nginx.pid;

イベント {
  ワーカー接続 1024;
}


http {
  /etc/nginx/mime.types を含めます。
  デフォルトタイプ アプリケーション/オクテットストリーム;

  log_format main '$remote_addr - $remote_user [$time_local] "$request" '
           '$status $body_bytes_sent "$http_referer" '
           '"$http_user_agent" "$http_x_forwarded_for"';

  access_log /var/log/nginx/access.log メイン;

  ファイル送信オン;
  #tcp_nopush オン;

  キープアライブタイムアウト65;

  # gzipを有効にする
  gzip オン;
  gzip_min_length 1k;
  gzip_バッファ 4 16k;
  #gzip_http_バージョン1.0;
  gzip_comp_level 1;
  gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
  gzip_vary オフ;
  gzip_disable "MSIE [1-6]\.";

  サーバー{
    聞く 80;
    server_name ローカルホスト;
    キープアライブタイムアウト 5;
    ルート /usr/share/nginx/html;

    場所 /static/ {
      エイリアス /usr/share/nginx/html/src/app/static/;
    }

    位置 / {
      # 静的ファイルをチェックし、見つからない場合はアプリへのプロキシ
      try_files $uri @flask_app;
    }

    場所 @flask_app {
      proxy_pass http://192.168.0.2:5000; # Alibaba Cloudに公開されている場合、イントラネットIPアドレスを入力する必要があります
      proxy_redirect オフ;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header ホスト $http_host;
      proxy_set_header X-Real-IP $remote_addr;

      #プロキシバッファ 8 32k;
      #プロキシバッファサイズ64k;

    }
  }


}

展開を開始する

  1. docker-flieディレクトリに入ります cd docker-flie
  2. dockerを起動します docker-compose up
  3. コンテナのステータスを表示する docker ps
  4. ローカルデプロイメントブラウザに127.0.0.1と入力します

最後に、docker_file_nginx_1、docker_file_mongo_1、docker_file_flask_1 に似た 3 つのコンテナーが表示され、成功したことを示します。 ! !

落とし穴と苦情

1 mongolコンテナの初期化ファイルはdocker-entrypoint-initdb.dディレクトリに配置する必要があります。

以下を試してみましたが、mongdb が起動していないことがわかりました。

setup.sh /data/setup.shを追加します
chmod +x /data/setup.shを実行します。
コマンド ["/data/setup.sh"]

2 Flask アプリケーションは mongo に接続できません。この記事では、link メソッドを使用します。

データベース構成はそれに応じて記述する必要があります。

MONGODB_SETTINGS = {
    'db': 'テスト',
    'host': 'mongo', # 127.0.0.1 ホストアドレスは、設定した --link の名前である必要があります 'username': 'test',
    'パスワード': 'テスト',
    'ポート': 27017
  }

ローカルテスト中に 127.0.0.1 に戻す

3 nginx設定で使用されるプロキシモード。Flaskアプリケーションを実行するIPはイントラネットIPである必要があります。

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

以下もご興味があるかもしれません:
  • Flask および Django フレームワークのカスタム モデル クラスのテーブル名と親クラスに関連する問題の分析
  • Flask アプリケーションの Docker デプロイ実装手順
  • Flaskアプリケーションをサーバーにデプロイする方法
  • uWSGI と Nginx を使用して Flask プロジェクトをデプロイする方法の例
  • CentOS7 デプロイメント Flask (Apache、mod_wsgi、Python36、venv)
  • Flask フレームワーク構成依存パッケージ情報に基づく Python プロジェクトの移行と展開
  • CentOS に Flask プロジェクトをデプロイする方法
  • CentOS 7.0 は Nginx を使用して Flask アプリケーションをデプロイするチュートリアル
  • Alibaba Cloud での Ubuntu 1.4 Flask + WSGI + Nginx の展開の詳細説明
  • flaskblogアプリケーションをDigitalOceanサーバーにデプロイする
  • Mac OS に Nginx、FastCGI、Flask フレームワークを導入するチュートリアル
  • Docker に Python の Flask フレームワークをデプロイするチュートリアル
  • Flask を使用してモデルをサービスとしてデプロイする方法

<<:  JavaScriptを使用してページ効果を作成する

>>:  SQL と MySQL のステートメント実行順序の分析

推薦する

HTML テーブルタグチュートリアル (13): 内部境界スタイル属性ルール

RULES を使用すると、テーブルの内部境界のスタイルを制御できます。基本的な構文<TABLE...

Raspberry Pi 4 に Ubuntu 19.10 をインストールするための詳細なチュートリアル

以前、raspbian で実行したときに opencv の一部の依存関係をパッケージ化できず、一部の...

Vueはシンプルなコメント機能を実装します

この記事では、Vueの簡単なコメント機能を実装するための具体的なコードを参考までに共有します。具体的...

SELinux 入門

カーネル 2.6 の時代には、アクセス制御セキュリティ ポリシーのメカニズムを提供するために新しいセ...

Vue3 コンポジション API の紹介

目次概要例なぜそれが必要なのでしょうか?設定参照、反応的計算して見るライフサイクルVue3.0 は ...

MySQLリモート接続失敗の解決策

以前、MySQLがローカルでは接続できるのにリモートでは接続できないという問題に遭遇したことがありま...

Vueがビデオアップロード機能を実装

この記事では、参考までに、ビデオアップロード機能を実現するためのVueの具体的なコードを紹介します。...

自動開始および停止コマンドを適用するには、Docker サービスを再起動します (推奨)

Docker サービス アプリケーションを再起動するコマンドを見てみましょう。具体的な内容は次のと...

Javascript ファイルと Blob の詳細な説明

目次ファイル()文法パラメータ例ブロブ()文法パラメータ財産方法例要約するファイル() File()...

ウェブサイトはグレー表示されています。画像を含む互換コードはすべてのブラウザをサポートしています

通常、国喪の日、大地震の日、清明節には、ウェブサイト全体を灰色にして、故人への哀悼の意を表します。そ...

MySQL 5.7.22 バイナリパッケージのインストールとインストール不要版 Windows 設定方法

次のコードは、MySQL 5.7.22 バイナリ パッケージのインストール方法を紹介しています。具体...

Docker+Nginx を使ってシングルページアプリケーションをデプロイする

開発から導入まで自分で行うシングルページアプリケーションを開発する場合、ビルドを実行した後 npm ...

ウェブページ上でデスクトップ exe プログラムを呼び出す簡単な方法

この記事では主に、Web ページ上でデスクトップ exe プログラムを呼び出す方法を紹介します。 W...

Linux システムでの CPU 使用率が高い場合のトラブルシューティングのアイデアと解決策

序文Linux 運用保守エンジニアとして、日々の業務の中で Linux サーバーの CPU 負荷が ...