ホームページ  >  記事  >  運用・保守  >  Docker を使用して Nginx+Flask+Mongo アプリケーションをデプロイする方法

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

WBOY
WBOY転載
2023-05-14 16:16:061235ブラウズ

nginx をサーバーとして、mongo をデータベースサポートとして、flask を Python 言語の Web フレームワークとして使用し、docker のコンテナ機能を使用して、Linux サーバーに簡単にデプロイできます

プロジェクトの準備

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

__ project-name
  |__ docker-file
    |__ ningx
      |__ dockerfile
      |__ conf
        |__ nginx.conf
    |__ flask
      |__ dockerfile
      |__ requirements.txt
    |__ mongo
      |__ dockerfile
      |__ setup.sh
    |__ docker-compose.yml
  |__ src
    |__ app
      |__ ...
    |__ run.py

簡単な説明

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

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

#Docker の詳細な設定

docker-compose 構成

version: '2.2'
services:
 mongo:
  build: ./mongo
  volumes:
   - "./mongo/db:/data/db"
  restart: always
  ports:
   - "27017:27017"
  environment:
   mongo_initdb_root_username: root
   mongo_initdb_root_password: 123456
 flask:
  build: ./flask
  links:
   - mongo
  ports:
   - "5000:5000"
  expose:
   - "5000"
  volumes:
   - ../src:/home/web
 nginx:
   build: ./nginx
   links:
    - flask
   volumes:
    - "./nginx/log:/var/log/nginx"
    - "../:/usr/share/nginx/html"
   ports:
    - "80:80"
    - "8080:8080"
    - "443:443"
   restart: always

mongodb 構成


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

from mongo:3.6
# 设置时区
env tz=asia/shanghai
run ln -snf /usr/share/zoneinfo/$tz /etc/localtime && echo $tz > /etc/timezone
# 设置工作目录
env workdir /usr/local/work
env auto_run_dir /docker-entrypoint-initdb.d
env install_mongo_shell setup.sh
run mkdir -p $workdir
# 复制数据库的初始化命令
copy ./$install_mongo_shell $auto_run_dir/
run chmod +x $auto_run_dir/$install_mongo_shell

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

このファイルの目的は、mongodb の起動後に test というパスワードを持つユーザー テストを作成し、データベース test

#!/bin/bash
mongo <<eof
use admin;
db.auth(&#39;root&#39;, &#39;123456&#39;);
use dmx_aluminum;
db.createuser({user:&#39;test&#39;,pwd:&#39;test&#39;,roles:[{role:&#39;readwrite&#39;,db:&#39;test&#39;}]});
db.createcollection("user");
eof

flask アプリケーションの読み取りおよび書き込み操作です。構成


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

from python:3.6
# 设置时区
env tz=asia/shanghai
run ln -snf /usr/share/zoneinfo/$tz /etc/localtime && echo $tz > /etc/timezone

# 设置工作区
run mkdir -p /home/web
workdir /home/web
# 添加依赖
add requirements.txt /home/web/requirements.txt
run 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 から始めます

from app import create_app
app = create_app(&#39;default&#39;)
app.debug=false
# if __name__ == &#39;__main__&#39;:
#  app.run()

nginx 構成


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

from nginx:1.14
# 设置时区
env tz=asia/shanghai
run ln -snf /usr/share/zoneinfo/$tz /etc/localtime && echo $tz > /etc/timezone
# 复制配置
copy conf/nginx.conf /etc/nginx/nginx.conf

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

user nginx;
worker_processes 1;

error_log /var/log/nginx/error.log warn;
pid    /var/run/nginx.pid;

events {
  worker_connections 1024;
}


http {
  include    /etc/nginx/mime.types;
  default_type application/octet-stream;

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

  access_log /var/log/nginx/access.log main;

  sendfile    on;
  #tcp_nopush   on;

  keepalive_timeout 65;

  # 开启gzip
  gzip on;
  gzip_min_length 1k;
  gzip_buffers 4 16k;
  #gzip_http_version 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 off;
  gzip_disable "msie [1-6]\.";

  server {
    listen 80;
    server_name localhost;
    keepalive_timeout 5;
    root /usr/share/nginx/html;

    location /static/ {
      alias /usr/share/nginx/html/src/app/static/;
    }

    location / {
      # checks for static file, if not found proxy to app
      try_files $uri @flask_app;
    }

    location @flask_app {
      proxy_pass http://192.168.0.2:5000; # 发布在阿里云上,应填写内网ip
      proxy_redirect off;
      proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
      proxy_set_header host $http_host;
      proxy_set_header x-real-ip $remote_addr;

      #proxy_buffers 8 32k;
      #proxy_buffer_size 64k;

    }
  }


}

デプロイメントの開始

#docker-flie ディレクトリに移動します。 cd docker-flie
  1. #docker を開始します docker-compose up

  2. コンテナ ステータスの表示ドッカー ps

  3. ローカル デプロイメントブラウザに 127.0.0.1 と入力します

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

落とし穴を踏みにじる

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

次のことを試してみましたが、mongdb が起動していないと表示されます。

add setup.sh /data/setup.sh
run chmod +x /data/setup.sh
cmd ["/data/setup.sh"]

2 flask アプリケーションが mongo に接続できません。この記事ではリンク方式を使用しています。

データベース構成は次のように記述する必要があります:

mongodb_settings = {
    &#39;db&#39;: &#39;test&#39;,
    &#39;host&#39;: &#39;mongo&#39;, # 127.0.0.1 host地址一定要写你配置的--link的名字
    &#39;username&#39;: &#39;test&#39;,
    &#39;password&#39;: &#39;test&#39;,
    &#39;port&#39;: 27017
  }

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

3 nginx 構成で使用されるプロキシ モード。フラスコが実行されます。アプリケーション IP はイントラネット IP

である必要があります。

以上がDocker を使用して Nginx+Flask+Mongo アプリケーションをデプロイする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。