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 のステートメント実行順序の分析

推薦する

Centos7 FFmpeg オーディオ/ビデオ ツールのインストールに関する簡単なドキュメント

ffmpeg は非常に強力なオーディオおよびビデオ処理ツールです。公式 Web サイトは http:...

Vue-CLI3.xはプロジェクトをサーバーに自動的にデプロイします

目次序文1. scp2をインストールする2. テスト/本番環境サーバーのSSHリモートログインアカウ...

光るテキストとちょっとしたJS特殊効果を実現するCSS

実装のアイデア: CSSでtext-shadowを使用してテキストの光る効果を実現します効果画像: ...

WeChatアプレットが検索ボックス機能を実装

この記事の例では、WeChatアプレットの検索ボックス機能を実装するための具体的なコードを参考までに...

Windows Server 2016 に Docker をインストールする方法

最近、Microsoft は Docker をネイティブにサポートする Windows Server...

Vue の proto ファイルの関数呼び出しのグラフィカルな説明

1. protoをコンパイルするすべての .proto ファイルを保存するために、src フォルダー...

CentOS 6.5 の設定 ssh キーフリーログインで pssh コマンドを実行する方法の説明

1. psshを確認してインストールします。yum list pssh 2. キーレスログインが設定...

フロントエンド Vue ユニットテストを始める

目次1. ユニットテストはなぜ必要なのでしょうか? 2. ユニットテストの書き方3. テストツール4...

MySQL5.7 mysqldump バックアップとリカバリの実装

MySQL バックアップコールドバックアップ:停止服務進行備份,即停止數據庫的寫入ホットバックアップ...

単一の MySQL テーブルで数千万のデータを処理するアイデアを共有する

目次プロジェクトの背景改善案データ特性を観察するマルチプロセスアイデアの要約データ処理スキルプロジェ...

vue-cli 3 で vue-bootstrap-datetimepicker 日付プラグインを使用する方法

需要背景最近、Vue を使用してフロントエンド エンジニアリング システムと組み合わせ、以前のデモを...

折りたたまれたテーブル行要素のバグ

例を見てみましょう。コードは次の通り非常にシンプルです。コードをコピーコードは次のとおりです。 &l...

計算機機能を実現するjsバージョン

この記事の例では、計算機機能を実装するためのjsの具体的なコードを参考までに共有しています。具体的な...

CSS の :focus-within の楽しさについて簡単に説明します

Bステーションでパスワードを入力するときに目を覆っているこの画像を見たことがある人もいると思いますこ...

MySQL 8.0.22 zip圧縮パッケージ版(無料インストール)のダウンロード、インストール、および構成手順の詳細

目次最初のステップはMySQLをダウンロードすることですステップ2: ダウンロードした圧縮パッケージ...