适用对象:稍微了解docker,刚刚接触RestFul规范,好奇如何使用docker打包web项目的同学们
该项目默认使用了mysql的容器,如不需要使用下面有教程
这个项目使用了Flask+Sqlalchemy+flask_restful+flask_marshmallow
来构建基础项目,
其中后端的mysql是使用了docker的image创建的NAME为flask-mysql的容器(这也是为什么我配置里面localhost是flask-mysql的原因,因为把我该项目和mysql的容器放到了一个network里面,所以可以识别mysql的container的name)
还有一点,本来项目里整合了celery,但是发现不知道怎么在一个容器里面运行两种项目(flask项目和celery项目),于是决定把celery的项目也打包成docker的image(其实这有一个问题,celery的项目我想用flask项目里面的model和mysql连接的,当是分开后我只能二者都设置成一样先,后面看看有没有办法解决这个问题,或者有大神知道解决方法可以在issue里面提出帮助一下我谢谢!)
├── app
│ ├── article
│ │ ├── __init__.py
│ │ ├── models.py
│ │ ├── resource.py
│ │ └── schema.py
│ ├── auth.py
│ ├── gbcomment
│ │ ├── __init__.py
│ │ └── resource.py
│ ├── __init__.py
│ ├── new
│ │ ├── __init__.py
│ │ ├── models.py
│ │ ├── resource.py
│ │ └── schema.py
│ ├── system_config.py
│ └── user
│ ├── __init__.py
│ ├── models.py
│ ├── resource.py
│ └── schema.py
├── dockerfile
├── manager.py
├── README.md
└── requirement.txt
下面稍微介绍一下(由于在测试阶段,所以里面可以看到有一些没用print函数)
需要安装的包
用manage管理的Flask项目
整个app就是我们最重要的内容了
auth.py
:这个是用于验证Token的
__init__.py
:这个里面是项目的主要配置
system_config.py
:这个里面是通用的一些提示啥的user用户模块文件夹
__init__.py
:用户的蓝图声明
models.py
:用户模型
resource.py
:RESTful规范接口写在这里面
schema.py
: 把模型映射成Json格式的文件article文章模块文件夹:与user用户模块相同不进行介绍
认证机制使用Token,用户登录后获得一个临时的Token,每次请求通过这个Token进行认证。至于怎么保存啥的是前端的事情这里不管。
搭配前端项目可以完整的运行起来 前端项目是:Vue.js开发的,通过Vue-cli脚手架进行创建项目,前端模板使用了BootstrapVue框架。地址在这里
PS:要稍微了解Flask的同学会容易看懂,对Flask不熟悉的同学建议先看一下Flask的官网教程。暂时没有把这个项目传到docker hub(还在优化,传太浪费时间),如果想看效果可以通过dockerfile打包成image来运行,直接运行的话记得把mysql的连接地址改成你的数据库ip地址,例如flask-mysql改成localhost。
打包时间有点久,可以先开始创建桥接网络(包含)后面的教程
docker build -t image的名字/tag 具体需要被打包成iamge的位置
下面就是把当前文件夹FlaskRestful下的内容打包成flask_restful/1.0
[root@XXX FlaskRestful]# docker build -t flask_restful/1.0 ./
巴拉巴拉一堆东西,最后看到下面
Successfully built 847928942db6
Successfully tagged flask_restful/1.0:latest
[root@iZbp117p51ll3pasv31s6fZ FlaskRestful]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
flask_restful/1.0 latest 847928942db6 About a minute ago 1.02GB
目的是使mysql和flask项目在一个网络下
docker network create 网络名称
[root@XXX ~]# docker network create flask_network
191b267bd27356f06c69e48046d552e301a1c8d5ff19886bcda90eced6266d0f
[root@iZbp117p51ll3pasv31s6fZ ~]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
巴拉巴拉一堆东西,最后看到下面
1811572b5ea5: Pull complete
Digest: sha256:b69d0b62d02ee1eba8c7aeb32eba1bb678b6cfa4ccfb211a5d7931c7755dc4a8
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
docker run --network 刚刚创建的network --name mysql容器的名称 -p 物理机端口:3306 -e MYSQL_ROOT_PASSWORD=你的数据库密码 -d mysql:latest
[root@iZbp117p51ll3pasv31s6fZ FlaskRestful]# docker run --network flask_network --name flask-mysql -p 4306:3306 -e MYSQL_ROOT_PASSWORD=XXXX -d mysql:latest
c869affa8013c7b8aceeee972423dd420707908c12b8c82ebe1bb0f220e65eef
巴拉巴拉
"Containers": {
"d3d55d3ed501def858d36843c9db41195d82c5b214e3184d2db5daefe53224c4": {
"Name": "flask-mysql",
"EndpointID": "50ae10c43c32190b73703b30d6bb08015b0bf28b2cd4f7dfb4dfc006bd51df8b",
"MacAddress": "02:42:ac:15:00:02",
"IPv4Address": "172.21.0.2/16",
"IPv6Address": ""
}
},
巴拉巴拉
可以发现flask-mysql连接上了
这个时候差不多也打包好了, 这里的--rm退出后就会删除该容器用于测试 -it用于显示交互式查看是否成功 现在用这个临时的容器看一下是否正常连接network
docker run --name 容器名称 -it --rm --network flask_network -p 8888:8888 flask_restful/1.0 python manager.py shell
docker network ls
docker network inspect flask_network
"Containers": {
"3b868d46dc9f7f9f663f8381d6bfb7da42bb6b691fdc9b094b4ea7746fe39408": {
"Name": "flask_app",
"EndpointID": "ea5ce2a56101a2f7319085589f47a2450796fbc3b1bd2d03f47f0f147355e8e6",
"MacAddress": "02:42:ac:15:00:03",
"IPv4Address": "172.21.0.3/16",
"IPv6Address": ""
},
"d3d55d3ed501def858d36843c9db41195d82c5b214e3184d2db5daefe53224c4": {
"Name": "flask-mysql",
"EndpointID": "50ae10c43c32190b73703b30d6bb08015b0bf28b2cd4f7dfb4dfc006bd51df8b",
"MacAddress": "02:42:ac:15:00:02",
"IPv4Address": "172.21.0.2/16",
"IPv6Address": ""
}
},
可以发现都连上了
[root@iZbp117p51ll3pasv31s6fZ ~]# docker exec -it flask-mysql bash
root@0f7e82571cd9:/# mysql -u root -pAliCentOSMysql123456
# 进入之后
mysql> create schema `FlaskRESTFul` default character set utf8 ;
Query OK, 1 row affected, 1 warning (0.02 sec)
初始化函数init_func里面包含创建admin用户密码123456
docker run --name flask_app -it --rm --network flask_network -p 8888:8888 flask_restful/1.0 python manager.py shell
[root@iZbp117p51ll3pasv31s6fZ FlaskRestful]# docker run --name flask_app -it --rm --network flask_network -p 5000:8888 flask_restful/1.0 python manager.py shell
>>> db.create_all()
>>> init_func()
>>>
这样表也创建好了-并且用户也有了
下面是正常的语句
docker run --name flask_app --network flask_network -p 5000:8888 flask_restful/1.0
docker ps
可以发现二者都在运行,这样就搞定了
如果退出后发现容器没有在运行直接
docker start flask_app 即可
环境需求在requirement.txt
安装的方法很简单(推荐在虚拟环境下)
pip install -r requirement.txt
当然你的电脑或者服务器必须有Mysql,对于Mysql的安装这里不介绍。
修改app/__init__.py
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:你的mysql密码@mysql的ip地址:端口号/数据库名称'
这里的数据库要记得去创建,如果以及有了记得数据库里面表的名字是否和该项目重复(因为重复sqlalchemy创建表是会默认跳过的)
首先进入你的虚拟环境,通过下面的代码进行创建表
项目根文件夹下:python manager.py shell
>>> db.create_all()
这样基础表就建立好了
项目根文件夹下:python manager.py runserver --host 0.0.0.0 --port 5000
如果是阿里的服务器记得把对应的端口打开(5000添加到安全组的入站规则),这里也不做介绍
运行有如下的输出就是正常的
(venv) [root@iZbp117p51ll3pasv31s6fZ FlaskRestful]# python manager.py runserver --host 0.0.0.0 --port 5000
/home/work/FlaskRestful/venv/lib/python3.8/site-packages/flask_marshmallow/__init__.py:26: UserWarning: Flask-SQLAlchemy integration requires marshmallow-sqlalchemy to be installed.
warnings.warn(
* Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
话说Postman是真的好用O(∩_∩)O
用户通过ip+/user的POST请求添加用户
{
"UserName": "allen",
"Password": "123"
}
返回结果
{
"code": 200,
"message": "注册成功!"
}