前后端项目部署-5, flask+Gunicorn+gevent+supervisor+nginx+redis+mysql+mongodb,docker-compose部署

###

flask+Gunicorn+gevent+supervisor+nginx+redis+mysql+mongodb,docker-compose部署

###

flask+Gunicorn+gevent+supervisor+nginx+redis,docker-compose部署

这个不多说了,不在赘述,这一篇主要研究一下,如果docker部署的时候,使用MongoDB,还有mysql,

####

mysql的Dockerfile,这个地方指定了要使用mysql镜像,

FROM mysql
COPY ./init.sql /docker-entrypoint-initdb.d

  init.sql是数据库初始化文件,它会把flask应用需要用到的库和表创建出来。在mysql官方镜像中提供了容器启动时自动执行/docker-entrypoint-initdb.d文件夹下的脚本的功能(包括shell脚本和sql脚本) 。因此我们只要把初始化文件在镜像启动时复制到/docker-entrypoint-initdb.d文件夹就可以了

####

重点,mysql的账号密码应该怎么配置在docker里面,是放到docker-compose.yml文件里面的,不需要手动设置了,

只要你在文件里面指定了密码,你连接的时候使用这个密码就可以了,

###

初始化脚本,init.sql

CREATE DATABASE knights;
use knights;

CREATE TABLE favorite_colors (
  name VARCHAR(20),
  color VARCHAR(10)
);

INSERT INTO favorite_colors
  (name, color)
VALUES
  ('Lancelot', 'blue'),
  ('Galahad', 'yellow');

 

####

mongo的dockerfile

FROM mongo

很简单,就是一行,指定使用MongoDB镜像,

还有很多配置,可以网上搜索,

###

docker-compose.yml

version: "2.0"

services:
  redis:
    image: redis:buster

  mysql:
    build: ./mysql
    ports:
      - "32000:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
    restart: always

  mongodb:
    build: ./mongo
    hostname: mongodb
    ports:
      - '27017:27017'

  web:
    build:
      context: ./web/
    ports:
      - "8000:8000"
    links:
      - redis
      - mysql:mysql

  nginx:
    restart: always
    build: ./nginx/
    ports:
      - "80:80"
    links:
      - web

###

mysql和redis的ip不能是以前的localhost或者127.0.0.1.要改为容器名字作为ip,或者指定hostname

###

对应的app.py

增加几个接口,用来验证容器启动之后,是否能访问,

import pymysql
import json
import os
import socket
from redis import Redis
from pymongo import MongoClient
from flask import Flask, redirect, url_for, request, render_template
import datetime

app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', 'redis'), port=6379)

myclient = MongoClient("mongodb://mongodb:27017/")

mongo_db = myclient['test']  # 这个是库名
mongo_collection = mongo_db['test_collection']  # 这个是表名


def favorite_colors():
    config = {
        'user': 'root',
        'password': 'root',
        'host': 'mysql',
        'port': 3306,
        'database': 'knights'
    }
    connection = pymysql.connect(**config)
    cursor = connection.cursor()
    cursor.execute('SELECT * FROM favorite_colors')
    results = [{name: color} for (name, color) in cursor]
    cursor.close()
    connection.close()

    return results


@app.route('/')
def index() -> str:
    return json.dumps({'favorite_colors': favorite_colors()})


@app.route('/redis')
def hello():
    redis.incr('hits')
    return 'Hello Container World! I have been seen %s times and my hostname is %s.\n' % (
    redis.get('hits'), socket.gethostname())


@app.route('/mongo')
def mongo():

    info = {
        'name': 'Zarten',
        'text': 'Inserting a Document',
        'tags': ['a', 'b', 'c'],
        'date': datetime.datetime.now()
    }
    mongo_collection.insert_one(info)

    find_result = mongo_collection.find_one()

    find_result = json.dumps(str(find_result))

    return find_result

####

http://0.0.0.0:8000/,这个来验证mysql的连接结果,

http://0.0.0.0:8000/redis,这个来验证redis的连接结果,

http://0.0.0.0:8000/mongo,这个来验证mongo的连接结果,

 

#####

运行,

第一步:先cd到项目根目录

第二步:构建,docker-compose build

第三步:启动,docker-compose up -d

-d是后台启动,可以不加,不加运行的时候就能看到启动过程,

第四步:查看,docker-compose ps

验证:输入ip和端口号,查看一下是否正常访问

第五步:停止,docker-compose stop

 

####

其他具体flask+Gunicorn+gevent+supervisor+nginx,这些配置和文件,在前一篇文章,

###

通过这篇文章,

体会一下,docker是怎么使用redis+mysql+mongodb的,

####

到此,整个后端的部署,就是这样了,

使用的架构就是: flask+Gunicorn+gevent+supervisor+nginx+redis+mysql+mongodb,docker-compose部署

####

下一步,把前端的vue集成进来, 看看如何使用docker部署

###

 

 

 

 

###

posted @ 2021-10-07 03:25  技术改变命运Andy  阅读(178)  评论(0编辑  收藏  举报