python 项目 以 docker 形式打包部署全流程
一、前言
在很久很久以前,我已经听过 Docker 的大名,当时服务着急上线虽然考虑过用 Docker 来部署我的服务,但是因为赶期的原因放弃了。
这两天因为华为云服务器到期,而且阿里云服务器优惠力度特别大的原因,我要把华为云服务器里的工程迁移到阿里云。
迁移的过程中,大量的时间精力浪费在了重装 python,加载依赖,迁移项目,配置端口等环境配置的工作上。
我在想,如果当时用了 Docker 部署,我至于受这气?
于是,一不做二不休,就花了点时间把部署以 docker 的形式部署了。
在部署前,我以为是一件多么苦难的事,结果,操作后才发现,原来最难的一步是跨出第一步。
二、docker 安装
还好,在之前我半途而废的过程中,我把经验已经积累下来了。
需要注意的是 Docker 桌面目前仅支持以下几个操作系统

我的服务器是 CentOS,所以这个桌面应该是用不了了,但是影响应该不大。因为 Docker 引擎目前支持绝大多数操作系统。

1. CentOS 安装 Docker 的先决条件
1.1 确认自己的系统版本
如果需要安装 Docker 引擎,需要的系统版本必须是 7、8、9 的版本。并且官方建议 Linux 内核为 3.10 及以上。

版本为 7.9,符合条件。

内核为 3.10。符合条件。
1.2 启用 centos-extras 存储库
官方说明,该存储库默认情况下处于启用状态,但是如果你之前禁用过它,则需要重新启用它。
可以看到,extras 存储库已启用

如果你之前不巧,使用过以下命令或者其他命令禁用过 extras 存储库:

enabled 为 1 表示正在启用,为 0 表示已被禁用。
在进行更改后,建议清除 YUM 缓存,以确保使用最新的仓库配置。
温馨提示,不要随便禁用库。
2. 卸载旧版本(如果之前安装过的话)

因为,我没安装过旧版 Docker,所以这里显示没有删除任何东西。
3. 选择安装方式
官方推荐通过设置 Docke 存储库的方式安装,便于安装和升级。
也可以在官方下载 RPM 包,手动安装,然后管理纯靠手动升级。适合安装在无法访问外网的内网系统上。
在测试和开发环境中,您可以使用自动化的便捷脚本来安装 Docker。
这边使用官方推荐的存储库安装。
4. 安装流程
4.1 设置仓库
首先需要安装一个工具包 yum-util,它提供了 yum-config-manager 功能:
这个是官网的中央仓库,国内速度会有一些慢。
国内的朋友推荐再加一个阿里云的镜像仓库,体验会好很多。
4.2 选择版本安装
官网给出了直接安装最新版本和安装指定版本的指令。
直接安装最新版本
需要一起安装 Docker Engine、containerd 和 Docker Compose
选择指定版本安装
首先列出所有版本

框住的就是版本号,选择指定版本,然后使用下面的命令进行安装。
<VERSION_STRING>部分换为指定版本号即可。
5. 启动运行 docker
启动 Docker。
通过运行映像来验证 Docker 引擎安装是否成功。hello-world

6. 卸载 Docker 引擎
卸载 Docker Engine、CLI、containerd 和 Docker Compose 包:
主机上的 image、containerd 或自定义配置文件不会自动删除,需要手动执行。
三、python 项目 Dockerfile 编写。
提前声明,Dockerfile 虽然看起来有点复杂,但是其实还是挺容易理清的。可以先参考下我这个工程的 Dockerfile,其实并不复杂。
1. 选择基础镜像
作用:指定基础镜像为 python:3.6。
注意事项:我这里是 python 项目,选择的是 python 的镜像,如果是 nginx 或者 java 项目,需要设置对应的景象。
2. 设置工作目录
作用:设置工作目录为 /app。
注意事项:这个目录的设置就见仁见智,有的喜欢用 project,有的喜欢什么都不设,看公司规范和个人习惯。我们只需要确保后续的文件操作都是基于这个工作目录的。
3. 复制项目文件到容器中
作用:将当前上下文中的所有文件和目录复制到镜像的 /app 目录下。这里直接用当前目录就行。
注意事项:可以使用 .dockerignore 文件排除不需要的文件和目录,以减少镜像大小。规则和 gitignore 一个路数。需要确保的是敏感文件(如密钥、密码等)不会被复制到镜像中。
4. 安装 tzdata(可选)
作用:安装 tzdata 以确保时区设置能够正确工作。(可选)
注意事项:如果基础镜像已经包含 tzdata,则可以省略此步骤。
5. 设置容器时区
作用:设置容器的时区为东八区(中国标准时间)。这个是 docker 老生常谈的问题,他的时区需要自己更正。
注意事项:确保应用或服务需要这个特定的时区设置。国内的一般应该都需要,不然打个日志都不确定是啥时候的了。
6. 安装 Python 依赖
作用:下载需要的第三方库。
注意事项:这个 requirements.txt,直接用 pipreqs 生成就行。需要注意的是要挂个国内的 PyPI 镜像来安装 Python 依赖,不然依赖下载太慢了。我这里是使用清华大学的镜像。
7. 暴露端口
作用:声明容器在运行时应该监听 7010 端口。
注意事项:没啥需要注意的,自己设置需要的端口就行。
8. 设置容器启动时运行的命令
作用:设置容器启动时默认执行的命令。
注意事项:根据个人需要设置就行。如果你的应用需要特定的环境变量或配置,可以在 CMD 之前使用 ENV 指令来设置它们。
四、docker 镜像打包
编写完 dockerfile,我们一般喜欢放在需要打包的地方的根路径,然后直接运行
pythondemo 改成自己想要的镜像的名字。
运行之后,docker 会自动完成 dockerfile 里面的每一个步骤。打包完成后,我们就可以看到 images。
大家直接 docker images 即可看到。

如果要重新打包,需要先删除原来的镜像,执行以下命令即可。
操作如下:

五、根据镜像启动容器
根据镜像创建容器执行以下命令
我这里端口都是 7010,你们根据需要自行配置。
然后用 docker ps 就能看到执行的容器了。

如果想看项目日志,可以执行以下命令进入 docker 查看。
退出时使用 ctrl + D 退出
docker 容器相关常用命令
1. 停止容器
停止一个或多个正在运行的容器。
2. 重启容器
重启一个或多个容器。
3. 删除容器
删除一个或多个容器。参数-f:强制删除容器,即使容器正在运行。
4. 导出/导入容器
将容器导出为 tar 文件;从 tar 文件导入容器为镜像
作者:DaveCui
链接:https://juejin.cn/post/7380222254196277260
评论