前后端项目部署-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部署
###
###