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

简介: 在很久很久以前,我已经听过Docker的大名,当时服务着急上线虽然考虑过用Docker来部署我的服务,但是因为赶期的原因放弃了。这两天因为华为云服务器到期,而且阿里云服务器优惠力度特别大的原因,我要把华为云服务器里的工程迁移到阿里云。迁移的过程中,大量的时间精力浪费在了重装python,加载依赖,迁移项目,配置端口等环境配置的工作上。我在想,如果当时用了Docker部署,我至于受这气?

一、前言

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


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


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


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


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


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

二、docker安装

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


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

1718434452751.jpg

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

1718434536305.jpg

1. CentOS安装Docker的先决条件

1.1 确认自己的系统版本

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

lsb_release -a

1718434602071.jpg

版本为7.9,符合条件。

uname -r

1718434617058.jpg

内核为3.10。符合条件。

1.2 启用centos-extras存储库

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

yum repolist enabled

1718434841051.jpg

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

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

sudo vi /etc/yum.repos.d/CentOS-Base.repo

1718434863114.jpg

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

1718434946258.jpg

因为,我没安装过旧版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

1718435033473.jpg

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

1718435081332.jpg

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

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

1718435130885.jpg

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/docker
sudo 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 即可看到。

1718435543041.jpg

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

docker rmi a9765c2d0703(镜像id)

操作如下:

1718435593595.jpg

五、根据镜像启动容器

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

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

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

docker run  -d -p 7010:7010 opendrop

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

1718435642972.jpg

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

docker exec -it 3843cbd6fb40(容器id) /bin/bash

1718435680362.jpg

  • 退出时使用 ctrl + D 退出

docker 容器相关常用命令

1. 停止容器

docker stop 【容器id】
  • 停止一个或多个正在运行的容器。

2. 重启容器

docker restart 【容器id】
  • 重启一个或多个容器。

3. 删除容器

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

4. 导出/导入容器

docker export 【容器id】 > file.tar
docker import file.tar 【镜像名字】
  • 将容器导出为tar文件;从tar文件导入容器为镜像
相关文章
|
9天前
|
数据采集 存储 Docker
深入理解Docker:为你的爬虫项目提供隔离环境
本教程介绍如何使用Docker构建隔离环境,运行Python爬虫项目,采集小红书视频页面的简介和评论。主要内容包括: 1. **Docker隔离环境**:通过Docker容器化爬虫,确保环境独立、易于部署。 2. **代理IP技术**:利用亿牛云爬虫代理突破反爬限制。 3. **Cookie与User-Agent设置**:伪装请求头,模拟真实用户访问。 4. **多线程采集**:提高数据采集效率。 前置知识要求:Python基础、Docker基本操作及HTML解析(可选)。教程还涵盖常见错误解决方法和延伸练习,帮助你优化爬虫代码并避免陷阱。
深入理解Docker:为你的爬虫项目提供隔离环境
|
3天前
|
消息中间件 监控 RocketMQ
Docker部署RocketMQ5.2.0集群
本文详细介绍了如何使用Docker和Docker Compose部署RocketMQ 5.2.0集群。通过创建配置文件、启动集群和验证容器状态,您可以快速搭建起一个RocketMQ集群环境。希望本文能够帮助您更好地理解和应用RocketMQ,提高消息中间件的部署和管理效率。
141 91
|
4天前
|
存储 NoSQL Redis
Docker 部署 Redis
在使用 Docker 部署 Redis 时,为实现数据持久化,需正确挂载容器内的数据目录到宿主机。推荐命令如下: ``` docker run -d --name redis -v /mnt/data/redis:/data -p 6379:6379 redis ``` 该命令将宿主机的 `/mnt/data/redis` 目录挂载到容器的 `/data` 目录,确保 Redis 数据持久化。此路径更通用,适合大多数场景。避免使用不匹配的挂载路径,如 `/var/lib/redis` 或 `/mnt/data/redis` 到非默认目录,以防止数据无法正确持久化。
|
19天前
|
存储 关系型数据库 MySQL
美团面试:MySQL为什么 不用 Docker部署?
45岁老架构师尼恩在读者交流群中分享了关于“MySQL为什么不推荐使用Docker部署”的深入分析。通过系统化的梳理,尼恩帮助读者理解为何大型MySQL数据库通常不使用Docker部署,主要涉及性能、管理复杂度和稳定性等方面的考量。文章详细解释了有状态容器的特点、Docker的资源隔离问题以及磁盘IO性能损耗,并提供了小型MySQL使用Docker的最佳实践。此外,尼恩还介绍了Share Nothing架构的优势及其应用场景,强调了配置管理和数据持久化的挑战。最后,尼恩建议读者参考《尼恩Java面试宝典PDF》以提升技术能力,更好地应对面试中的难题。
|
11天前
|
JavaScript 前端开发 Docker
如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
通过这些步骤,可以确保您的Next.js应用在多核服务器上高效运行,并且在Docker环境中实现高效的容器化管理。
71 44
|
23天前
|
SQL Java Maven
docker部署apollo
docker部署apollo步骤
|
1月前
|
数据库 Docker 容器
docker容器为啥会开机自启动
通过配置适当的重启策略,Docker容器可以在主机系统重启后自动启动。这对于保持关键服务的高可用性和自动恢复能力非常有用。选择适合的重启策略(如 `always`或 `unless-stopped`),可以确保应用程序在各种情况下保持运行。理解并配置这些策略是确保Docker容器化应用可靠性的关键。
223 93
|
4天前
|
网络协议 API Docker
Docker+consul容器服务的更新与发现
通过本文的介绍,我们详细探讨了如何结合Docker和Consul来实现容器服务的更新与发现。通过Consul的服务注册和发现功能,可以高效地管理和监控容器化服务,确保系统的高可用性和可扩展性。希望本文能帮助您在实际项目中更好地应用Docker和Consul,提高系统的可靠性和管理效率。
36 23
|
4天前
|
Ubuntu API 网络虚拟化
ubuntu22 编译安装docker,和docker容器方式安装 deepseek
本脚本适用于Ubuntu 22.04,主要功能包括编译安装Docker和安装DeepSeek模型。首先通过Apt源配置安装Docker,确保网络稳定(建议使用VPN)。接着下载并配置Docker二进制文件,创建Docker用户组并设置守护进程。随后拉取Debian 12镜像,安装系统必备工具,配置Ollama模型管理器,并最终部署和运行DeepSeek模型,提供API接口进行交互测试。
90 15
|
2月前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
296 78

热门文章

最新文章