把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>

 这样会强制删除镜像及所有依赖它的容器。请谨慎使用。

 

 

本篇文章有参考以下文章

posted @ 2024-09-04 11:54  Hiro-D  阅读(293)  评论(0编辑  收藏  举报