基于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卷。
  • volumes: 定义卷,用于持久化存储数据。

4.2 Docker Swarm

在生产环境中,往往需要将多个Docker主机组成一个集群,以实现高可用性和负载均衡。Docker Swarm是Docker官方提供的集群管理工具,可以将多个Docker主机组成一个Swarm集群,并通过Swarm管理器进行统一管理。

以下是使用Docker Swarm的基本步骤:

  1. 初始化Swarm:

    docker swarm init
    
  2. 加入Swarm:

    docker swarm join --token <token> <manager-ip>:<port>
    
  3. 部署服务:

    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的基本步骤:

  1. 安装Kubernetes:

    kubeadm init
    
  2. 部署应用:

    kubectl create deployment chatvl --image=python_project:v1
    
  3. 暴露服务:

    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,开发者可以大大提高项目发布的效率和质量,从而更好地应对日益复杂的软件开发挑战。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/60389.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【课堂笔记】隐私计算实训营第四期:“隐语”可信隐私计算开源框架

“隐语”可信隐私计算开源框架 隐语架构一览隐语架构拆解产品层算法层PSI/PIR数据分析&#xff08;Data Analysis&#xff09;联邦学习&#xff08;Federated Learning&#xff09; 计算层混合编译调度——RayFedSPUHEUTEEUYACL 资源层KUSCIA 互联互通跨域管控 隐语架构一览 隐…

Kubernetes的pod控制器

文章目录 一&#xff0c;什么是pod控制器二&#xff0c;pod控制器类型&#xff08;重点&#xff09;1.ReplicaSet2.Deployment3.DaemonSet4.StatefulSet5.Job6.Cronjob 三&#xff0c;pod与控制器的关系1.Deployment2.SatefulSet2.1StatefulSet组成2.2headless的由来2.3有状态服…

一文读懂埋阻埋容工艺

PCB 埋阻埋容工艺是一种在 PCB 板内部埋入电阻和电容的工艺。通常情况下&#xff0c; PCB 上电阻和电容都是通过贴片技术直接焊接在板面上的&#xff0c;而埋阻埋容工艺则将电 阻和电容嵌入到 PCB 板的内部层中&#xff0c;这种印制电路板,其自下而上依次包括第一介电 层,隐埋电…

QA|使用 MapleSim 模拟卷料生产 (Converting)和卷对卷系统 (R2R)

使用 MapleSim 模拟卷料生产 (Converting)和卷对卷系统 (R2R) 纸张、薄膜、塑料、金属箔、新能源电池和卷料生产设备 (converting equipment) 的制造商正在转向建模和仿真&#xff0c;以提升卷料处理的设备性能和产品质量。MapleSim 卷料处理库提供了专业的建模元件以及功能&a…

MATLAB读入不同类型图像并显示图像和相关信息

MATLAB&#xff08;Matrix Laboratory)是一种常用的数学工具软件&#xff0c;MATLAB以矩阵运算为核心&#xff0c;为图像处理提供了高效的数据处理能力。图像处理中的许多操作都可以转化为矩阵运算&#xff0c;从而利用MATLAB的矩阵运算能力进行优化和加速。在图像处理方面&…

学习日志015--python单链表

创建 class Node:def __init__(self,data):# 数据域self.data data# 链接域self.next Noneclass LinkList:def __init__(self,):# 初始化头节点self.head None# 记录链表的长度self.size 0 增加 #头插def insert_head(self,value):# 创建新节点node Node(value)q self…

CnosDB 实时流式计算:优化时序数据处理与降采样解决方案

在处理时序数据时&#xff0c;数据写入周期通常与数据采集设备的频率相关&#xff0c;有时每秒钟就需要处理大量的数据点。长时间处理如此多的数据会导致存储问题。一个有效的解决方案是使用流式计算&#xff0c;将原始数据进行降采样。 流式计算在时序数据库中指对实时数据流…

241120学习日志——[CSDIY] [InternStudio] 大模型训练营 [09]

CSDIY&#xff1a;这是一个非科班学生的努力之路&#xff0c;从今天开始这个系列会长期更新&#xff0c;&#xff08;最好做到日更&#xff09;&#xff0c;我会慢慢把自己目前对CS的努力逐一上传&#xff0c;帮助那些和我一样有着梦想的玩家取得胜利&#xff01;&#xff01;&…

机器学习基础06_梯度下降

目录 一、为什么使用梯度下降 二、什么是梯度下降 三、为什么要用梯度下降 四、怎么进行梯度下降 1、微分 1.单变量的微分 2.多变量的微分 2、梯度 3、步骤 (1)学习率α (2)梯度(导数)前的负号 4、实例实现 五、sklearn梯度下降 一、为什么使用梯度下降 前面利用正…

ELK8.15.4搭建开启安全认证

