前言

在开发完成之后,我们所有的应用,都是要部署到生产环境中的,而docker的出现,让我们看到了容器式部署的好处,就是便捷。

打包

安装docker和开发web应用我就不多说了,既然能了解到这里,那这些步骤相信对大家来说都是小菜一碟。

我们从打包开始,首先就是我们使用的Gunicorn的配置,在项目根目录下新建一个gunicorn.conf.py

import multiprocessing

workers=3 # 并行工作进程数
threads = 2 # 指定每个工作者的线程数
bind=['0.0.0.0:8000'] # 监听内网端口8000
proc_name='yawp' # 进程名称
pidfile='/tmp/yawp.pid' # 设置进程文件目录
worker_class='gevent' # 工作模式协程
timeout=30 # 超时
errorlog = '/home/gunicorn.error.log'  # 发生错误时log的路径
accesslog = '/home/gunicorn.access.log'  # 正常时的log路径

然后我们改完项目的一些配置之后,在根目录下新建一个Dockerfile,注意,名字一定要正确,没有任何的后缀,不要自行脑补

FROM python:3.7
WORKDIR /Project/你的项目名

COPY requirements.txt ./
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

COPY . .
ENV LANG C.UTF-8

CMD ["gunicorn", "Blue_Lake.wsgi:application","-c","./gunicorn.conf.py"]

给不懂Dockerfile命令的同志讲解一下,Dockerfile一般有以下几个基础命令

  1. 基础镜像,以哪个镜像作为基础进行制作,用法是FROM基础镜像名称

  2. 维护者信息,需要写下该Dockerfile编写人的姓名和邮箱,用法是MIANTAINER

    名字/邮箱

  3. 镜像操作命令,对基础的镜像要进行的改造命令,比如安装新的软件,进行哪些特殊配置等,常见的是RUN命令

  4. 容器启动命令,当基于该镜像的容器启动时需要执行哪些命令,常见的是CMD命令或ENTRYPOINT命令

然后准备工作完成后,我们就可以进行打包了

docker build -t 项目名 .

第一次打包可能会比较慢,如果遇到网络问题,重复执行打包命令即可

还有一件事,重复执行打包命令,会产生空悬镜象,这个解决办法请自行百度,不过不占用我们的空间,不管他也没有事。

然后键入命令docker images 就可以在看到你的项目镜像了,如果想把这个打包好的项目导出,只需要执行

docker save -o 你要导出的文件名.tar 镜像名

这样你就可以把他装进U盘,随时带走,也可以进行docker push操作将其上传到dockerhub上。

然后启动项目

docker run --name 容器名 -d -p 8000:8000 镜像名

以前也写过一篇类似的攻略,不过当时有点懵懂,所以,我又再次写了一篇攻略,另外,还有一些细小的命令,比如挂载和复制出来。

docker cp 4570:/Project/你的项目/settings.py 宿主机地址/settings.py

这种场景主要是体现在我们需要修改某些配置的时候,我们需要知道的是,不同的项目打包完之后,项目目录并不是你所熟知的项目目录,就比如我这个django项目,打包完成之后,他的容器内部项目结构是这样的。

我们所熟知的项目,就在Project里。

然后修改,可以使用vim,也可以使用别的,这都无所谓了。修改完之后,怎么将这个给挂载回去呢,这时候,需要用到我们的-v命令。

docker run --name 你的镜像名 -d -p 8001:8000 -v /宿主机文件地址/settings.py:/Project/你的项目/settings.py 镜像名

docker的部署,就是这么简单,比一条条的输入命令要强的多了吧。