Home > Database > Mysql Tutorial > body text

Introduction to the application of Docker deployment of Nginx+Flask+Mongo (with code)

不言
Release: 2019-03-23 16:46:08
forward
3303 people have browsed it

This article brings you an introduction to the application of Docker deployment of Nginx Flask Mongo (with code). It has certain reference value. Friends in need can refer to it. I hope it will be helpful to you.

Use Docker to deploy Nginx Flask Mongo application

Nginx is used as the server, Mongo is the database support, and Flask is the web framework of the Python language. Using the container features of Docker, it can be easily deployed on Linux

Project preparation on the server

The main project directory is as follows

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

Brief description

The docker-file directory is the configuration file for docker deployment

The src directory is the python code of the flask application

Detailed configuration of Docker

docker-compose configuration

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
Copy after login

Configuration of MongoDB

/mongo/Dockerfile The content is as follows

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
Copy after login

The content of/mongo/setup.sh is as follows

The purpose of this file is to create a user test with a password of test after starting MongoDB, and give it the read and write capabilities of the database test Operation
#!/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
Copy after login

Flask application configuration

/flask/Dockerfile content is as follows

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
Copy after login

/src/app/run.py code

here Annotated app.run() for debugging, and started with gunicorn when publishing
from app import create_app
app = create_app('default')
app.debug=False
# if __name__ == '__main__':
#    app.run()
Copy after login

Nginx configuration

/nginx/Dockerfile content is as follows

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
Copy after login

/nignx/conf The content of /nginx.conf is as follows

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  '$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  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;

        }
    }


}
Copy after login

Start deployment

  1. Enter the docker-flie directorycd docker-flie
  2. Start docker docker-compose up
  3. View container statusdocker ps
  4. Enter 127.0.0.1 in the local deployment browser

Finally, three containers similar to docker_file_nginx_1, docker_file_mongo_1, and docker_file_flask_1 appear, indicating success! ! !

Trampling on pitfalls

  • 1 The initialization file in the mongol container needs to be placed in the docker-entrypoint-initdb.d directory

I have done the following If you try, it will show that mongdb is not started.

ADD setup.sh /data/setup.sh
RUN chmod +x /data/setup.sh
CMD ["/data/setup.sh"]
Copy after login
  • 2 The flask application cannot connect to mongo. This article uses the link method.

The configuration of the database should be written accordingly:

MONGODB_SETTINGS = {
        'db': 'test',
        'host': 'mongo',  # 127.0.0.1 host地址一定要写你配置的--link的名字
        'username': 'test',
        'password': 'test',
        'port': 27017
    }
Copy after login

Change back to 127.0.0.1

3 when testing locally. The proxy mode used in nginx configuration, in which the IP of the flask application is executed , should be the intranet IP

This article has ended here. For more other exciting content, you can pay attention to the mongodb video tutorial column on the PHP Chinese website!

The above is the detailed content of Introduction to the application of Docker deployment of Nginx+Flask+Mongo (with code). For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:segmentfault.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template