把python项目部署在docker上
前提,已经安装好docker了,docker的安装,请见另一篇博客
介绍一下需要运行的python项目结构,平时在pycharm里面只需要运行app.py文件即可
项目步骤如下:
1:创建一个上传到Centos系统的文件夹(名字随意)
docker_svnhook是要上传到Linux系统,生成Dokcer镜像的文件夹
这个文件夹下面有两个文件
一个是Dockerfile文件(没有后缀名)
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。有了 Dockerfile,就可以创建我们所需要的镜像
内容如下
# 使用官方的 Python 3.9 作为基础镜像 FROM python:3.9-slim # 设置工作目录 WORKDIR /code # 将 requirements.txt 复制到容器中 COPY /svnhook/requirements.txt . # 安装依赖项 --no-cache-dir(代表了不适用缓存的依赖,会重新下载依赖,耗时较久,但是镜像体积会较小)
RUN pip install --no-cache-dir -r requirements.txt # 将应用程序代码复制到容器中 COPY . . # 暴露应用程序运行的端口 EXPOSE 5000 # 运行 Flask 应用程序 CMD ["python", "/code/svnhook/package/app.py"]
需要注意的是,如果工作目录设定好了以后,需要在CMD启动程序填入完成的路径,不然会报路径错误
一个svnhook文件夹(名字随意),包含了工程的代码,还有运行工程所需要的环境列表
package就是python项目的源码所在目录,直接复制过来
requirements.txt就是我们的依赖,生成方法如下
cmd命令进入工程目录,执行pip freeze > requirements.txt
会在该目录下生成一个requirements.txt文件,会把我们整个环境中的包都列出来,我们自己也可以看看多了那些事不需要的包,或者缺了那些,用以下的格式补进去就可以了
2:上传到linux环境,生成镜像
2.1:用ftp把文件上传到虚拟机系统的某个路劲,如果文件太大了,可以压缩后再上传
可以先在虚拟机创建一个文件夹
mkdir svnhoos
2.2进入docker_svnhooks文件夹
2.3:创建镜像
执行命令:
docker build -t svnhooks_img .
svnhooks_img 为创建的镜像名称,. 表示当前目录(docker_svnhooks)
出现下面的就是在building中,等待时间看你requirements中的依赖多不多和网络
2.4:查看镜像是否创建成功
docker images
看到刚刚创建的svnhook_img的镜像,已经存在了
3:运行镜像,生成并启动容器
执行命令
docker run -it -p 5000:5000 --name svnhook svnhooks_img
-it:表示交互式终端的容器,非启动后立刻结束的容器,初始调试可以用这个,可以看到控制台输出内容,只是部署的话用 -d 后台运行 -p
5000:5000:表示将docker的5000端口,映射到Linux虚拟机的5000端口
也就是说,访问Linux虚拟机的5000端口,就是在访问docker容器的5000端口,这里因为我的工程暴露的端口是5000,所以我设的是5000
--name svnhook:给容器取个名字,嫌麻烦可以省去
svnhooks_img:容器是用哪个镜像启动的(一个容器,必须依赖一个镜像启动)
如果想要docker重启的时候容器跟着重启,可以加上 --restart
参数
docker run -d -p 5000:5000 --name svnhook --restart unless-stopped svnhooks_img
常用的重启策略
no
:默认值,容器不会自动重启。always
:无论容器退出状态如何,容器都会自动重启。unless-stopped
:容器会在 Docker 服务启动时自动重启,但如果容器是手动停止的,它不会在 Docker 重启时重新启动。on-failure[:max-retries]
:只有当容器以非零状态码退出时,才会重启,可以选择性指定最大重试次数。
现在访问系统,只需要访问虚拟机的IP加端口即可
4:代码有改动需要重新部署
只需要把容器停止删除了,再重新build一次镜像然后启动容器
5:删除容器
5.1:先停止容器 ,用 docker ps 查看正在运行的容器
然后使用docker stop container id,就可以停止容器
5.2:删除容器
docker rm container id
5.3:重新构建镜像
docker build -t svnhooks_img .
5.4:重新运行容器,这次试用-d,后台运行
docker run -d -p 5000:5000 --name svnhook svnhooks_img
5.5:停止了容器后其实不需要删除镜像,可以直接再执行build指令
docker build -t svnhooks_img .
这样可以节约很多重新下载依赖的时间
5.6:写了一个shell脚本来一键操作,如果依赖有改变就需要重新删除镜像
#!/bin/bash # 容器名称或ID CONTAINER_NAME="svnhook" IMAGE_NAME="svnhooks_img" # 停止容器 docker stop $CONTAINER_NAME # 删除容器 docker rm $CONTAINER_NAME #echo "容器 $CONTAINER_NAME 已停止并删除。" #重新构建镜像 docker build -t $IMAGE_NAME . echo "镜像$IMAGE_NAME已构建" #重新运行容器 docker run -d -p 5000:5000 --name $CONTAINER_NAME $IMAGE_NAME echo "容器$CONTAINER_NAME已启动"
6:删除镜像(有需要的话)
6.1:像上面一样,先停止容器,再删除容器然后再删除镜像
先查看镜像 docker iamges
找到要删除的镜像后,执行:docker rmi image id
如果您希望强制删除镜像并且不想手动删除相关容器,可以使用 -f
选项:
docker rmi -f <image_name_or_id>
这样会强制删除镜像及所有依赖它的容器。请谨慎使用。
本篇文章有参考以下文章