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

推薦する

CSSは下部のタップバー機能を実装します

現在多くの携帯電話には、下部のタブバーを切り替える機能があります。私も最近、同様の機能を見つけました...

vue keep-alive の簡単な概要

1. 機能主にコンポーネントの状態を保持したり、再レンダリングを回避したりするために使用されます。 ...

nginx + php の「入力ファイルが指定されていません」の解決策

本日、ローカル開発環境で突然「入力ファイルが指定されていません」というエラーが発生してしまいました。...

Ubuntu 18.04 で SSH サービスをインストールして設定する方法

sshツールをインストールする1. ターミナルを開き、次のコマンドを入力します。 apt-getアッ...

HTMLタグのtarget属性の使用法

1: <a> タグを使用してページにリンクする場合、target 属性の役割は誰もが知っ...

MySQLフィールド定義でnullを使用しない理由の分析

NULL が頻繁に使用されるのはなぜですか? (1)Javaのnull Java の NullPoi...

YUM を使用して Linux (CentOS 7) に MySQL 5.7.18 をインストールする方法の詳細なチュートリアル

このプロジェクトでは MySQL を使用する必要があります。これまで Windows では常に確実に...

Win32 MySQL 5.7.27 のインストールと設定方法のグラフィックチュートリアル

MySQL 5.7.27のインストールチュートリアルは以下のように記録され、皆さんと共有されています...

MySQL の中国語ソートの詳細と例

MySQL の漢字ソートの詳細な説明デフォルトでは、MySQL は日付、時刻、および英語の文字列の並...

MySql におけるプロセス制御関数/統計関数/グループ化クエリの使用法の分析

これからの道のりは長く困難ですが、私は探求を続けます。また週末がやってきました。引き続き、皆さんと一...

ドロップダウンメニューを実装するためのネイティブ js

ドロップダウン メニューも実生活では非常に一般的です。実装に使用される js コードは、タブ選択やア...

Linux での Firewalld の高度な設定の使用に関する詳細な説明

IPマスカレードとポート転送Firewalldは2種類のネットワークアドレス変換をサポートしています...

CentOS 7 で MySQL 8 の複数のインスタンスを設定する詳細なチュートリアル (必要な数だけ設定できます)

原因最近、プロジェクトのリファクタリングを始めたのですが、マスタースレーブと読み取り書き込み分離を使...

CSS の ::before と ::after 疑似要素について知らないこと

CSS には、一般的には使用されない 2 つの疑似クラス、before と :after があります...

CentOS7.4 に MySQL 5.7.26 をインストールするための詳細なチュートリアル

CentOS にはデフォルトで MariaDB がインストールされていますが、これは MySQL の...