基于docker进行任意项目灵活发布
引言
不管是java还是python程序等,使用docker发布的优势有以下几点:
- 易于维护。直接docker命令进行管理,如docker stop、docker start等,快速方便无需各种进程查询关闭。
- 环境隔离。项目代码任何依赖或设置都可以基本独立,不会因为共用发布服务器软件环境,而导致相互之间有影响。
- 配套程序安装简单。当需要配置mysql或nginx时,省去了配置环境下载软件等步骤,直接借助别人的image镜像,docker run一步到位。
- 更新方便。根据容器映射的地址,直接把项目代码进行替换即可,简单方便。
正文
1. 公共部分:通用镜像准备
在进行项目发布之前,首先需要准备一个通用的基础镜像。这个基础镜像将作为所有项目的起点,包含项目运行所需的基本环境。通过构建一个通用的基础镜像,可以避免在每个项目中重复配置环境,从而提高发布效率。
1.1 拉取基础镜像
在构建基础镜像之前,首先需要从Docker Hub或其他镜像仓库中拉取一个基础镜像。这里以Python 3.10为例,拉取基础镜像的命令如下:
docker pull python:3.10
1.2 Dockerfile文件内容
Dockerfile是用于构建Docker镜像的脚本文件。通过编写Dockerfile,可以定义镜像的构建过程,包括基础镜像的选择、环境变量的设置、依赖项的安装等。以下是一个通用的Dockerfile示例:
FROM python:3.10# 设置工作目录
WORKDIR /project# 清空容器内目录
RUN rm -rf /project# 设置时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone# 根据公共需求,预装环境
RUN pip config set global.index-url https://mirrors.aliyun.com/pypi/simple && pip install --upgrade pip# docker start时,要执行的命令。
CMD bash /project/docker_start.sh
文件内容解释
- FROM python:3.10: 指定基础镜像为Python 3.10。
- WORKDIR /project: 设置容器内的工作目录为
/project
。 - RUN rm -rf /project: 清空容器内的
/project
目录,确保目录为空。 - RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo “Asia/Shanghai” > /etc/timezone: 设置容器的时区为上海。
- RUN pip config set global.index-url https://mirrors.aliyun.com/pypi/simple && pip install --upgrade pip: 配置pip的镜像源为阿里云,并升级pip。
- CMD bash /project/docker_start.sh: 指定容器启动时执行的命令,即运行
/project/docker_start.sh
脚本。
1.3 构建镜像
在编写好Dockerfile之后,可以通过以下命令构建镜像。假设将镜像命名为python_project:v1
:
# 注意最后一个点符号,表示当前目录下的Dockerfile文件。
docker build -t python_project:v1 .
2. 项目部分:执行脚本
在构建好基础镜像之后,接下来需要为每个项目编写启动脚本。启动脚本将负责安装项目的依赖项、设置环境变量,并启动项目。
2.1 编写启动脚本
启动脚本通常命名为docker_start.sh
,并放置在项目的根目录中。以下是一个Python项目的启动脚本示例:
#!/bin/sh# 项目中默认执行目录为/project
# pipreqs ./
# docker run -d --name chatvl -p 8122:8122 -v /data/extdocker/project/ChatVL-v1/:/project/ python_project:v1pip install torch==2.2.2 --find-links https://download.pytorch.org/whl/cpu
pip install -r /project/requirements.txt
export PYTHONPATH=$PYTHONPATH:/project/
python /project/web_service/run_chat.py
脚本内容解释
- pip install torch==2.2.2 --find-links https://download.pytorch.org/whl/cpu: 安装特定版本的PyTorch库。
- pip install -r /project/requirements.txt: 根据
requirements.txt
文件安装项目的依赖项。 - export PYTHONPATH=$PYTHONPATH:/project/: 设置
PYTHONPATH
环境变量,确保项目代码可以被正确导入。 - python /project/web_service/run_chat.py: 启动项目的Web服务。
项目目录概览图
2.2 启动容器
在编写好启动脚本之后,可以通过以下命令启动容器:
docker run -d --name chatvl -p 8122:8122 -v /data/extdocker/project/ChatVL-v1/:/project/ python_project:v1
命令解释
- -d: 以守护进程方式运行容器。
- –name chatvl: 指定容器的名称为
chatvl
。 - -p 8122:8122: 将宿主机的8122端口映射到容器的8122端口。
- -v /data/extdocker/project/ChatVL-v1/:/project/: 将宿主机的
/data/extdocker/project/ChatVL-v1/
目录挂载到容器的/project/
目录。 - python_project:v1: 指定使用的镜像为
python_project:v1
。
3. 项目执行
在启动容器之后,项目将在容器内运行。为了确保项目正常运行,需要进行一些必要的检查和配置。
3.1 容器内的工作目录
在Dockerfile中,已经将容器内的工作目录设置为/project
。因此,宿主机上的项目目录需要通过-v
参数挂载到容器的/project
目录中。同时,还需要通过-p
参数将宿主机的端口映射到容器的端口,以便外部访问。
3.2 查看执行日志
在项目运行过程中,可以通过查看容器的日志来监控项目的运行状态。以下是查看日志的命令:
docker logs -f -n 100 chatvl
命令解释
- -f: 持续查看日志,类似于
tail -f
命令。 - -n 100: 显示最新的100行日志。
- chatvl: 指定要查看日志的容器名称。
- 示例截图如下:
[以下为扩展内容]
4. Docker的高级应用(扩展内容)
4.1 Docker Compose
在实际项目中,往往需要同时运行多个容器,如Web服务器、数据库、缓存服务等。为了简化多容器管理,可以使用Docker Compose。Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。通过编写docker-compose.yml
文件,可以定义多个服务的配置,并一键启动所有服务。
以下是一个简单的docker-compose.yml
示例:
version: '3'
services:web:image: python_project:v1ports:- "8122:8122"volumes:- /data/extdocker/project/ChatVL-v1/:/project/command: bash /project/docker_start.shdb:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: examplevolumes:- db_data:/var/lib/mysqlvolumes:db_data:
文件内容解释
- version: ‘3’: 指定Docker Compose文件的版本。
- services: 定义多个服务。
- web: 定义Web服务,使用
python_project:v1
镜像。- ports: 将宿主机的8122端口映射到容器的8122端口。
- volumes: 将宿主机的
/data/extdocker/project/ChatVL-v1/
目录挂载到容器的/project/
目录。 - command: 指定容器启动时执行的命令。
- db: 定义数据库服务,使用
mysql:5.7
镜像。- environment: 设置环境变量,如数据库的root密码。
- volumes: 将数据库数据挂载到宿主机的
db_data
卷。
- web: 定义Web服务,使用
- volumes: 定义卷,用于持久化存储数据。
4.2 Docker Swarm
在生产环境中,往往需要将多个Docker主机组成一个集群,以实现高可用性和负载均衡。Docker Swarm是Docker官方提供的集群管理工具,可以将多个Docker主机组成一个Swarm集群,并通过Swarm管理器进行统一管理。
以下是使用Docker Swarm的基本步骤:
-
初始化Swarm:
docker swarm init
-
加入Swarm:
docker swarm join --token <token> <manager-ip>:<port>
-
部署服务:
docker service create --name chatvl --replicas 3 -p 8122:8122 python_project:v1
命令解释
- docker swarm init: 初始化Swarm集群。
- docker swarm join --token :: 将其他Docker主机加入Swarm集群。
- docker service create --name chatvl --replicas 3 -p 8122:8122 python_project:v1: 在Swarm集群中部署服务,指定服务名称为
chatvl
,副本数为3,端口映射为8122。
4.3 Kubernetes
虽然Docker Swarm是一个轻量级的集群管理工具,但在大规模生产环境中,往往需要更强大的集群管理工具。Kubernetes(简称K8s)是一个开源的容器编排平台,可以自动化部署、扩展和管理容器化应用程序。
以下是使用Kubernetes的基本步骤:
-
安装Kubernetes:
kubeadm init
-
部署应用:
kubectl create deployment chatvl --image=python_project:v1
-
暴露服务:
kubectl expose deployment chatvl --port=8122 --type=LoadBalancer
命令解释
- kubeadm init: 初始化Kubernetes集群。
- kubectl create deployment chatvl --image=python_project:v1: 创建一个名为
chatvl
的部署,使用python_project:v1
镜像。 - kubectl expose deployment chatvl --port=8122 --type=LoadBalancer: 将部署暴露为服务,端口为8122,类型为LoadBalancer。
5. Docker的最佳实践(扩展内容)
5.1 镜像优化
在构建Docker镜像时,应尽量优化镜像的大小,以减少存储和传输的开销。以下是一些镜像优化的最佳实践:
- 使用多阶段构建: 通过多阶段构建,可以在构建过程中使用多个基础镜像,从而减少最终镜像的大小。
- 最小化镜像层数: 尽量减少镜像的层数,避免不必要的文件复制和安装。
- 使用轻量级基础镜像: 选择轻量级的基础镜像,如Alpine Linux,以减少镜像的大小。
5.2 容器安全
容器安全是Docker应用中的一个重要问题。以下是一些容器安全的最佳实践:
- 使用非root用户: 在容器中使用非root用户运行应用程序,以减少安全风险。
- 限制资源使用: 通过Docker的资源限制功能,限制容器的CPU、内存等资源使用,防止容器占用过多资源。
- 定期更新镜像: 定期更新基础镜像和应用程序依赖项,以修复已知的安全漏洞。
5.3 日志管理
在生产环境中,日志管理是一个重要的问题。以下是一些日志管理的最佳实践:
- 集中化日志收集: 使用集中化的日志收集工具,如ELK(Elasticsearch、Logstash、Kibana),将所有容器的日志集中收集和管理。
- 日志轮转: 配置日志轮转,避免日志文件过大,占用过多磁盘空间。
- 日志监控: 通过日志监控工具,实时监控容器的运行状态,及时发现和处理异常情况。
6. 总结
通过本文的介绍,我们可以看到Docker在项目发布中的巨大优势。Docker不仅简化了环境配置和依赖管理,还提供了强大的环境隔离和快速部署能力。通过Docker,开发者可以轻松地将应用程序打包到一个独立的容器中,实现跨平台、跨环境的快速部署。
在实际应用中,Docker还可以与Docker Compose、Docker Swarm、Kubernetes等工具结合使用,进一步提高项目的可维护性和可扩展性。通过遵循一些最佳实践,如镜像优化、容器安全和日志管理,可以确保Docker应用在生产环境中的稳定性和安全性。
总之,Docker作为一种现代化的项目发布工具,已经在越来越多的项目中得到了广泛应用。通过学习和掌握Docker,开发者可以大大提高项目发布的效率和质量,从而更好地应对日益复杂的软件开发挑战。
相关文章:

