写点什么

python 项目 以 docker 形式打包部署全流程

  • 2024-06-15
    湖南
  • 本文字数:3497 字

    阅读完需:约 11 分钟

一、前言

在很久很久以前,我已经听过 Docker 的大名,当时服务着急上线虽然考虑过用 Docker 来部署我的服务,但是因为赶期的原因放弃了。


这两天因为华为云服务器到期,而且阿里云服务器优惠力度特别大的原因,我要把华为云服务器里的工程迁移到阿里云。


迁移的过程中,大量的时间精力浪费在了重装 python,加载依赖,迁移项目,配置端口等环境配置的工作上。


我在想,如果当时用了 Docker 部署,我至于受这气?


于是,一不做二不休,就花了点时间把部署以 docker 的形式部署了。


在部署前,我以为是一件多么苦难的事,结果,操作后才发现,原来最难的一步是跨出第一步。

二、docker 安装

还好,在之前我半途而废的过程中,我把经验已经积累下来了。


需要注意的是 Docker 桌面目前仅支持以下几个操作系统

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

1. CentOS 安装 Docker 的先决条件

1.1 确认自己的系统版本

如果需要安装 Docker 引擎,需要的系统版本必须是 7、8、9 的版本。并且官方建议 Linux 内核为 3.10 及以上。

lsb_release -a
复制代码


版本为 7.9,符合条件。

uname -r
复制代码


内核为 3.10。符合条件。

1.2 启用 centos-extras 存储库

官方说明,该存储库默认情况下处于启用状态,但是如果你之前禁用过它,则需要重新启用它。

yum repolist enabled
复制代码

可以看到,extras 存储库已启用

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

sudo vi /etc/yum.repos.d/CentOS-Base.repo
复制代码


enabled 为 1 表示正在启用,为 0 表示已被禁用。


在进行更改后,建议清除 YUM 缓存,以确保使用最新的仓库配置。

sudo yum clean all
复制代码

温馨提示,不要随便禁用库。

2. 卸载旧版本(如果之前安装过的话)

sudo yum remove docker \                  docker-client \                  docker-client-latest \                  docker-common \                  docker-latest \                  docker-latest-logrotate \                  docker-logrotate \                  docker-engine
复制代码


因为,我没安装过旧版 Docker,所以这里显示没有删除任何东西。

3. 选择安装方式

  1. 官方推荐通过设置 Docke 存储库的方式安装,便于安装和升级。

  2. 也可以在官方下载 RPM 包,手动安装,然后管理纯靠手动升级。适合安装在无法访问外网的内网系统上。

  3. 在测试和开发环境中,您可以使用自动化的便捷脚本来安装 Docker。


这边使用官方推荐的存储库安装。

4. 安装流程

4.1 设置仓库

首先需要安装一个工具包 yum-util,它提供了 yum-config-manager 功能:

sudo yum install -y yum-utils
复制代码

这个是官网的中央仓库,国内速度会有一些慢。

sudo yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo
复制代码

国内的朋友推荐再加一个阿里云的镜像仓库,体验会好很多。

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
复制代码
4.2 选择版本安装

官网给出了直接安装最新版本和安装指定版本的指令。

  1. 直接安装最新版本

需要一起安装 Docker Engine、containerd 和 Docker Compose

sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
复制代码
  1. 选择指定版本安装

首先列出所有版本

yum list docker-ce --showduplicates | sort -r
复制代码


框住的就是版本号,选择指定版本,然后使用下面的命令进行安装。

sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io docker-buildx-plugin docker-compose-plugin
复制代码

<VERSION_STRING>部分换为指定版本号即可。

5. 启动运行 docker
  1. 启动 Docker。

sudo systemctl start docker
复制代码
  1. 通过运行映像来验证 Docker 引擎安装是否成功。hello-world

sudo docker run hello-world
复制代码


6. 卸载 Docker 引擎
  1. 卸载 Docker Engine、CLI、containerd 和 Docker Compose 包:

sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
复制代码
  1. 主机上的 image、containerd 或自定义配置文件不会自动删除,需要手动执行。

sudo rm -rf /var/lib/dockersudo rm -rf /var/lib/containerd
复制代码

三、python 项目 Dockerfile 编写。

提前声明,Dockerfile 虽然看起来有点复杂,但是其实还是挺容易理清的。可以先参考下我这个工程的 Dockerfile,其实并不复杂。

FROM python:3.6
# 设置工作目录WORKDIR /app
# 复制项目文件到容器中COPY . /app
# 如果你的镜像中没有 tzdata,则需要安装它# 注意:python:3.6 官方镜像可能已包含 tzdata# RUN apt-get update && apt-get install -y tzdata && rm -rf /var/lib/apt/lists/*
# 设置时区为东八区(中国标准时间)RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone
# 安装依赖RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
# 暴露端口EXPOSE 7010
# 设置容器启动时运行的命令CMD ["python3", "api.py"]
复制代码