安装 Elastic &#xff1a;Elasticsearch&#xff0c;Kibana&#xff0c;Logstash 另外安装一个收集器filebeat 通过二进制安装包进行安装 创建一个专门放elk目录 mkdir /elk/ mkdir /elk/soft下载 es 、kibana、Logstash、filebeat二进制包 cd /elk/softwget https://art…

贴代码框架PasteForm特性介绍之image

简介 PasteForm是贴代码推出的 “新一代CRUD” &#xff0c;基于ABPvNext&#xff0c;目的是通过对Dto的特性的标注&#xff0c;从而实现管理端的统一UI&#xff0c;借助于配套的PasteBuilder代码生成器&#xff0c;你可以快速的为自己的项目构建后台管理端&#xff01;目前管…

【划分型 DP-约束划分个数】【hard】【阿里笔试】力扣1278. 分割回文串 III

给你一个由小写字母组成的字符串 s&#xff0c;和一个整数 k。 请你按下面的要求分割字符串&#xff1a; 首先&#xff0c;你可以将 s 中的部分字符修改为其他的小写英文字母。 接着&#xff0c;你需要把 s 分割成 k 个非空且不相交的子串&#xff0c;并且每个子串都是回文串…

YOLO入门教程(三)——训练自己YOLO11实例分割模型并预测【含教程源码+一键分类数据集 + 故障排查】

目录 引言前期准备Step0 环境部署1.安装OpenCV2.安装Pytorch3.安装Ultralytics Step1 打标训练Step2 格式转换Step3 整理训练集Step4 训练数据集4.1创建yaml文件4.2训练4.3预测4.4故障排查4.4.1OpenCV版本故障&#xff0c;把OpenCV版本升级到4.0以上4.4.2NumPy版本故障&#xf…

鸿蒙系统下使用AVPlay播放视频,封装播放器

鸿蒙系统下使用AVPlay开发一款视频播放器流程 一. 申请权限 申请相关权限&#xff0c;主要是读取存储卡权限&#xff0c;方便后面扫描视频用&#xff1a; getPermission(): void {let array: Array<Permissions> [ohos.permission.WRITE_DOCUMENT,ohos.permission.REA…

编程语言05:面向对象

一、定义 使用步骤&#xff1a; 1.定义类 2.创建对象 3.调用类的属性和方法 (一)定义类 1.java 一个java文件中可以定义多个class类&#xff0c;且只能一个类是public修饰&#xff0c;而且public修饰的类名必须成为代码文件名。 实际开发中建议还是一个文件定义一个…

低速接口项目之串口Uart开发(二)——FIFO实现串口数据的收发回环测试

本节目录 一、设计思路 二、loop环回模块 三、仿真模块 四、仿真验证 五、上板验证 六、往期文章链接本节内容 一、设计思路 串口数据的收发回环测试&#xff0c;最简单的硬件测试是把Tx和Rx连接在一起&#xff0c;然后上位机进行发送和接收测试&#xff0c;但是需要考虑到串…

机器学习系列----关联分析

目录 1. 关联分析的基本概念 1.1定义 1.2常用算法 2.Apriori 算法的实现 2.1 工作原理 2.2 算法步骤 2.3 优缺点 2.4 时间复杂度 2.5实际运用----市场购物篮分析 3. FP-Growth 算法 3.1 工作原理 3.2 算法步骤 3.3 优缺点 3.4 时间复杂度 3.5实际运用——网页点…

二叉树路径相关算法题|带权路径长度WPL|最长路径长度|直径长度|到叶节点路径|深度|到某节点的路径非递归(C)

带权路径长度WPL 二叉树的带权路径长度(WPL)是二叉树所有叶节点的带权路径长度之和&#xff0c;给定一棵二叉树T&#xff0c;采用二叉链表存储&#xff0c;节点结构为 其中叶节点的weight域保存该节点的非负权值&#xff0c;设root为指向T的根节点的指针&#xff0c;设计求W…

Ubuntu ESP32开发环境搭建

文章目录 ESP32开发环境搭建安装ESP-IDF搭建一个最小工程现象 ESP32开发环境搭建 最近有个小项目需要用到能够联网的mcu驱动&#xff0c;准备玩玩esp的芯片&#xff0c;记录下ESP32开发环境搭建的过程。 ESP-IDF 是乐鑫科技为其 ESP32 系列芯片提供的官方开发框架。这个框架主…

2024.5 AAAiGLaM:通过邻域分区和生成子图编码对领域知识图谱对齐的大型语言模型进行微调

GLaM: Fine-Tuning Large Language Models for Domain Knowledge Graph Alignment via Neighborhood Partitioning and Generative Subgraph Encoding 问题 如何将特定领域知识图谱直接整合进大语言模型&#xff08;LLM&#xff09;的表示中&#xff0c;以提高其在图数据上自…