基于docker进行任意项目灵活发布
引言 不管是java还是python程序等,使用docker发布的优势有以下几点: 易于维护。直接docker命令进行管理,如docker stop、docker start等,快速方便无需各种进程查询关闭。环境隔离。项目代码任何依赖或设置都可以基本独立&#x…...

Datatables:监听行内文本框,进行行内数据修改;计算行总和
一、监听行内文本框,进行行内数据修改 效果 修改数量、单价会自动计算金额(金额数量*单价) 实现 1、增加行的class 2、数据监听、修改数值 "initComplete": function() {// 监听数量和单价输入框的变化$(document).on(input, .…...

对于某些原型或UI软件的个人看法(2024/11)
由于我这几天,一边敲代码,一边进行页面布局设计与编码,发现可能就一个卡片,我都得调很久样式,觉得这样改很累也没效率,页面也不是很美观。所以我想到了ui设计,我可以先进行ui设计,然…...

嵌入式硬件实战提升篇(二)PCB高速板设计 FPGA核心板带DDR3 PCB设计DDR全面解析
引言:设计一款高速板,供读者学习,FPGA核心板,带一颗DDR3内存,FPGA型号:XC6SLX16-2FTG256C。 随着嵌入式硬件技术的快速发展,高速板设计逐渐成为嵌入式系统设计中的核心技术之一。高速板的设计要…...

亚信安全携手飞书“走近先进” 与保隆科技探索制造业数字化转型
亚信安全携手飞书组织举办“走近先进”活动。近日活动“走近”了中国汽车供应链百强、上海市制造业五十强企业——上海保隆汽车科技股份有限公司(以下简称“保隆科技”)。活动围绕“突破桎梏 加速升级”的主题,聚焦企业数字化转型的核心议题&…...

【C++篇】排队的艺术:用生活场景讲解优先级队列的实现
文章目录 须知 💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力! 👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗࿱…...

VTK的基本概念(一)
文章目录 三维场景的基本要素1.灯光2.相机3.颜色4.纹理映射 三维场景的基本要素 1.灯光 在三维渲染场景中,可以有多个灯光的存在,灯光和相机是三维渲染场景的必备要素,如果没有指定的话,vtkRenderer会自动创建默认的灯光和相机。…...

error LNK2001: 无法解析的外部符号 memcpy strcmp strlen
0>LIBMY_static.lib(pixdesc.obj) : error LNK2001: 无法解析的外部符号 __imp_abort 10>LIBMY_static.lib(random_seed.obj) : error LNK2001: 无法解析的外部符号 __imp_abort 10>postprocess.obj : error LNK2001: 无法解析的外部符号 __imp_abort 10>LIBMY_sta…...

打造智能扩容新纪元:Kubernetes Custom Metrics深度解析
自定义指标:Kubernetes Auto Scaling的革命 1. 引言 1.1 Kubernetes与Auto Scaling Kubernetes作为当今容器编排的事实标准,提供了强大的自动化能力,其中Auto Scaling(自动扩缩容)是其核心特性之一。Auto Scaling允许Kubernetes集群根据当前负载动态调整资源,以应对不…...

【K8s】专题十五(4):Kubernetes 网络之 Calico 插件安装、切换网络模式、卸载
本文内容均来自个人笔记并重新梳理,如有错误欢迎指正! 如果对您有帮助,烦请点赞、关注、转发、订阅专栏! 专栏订阅入口 | 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 | 往期精彩文章 【Docker】(全…...

Unity类银河战士恶魔城学习总结(P141 Finalising ToolTip优化UI显示)
【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ UI部分暂时完结!!! 本章节优化了UI中物品描述的显示效果,技能描述的显示效果 并且可以批…...

c++(入门)
1. 引用 引用的定义 引用是另一个变量的别名,它在声明时必须被初始化,并且一旦初始化后,它就始终引用那个变量。 引用的语法 引用的声明方式是在变量名前加上&符号。 引用的特点 引用必须在声明时初始化。引用一旦初始化后&#x…...

【优选算法】前缀和
目录 一、[【模板】前缀和](https://www.nowcoder.com/practice/acead2f4c28c401889915da98ecdc6bf?tpId230&tqId2021480&ru/exam/oj&qru/ta/dynamic-programming/question-ranking&sourceUrl%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595…...

Spring Bean 的生命周期详解
所谓万物皆对象,对于一个 bean 而言,从出生到死亡,他要经历哪些阶段呢? 生命周期 理解对象的生命周期,可以帮助我们更好的做一些扩展。 一个对象从被创建到被垃圾回收,可以大致分为这 5 个阶段:…...

MySQL【知识改变命运】12
视图 1:什么是视图2:创建视图使用视图(视图的好处)2.1.隐藏敏感字段2.2.对外提供统一访问3:视图和真实表进⾏表连接查询 4:修改视图数据4.1:通过真实表修改数据,会影响视图4.2&#…...

shell编程(完整版)
目录 一、shell脚本解释器 二、shell脚本的执行 三、变量的使用 四、永久环境变量 按用户设置永久环境变量 文件路径: 示例步骤: 删除永久环境变量 五、脚本程序传递参数怎么实现 六、用编程进行数学运算 shell中利用expr进行运算 运算与变量…...

数字逻辑(一)——导论
1.导论 1.1什么是数字逻辑? 数字逻辑是指在数字电路设计、计算机科学领域中对于离散的二进制信号进行逻辑处理、运算、存储和传输的基本原理和方法。 1.2数字量和模拟量的区别 数字量:在时间上和数量上都是离散的、不连续的物理量。模拟量࿱…...

量化交易系统开发-实时行情自动化交易-4.4.做市策略
19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来继续说说做市策略原理。 做市策…...

《线性代数的本质》
之前收藏的一门课,刚好期末复习,顺便看一看哈哈 课程链接:【线性代数的本质】合集-转载于3Blue1Brown官方双语】 向量究竟是什么 线性代数中最基础、最根源的组成部分就是向量,需要先明白什么是向量 不同专业对向量的看法 物理专…...

Gbase8s 允许内置用户创建用户以及创建只读权限用户以及利用角色管理普通用户权限
Gbase8s 允许内置用户创建用户以及创建只读权限用户以及利用角色管理普通用户权限 普通安装实例创建数据库以后,DBA权限只有gbasedbt用户。gbasdbt可以创建普通用户,并且给普通用户赋予库及权限或者表级权限。 但是gbasedbt用户口令和操作系统相关,所以想在不提供gbasedbt的…...

24/11/25 视觉笔记 深度传感器和手势识别
本章的目的是开发一个应用程序,使用深度传感器的输出实时检测和跟踪简单的手势。该应用程序将分析每个已捕捉的帧。并执行以下任务。 手部区域分割:通过分析Kinect传感器的深度图输出,在每一帧中提取用户的手部区域,这是通过阈值…...

迄今为止的排序算法总结
迄今为止的排序算法总结 7.10 迄今为止的排序算法总结复杂度和稳定性时间复杂度测试程序sortAlgorithm.hsortAlgorithm.cpptest.cpp 时间复杂度测试结果 7.10 迄今为止的排序算法总结 复杂度和稳定性 排序算法平均情况最好情况最坏情况稳定性空间复杂度选择排序O(n^2)O(n^2)O…...

HTML和CSS 表单、表格练习
HTML和CSS 表格练习 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>HTML表格练习</title>…...

H5流媒体播放器EasyPlayer.js网页直播/点播播放器如果H.265视频在播放器上播放不流畅,可以考虑的解决方案
随着流媒体技术的迅速发展,H5流媒体播放器已成为现代网络视频播放的重要工具。其中,EasyPlayer.js网页直播/点播播放器作为一款功能强大的H5播放器,凭借其全面的协议支持、多种解码方式以及跨平台兼容性,赢得了广泛的关注和应用。…...

Http 转 https 中 Nginx 的详细配置过程
摘要 本节将简要介绍从 HTTP 到 HTTPS 的配置过程,并完整展示 Nginx 的相关配置信息。 经过两天断断续续的调试,终于将 http 变成 https 了。现在说说这个安装 ssl 证书的过程。 服务器是在某云上。这个过程大致分为三个步骤:申请 ssl 证书、…...

【测试工具JMeter篇】JMeter性能测试入门级教程(二)出炉,测试君请各位收藏了!!!
上篇文章:CSDN 我们介绍了JMeter的一些原理介绍,以及安装配置和启动流程,本文我们就来讲讲JMeter如何使用。 一、JMeter目录结构组成 1. 根目录 Jmeter安装包解压后的根目录如下图: 1.1 backups目录:脚本备份目录&am…...

Otter 安装流程
优质博文:IT-BLOG-CN 一、背景 随着公司的发展,订单库的数据目前已达到千万级别,需要进行分表分库,就需要对数据进行迁移,我们使用了otter,这里简单整理下,otter 的安装过程,希望对…...

一文学会Golang里拼接字符串的6种方式(性能对比)
g o l a n g golang golang的 s t r i n g string string类型是不可修改的,对于拼接字符串来说,本质上还是创建一个新的对象将数据放进去。主要有以下几种拼接方式 拼接方式介绍 1.使用 s t r i n g string string自带的运算符 ans ans s2. 使用…...

【笔记】Linux下编译Python3.10.15为动态库同时正确处理OpenSSL3依赖
之前自己第一次编译Python后发现pip会提示无法使用SSL,后来了解到是自己编译时没有配置OpenSSL。这个过程有点曲折,里面有一个坑,怕忘记于是写博客记录一下。 首先是下载OpenSSL,Python3.10.15支持此时最新版的OpenSSL 3.4.0&…...

Go语言获取客户端真实IP
在一些需求中,服务器需要记录客户端的ip地址,要获取ip地址,则需要有http.Request的对象参数传入,以下代码直接放在util中使用。 文件名:ip_utils.go package utilsimport ("context""github.com/spf1…...