基于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.rhkb.cn/news/476474.html

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

相关文章

Android 分区相关介绍

目录 一、MTK平台 1、MTK平台分区表配置 2、MTK平台刷机配置表 3、MTK平台分区表配置不生效 4、Super分区的研究 1&#xff09;Super partition layout 2&#xff09;Block device table 二、高通平台 三、展锐平台 四、相关案例 1、Super分区不够导致编译报错 经验…

数据库类型介绍

1. 关系型数据库&#xff08;Relational Database, RDBMS&#xff09;&#xff1a; • 定义&#xff1a;基于关系模型&#xff08;即表格&#xff09;存储数据&#xff0c;数据之间通过外键等关系相互关联。 • 特点&#xff1a;支持复杂的SQL查询&#xff0c;数据一致性和完整…

当产业经济插上“数字羽翼”,魔珐有言AIGC“3D视频创作大赛”成功举办

随着AI技术的飞速发展&#xff0c;3D数字人技术已成为驱动各行各业转型升级的重要力量。在这一背景下&#xff0c;2024山东3D数字人视频创作大赛应运而生&#xff0c;并在一番激烈的角逐后圆满落幕&#xff0c;为科技与创意的交融写下浓墨重彩的一笔。 11月20日&#xff0c;一…

经济增长初步

1.人均产出 人均产出&#xff0c;通常指的是一个国家、地区或组织在一定时期内&#xff0c;每个劳动人口平均创造的生产总值。它是衡量一个地区或国家经济效率和劳动生产率的重要指标。具体来说&#xff0c;人均产出可以通过以下公式计算&#xff1a; 人均产出总产出/劳动人口…

图像增强夜视仪行业全面而深入的分析

图像增强夜视设备&#xff08;I2ND 或 INVD&#xff09;是一种增强监视、安全和军事应用的微光可见度的技术。 它允许用户在非常弱的光线甚至完全黑暗的条件下看到东西。 一、市场研究 1. 市场规模与增长趋势 据QYResearch调研团队最新报告&#xff0c;预计2029年全球图像增强…

002 MATLAB语言基础

01 变量命名规则 变量名只能由字母、数字和下划线组成&#xff0c;且必须以字母开头&#xff1b; 变量名区分字母的大小写&#xff1b; 变量名不能超过最大长度限制&#xff1b; 关键字不能作为变量名&#xff0c;如for、end和if等&#xff1b; 注意&#xff1a;存变量命名时…

greater<>() 、less<>()及运算符 < 重载在排序和堆中的使用

简略图 greater<>()(a, b) a > b 返回true&#xff0c;反之返回false less<>()(a, b) a < b 返回true&#xff0c;反之返回false 在cmp中使用&#xff08;正着理解&#xff09; 规则返回true时a在前&#xff0c;反之b在前 在priority_queue中使用 &#xff…

冲破AI 浪潮冲击下的 迷茫与焦虑

在这个科技日新月异的时代&#xff0c;人工智能如汹涌浪潮般席卷而来&#xff0c;不断改变我们的生活。你是否对 AI 充满好奇&#xff0c;却不知它将如何改变你的工作与生活&#xff1f;又是否会在 AI 浪潮的冲击下陷入迷茫与焦虑&#xff1f;《AI 时代&#xff1a;弯道超车新思…

嵌入式LVGL自定义纯数字键盘

嵌入式LVGL自定义纯数字键盘 一、前言二、设置自定义数字键盘三、使用一、前言 嵌入式UI项目中有时候会使用到纯数字密码的需求,所以打算使用LVGL构建自定义的纯数字键盘。 二、设置自定义数字键盘 参考这个文章,以LV_KEYBOARD_MODE_USER_1为例,增加一个数字键盘,如下图所…

第6篇 寻找最大数___ARM C语言程序<二>

Q&#xff1a;如何创建基于ARM处理器的C语言程序寻找一组数据列表中的最大数呢&#xff1f; A&#xff1a;和基于Nios II处理器的C语言程序一样&#xff0c;在ARM处理器C语言中也使用printf库函数显示程序的运行结果&#xff0c;若要调用printf函数&#xff0c;必须在C程序中包…

【11.22更新】Win11 24H2正式版:26100.2454镜像一键获取!

今日&#xff0c;系统之家小编就给大家带来2024年11月最新推出的Windows11 24H2正式版系统&#xff0c;该版本系统包含最新可选更新补丁KB5046740&#xff0c;用户安装后版本号升至26100.2454。更新此系统后&#xff0c;用户就能通过文件资源管理器和桌面上的右键菜单将内容分享…

python小课堂(一)

基础语法 1 常量和表达式2 变量和类型2.1 变量是什么2.2 变量语法 3 变量的类型3.1 动态类型特性 4 注释4.1注释是什么 5 输入输出5.1 print的介绍5.2 input 6 运算符6.1 算术运算符在这里插入图片描述6.2 关系运算符6.3 逻辑运算符6.4赋值运算符 1 常量和表达式 在print()中可…

区块链网络示意图;Aura共识和Grandpa共识(BFT共识)

目录 区块链网络示意图 Aura共识和Grandpa共识(BFT共识) Aura共识 Grandpa共识(BFT共识) Aura与Grandpa的结合 区块链网络示意图 CP Blockchain:这是中央处理区块链(或可能指某种特定的处理单元区块链)的缩写。它可能代表了该区块链网络的主要处理或存储单元。在这…

springboot整合hive

springboot整合hive pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.…

跨视角差异-依赖网络用于体积医学图像分割|文献速递-生成式模型与transformer在医学影像中的应用

Title 题目 Cross-view discrepancy-dependency network for volumetric medical imagesegmentation 跨视角差异-依赖网络用于体积医学图像分割 01 文献速递介绍 医学图像分割旨在从原始图像中分离出受试者的解剖结构&#xff08;例如器官和肿瘤&#xff09;&#xff0c;并…

WebApis学习笔记,第二节:高级语法

WebApis学习笔记&#xff0c;第二节&#xff1a;高级语法 一、JS组成 我们再回顾一下JS的组成&#xff1a;ECMAScript: 规定了js基础语法核心知识。 比如&#xff1a;变量、分支语句、循环语句、对象等等Web APIs : DOM 文档对象模型&#xff0c; 定义了一套操作HTML文档的AP…

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

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

飞桨大模型PaddleOCR

一、新建项目PaddleOCRProject 二、查看开源 pip install paddlepaddle pip install paddleocr指定镜像源下载才快&#xff1a; pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple pip install paddleocr -i https://pypi.tuna.tsinghua.edu.cn/simple 三…

Python创建虚拟环境报错:Error: Command......

文章目录 环境说明问题描述原因分析解决方法 环境说明 系统 # lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.4 LTS Release: 22.04 Codename: jammyPython版本 # python3 --version Python 3.13.0问题描…

Linux INPUT 子系统详解

目录 一、引言 二、INPUT 子系统的架构 1.输入设备驱动层 2.核心层 3.事件处理层 三、INPUT 子系统的工作原理 1.设备注册与初始化 2.事件产生与提交 3.事件分发与处理 4.应用程序访问输入设备 四、使用 INPUT 子系统进行设备驱动开发 1.编写输入设备驱动程序 2.注…