likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 34

一、前言

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

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

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

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

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

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

二、docker安装

还好,在之前我半途而费的过程中,我把经验已经积累下来了。按照以下文档操作就能安装docker工具了。

三、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 即可看到。

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

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

    docker rmi a9765c2d0703(镜像id)

操作如下: python项目 以docker形式打包部署全流程

五、根据镜像启动容器

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

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

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

    docker run  -d -p 7010:7010 opendrop

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

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

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

docker exec -it 3843cbd6fb40(容器id) /bin/bash
python项目 以docker形式打包部署全流程
  • 退出时使用 ctrl + D 退出

docker 容器相关常用命令

  1. 停止容器
    docker stop 【容器id】
  • 停止一个或多个正在运行的容器。
  1. 重启容器
    docker restart 【容器id】
  • 重启一个或多个容器。
  1. 删除容器
    docker rm 【容器id】
  • 删除一个或多个容器。参数-f:强制删除容器,即使容器正在运行。
  1. 导出/导入容器
    docker export 【容器id】 > file.tar
    docker import file.tar 【镜像名字】
  • 将容器导出为tar文件;从tar文件导入容器为镜像

参考文档

什么是Docker?看这一篇干货文章就够了! - 知乎 (zhihu.com)

使用docker部署项目到linux(超详细)_docker部署linux_jsxllht的博客-CSDN博客

如何用Docker打包部署自己写的项目?-腾讯云开发者社区-腾讯云 (tencent.com)

python项目打包主要参考

如何用docker部署一个开源的项目 - 知乎 (zhihu.com)

【Docker】从零开始将自己的应用打包到docker镜像-腾讯云开发者社区-腾讯云 (tencent.com)

【Dockerfile】将自己的项目构建成镜像部署运行-腾讯云开发者社区-腾讯云 (tencent.com)

转载自:https://juejin.cn/post/7380222254196277260
评论
请登录