docker部署flask项目1 使用gunicorn替代测试服务器

在程序开发过程中,往往会遇到环境配置和版本问题,而为了避免环境配置问题,对于python来说一般都会使用到虚拟环境,比如常用的virtualenv、pipenv等。当把项目部署到服务器上的时候,像virtualenv来说则不太方便了,这个时候就推荐使用Docker。

Docker可以提供操作系统级别的虚拟环境,一个Docker镜像一般都包含一个完整的操作系统,而这些系统内部也有已经配置好的开发环境,如python3.7环境。

1.镜像拉取

首先需要拉取python镜像,键入

docker search python

可以看到docker hub提供的的各种镜像:

第一个则为python镜像,接下来选择一个合适的版本,也就是标签;当直接键入

docker pull python

 的时候,拉取的是python:latest的镜像;而这里选择的是python3.7,则需要键入:

docker pull python:3.7

接着会开始下载这个镜像:

下载完成后可以输入:

docker images

来查看已经下载的镜像:

注:Dockerfile的基础镜像需要提前下载,否则在构建时会出错。 

2.flask和gunicorn

在这里,我的flask项目结构如下:

该项目被封装到了一个名称为web的一个包 。flask项目在部署到云服务器的时候,应该使用独立的WSGI容器来代替测试服务器,比较常用的有uWSGI和gunicorn,这里使用的是gunicorn。

接下来是Dockerfile的编写:

FROM python:3.7

VOLUME ['/code']
WORKDIR /code
# 复制requirements.txt
COPY requirements.txt /code

# 安装gunicorn代替测试服务器
RUN pip install -r requirements.txt && pip install gunicorn

EXPOSE 8000

CMD gunicorn --workers=4 --bind=0.0.0.0:8000 wsgi:app

首先,该镜像基于python:3.7镜像,然后在该镜像内部创建一个名称为/code的卷,并把该目录设置为工作目录;接着把requirements.txt 复制到该目录中,然后安装所需要的库和gunicorn;然后暴露了8000端口(还需要docker run -p的配合),最后则添加了一个运行的命令,让gunicorn以4个工作进程,并且暴露了8000端口,且任何IP都可以访问。

至于最后的wsgi:app则是对应于wsgi.py文件


from web import create_app

app = create_app('production')

该文件的内容非常简单,就是从web包中导入了工厂函数create_app,然后实例化了一个app对象(该对象为Flask类的一个实例,具体细节则封装在了create_app中)

3.镜像的构建和运行

Dockerfile编写完成后,就可以考虑构建镜像了,

docker build -t sky/tutorial .

基于本目录的Dockerfile创建一个名称为sky/tutorial的镜像,点击回车键后就开始构建镜像了。

由于docker会在每一步都创建一个缓存,所以当构建失败的时候可以docker run -it [IMAGE ID] /bin/bash 进入该镜像的一个容器来手动键入下一句命令来判断命令是否有误。

构建成功后输入:

docker images

将会看到构建成功的镜像。

接着就可以运行了:

docker run -d -p 8000:8000 --name slx -v $PWD:/code sky/tutorial

-d表示守护进程运行;-p 8000:8000表示把本机的8000端口和该容器的8000端口做一个映射;--name slx表示容器的名称为slx;-v $PWD:/code $PWD为linux的一个变量,它输出的是当前目录,也就是说,它的含义就是把当前目录挂载到容器的./code目录上;最后则是镜像的名称。

之后可以输入:

docker ps -l

来判断当前的容器的运行状态,比如在我的服务器上的运行如下(我使用的只是是-p 8000,每一次运行docker都会分配一个随机的端口):

STATUS表示运行状态,如果出错可以输入:

docker logs [容器名称]

 来简单的进行错误的排查。

如果使用的是阿里云,则需要开放8000端口,教程如下:

https://blog.csdn.net/bull521/article/details/90034799

当端口开放成功后,则可以通过IP:PORT来访问网站了。

4.备注

1.linux服务器与windows客户端传递小型文件时可以在linux上安装lrzsz,然后在windows上安装支持ZModem的telnet/ssh客户端,比如xshell(xshell免费版),之后可以通过rz来把文件传输到服务器;sz发送到客户端。

2.lrzsz仅仅支持单文件传输,对于多文件可以使用压缩包的方式,需要注意,对于windows下的zip压缩包,可以使用:

unzip -O CP936 *.zip

进行解压,以避免解压后文件名乱码。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值