1. 选择基础镜像

FROM python:3.6
复制代码
  • 作用:指定基础镜像为 python:3.6。

  • 注意事项:我这里是 python 项目,选择的是 python 的镜像,如果是 nginx 或者 java 项目,需要设置对应的景象。

2. 设置工作目录

WORKDIR /app
复制代码
  • 作用:设置工作目录为 /app。

  • 注意事项:这个目录的设置就见仁见智,有的喜欢用 project,有的喜欢什么都不设,看公司规范和个人习惯。我们只需要确保后续的文件操作都是基于这个工作目录的。

3. 复制项目文件到容器中

COPY . /app
复制代码
  • 作用:将当前上下文中的所有文件和目录复制到镜像的 /app 目录下。这里直接用当前目录就行。

  • 注意事项:可以使用 .dockerignore 文件排除不需要的文件和目录,以减少镜像大小。规则和 gitignore 一个路数。需要确保的是敏感文件(如密钥、密码等)不会被复制到镜像中。

4. 安装 tzdata(可选)

# RUN apt-get update && apt-get install -y tzdata && rm -rf /var/lib/apt/lists/*
复制代码
  • 作用:安装 tzdata 以确保时区设置能够正确工作。(可选)

  • 注意事项:如果基础镜像已经包含 tzdata,则可以省略此步骤。

5. 设置容器时区

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone
复制代码
  • 作用:设置容器的时区为东八区(中国标准时间)。这个是 docker 老生常谈的问题,他的时区需要自己更正。

  • 注意事项:确保应用或服务需要这个特定的时区设置。国内的一般应该都需要,不然打个日志都不确定是啥时候的了。

6. 安装 Python 依赖

RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
复制代码
  • 作用:下载需要的第三方库。

  • 注意事项:这个 requirements.txt,直接用 pipreqs 生成就行。需要注意的是要挂个国内的 PyPI 镜像来安装 Python 依赖,不然依赖下载太慢了。我这里是使用清华大学的镜像。

7. 暴露端口

EXPOSE 7010
复制代码
  • 作用:声明容器在运行时应该监听 7010 端口。

  • 注意事项:没啥需要注意的,自己设置需要的端口就行。

8. 设置容器启动时运行的命令

CMD ["python3", "api.py"]
复制代码
  • 作用:设置容器启动时默认执行的命令。

  • 注意事项:根据个人需要设置就行。如果你的应用需要特定的环境变量或配置,可以在 CMD 之前使用 ENV 指令来设置它们。

四、docker 镜像打包

编写完 dockerfile,我们一般喜欢放在需要打包的地方的根路径,然后直接运行

docker build -t opendrop .
复制代码
  • pythondemo 改成自己想要的镜像的名字。


运行之后,docker 会自动完成 dockerfile 里面的每一个步骤。打包完成后,我们就可以看到 images。


大家直接 docker images 即可看到。

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

docker rmi a9765c2d0703(镜像id)
复制代码

操作如下:

五、根据镜像启动容器

根据镜像创建容器执行以下命令

docker run -d -p 要映射的本机端口:docker中项目运行的端口 镜像名称
复制代码

我这里端口都是 7010,你们根据需要自行配置。

docker run  -d -p 7010:7010 opendrop
复制代码

然后用 docker ps 就能看到执行的容器了。

如果想看项目日志,可以执行以下命令进入 docker 查看。

docker exec -it 3843cbd6fb40(容器id) /bin/bash
复制代码

退出时使用 ctrl + D 退出

docker 容器相关常用命令

1. 停止容器
docker stop 【容器id】
复制代码
  • 停止一个或多个正在运行的容器。

2. 重启容器
docker restart 【容器id】
复制代码
  • 重启一个或多个容器。

3. 删除容器
docker rm 【容器id】
复制代码
  • 删除一个或多个容器。参数-f:强制删除容器,即使容器正在运行。

4. 导出/导入容器
docker export 【容器id】 > file.tardocker import file.tar 【镜像名字】
复制代码
  • 将容器导出为 tar 文件;从 tar 文件导入容器为镜像

作者:DaveCui

链接:https://juejin.cn/post/7380222254196277260

用户头像

欢迎关注,一起学习,一起交流,一起进步 2020-06-14 加入

公众号:做梦都在改BUG

评论

发布
暂无评论
python项目 以docker形式打包部署全流程_Python_我再BUG界嘎嘎乱杀_InfoQ写作社区