基于docker进行任意项目灵活发布

news2024/11/23 13:35:47

引言

不管是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:v1

pip 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:v1
    ports:
      - "8122:8122"
    volumes:
      - /data/extdocker/project/ChatVL-v1/:/project/
    command: bash /project/docker_start.sh

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - db_data:/var/lib/mysql

volumes:
  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.coloradmin.cn/o/2246036.html

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

相关文章

点餐管理系统设计与实现(Java+SpringBoot+MySql)

目录 第1章 绪论 1.1选题动因 1.2目的和意义 1.3论文结构安排 第2章 开发环境与技术 2.1 MySQL数据库 2.2 Tomcat 介绍 2.3 vue技术 2.4 SpringBoot框架 第3章 系统分析 3.1可行性分析 3.1.1操作可行性分析 3.1.2经济可行性分析 3.1.3技术可行性分析 3.2系统流程…

特征交叉-MaskNet文章总结代码实现

MaskNet 这个模型是微博21年提出的&#xff0c;23年twitter(X)开源的推荐系统排序模块使用的backbone结构。 核心思想是认为DNN为主的特征交叉是addictive&#xff0c;交叉效率不高&#xff1b;所以设计了一种multiplicatvie的特征交叉 如何设计muliplicative特征交叉呢&#x…

(7) 探索Python函数的无限可能:从递归到Lambda的奇妙之旅

欢迎进入Python编程的奇幻世界!在这个课程中,我们将一起探索编程的乐趣,通过生动有趣的方式,培养编程的逻辑思维和创造力,该课程适合有一定基础的中学及以上学生及成年人。 以下是我们课程的大纲: 【Python:趣味编程,探索未来】 目录 1. 前言2. 认识我们的“魔法咒语”…

算法日记 32 day 动态规划(完全背包)

同样是背包问题&#xff0c;但01背包和完全背包是两个类型的问题。 完全背包&#xff1a; 完全背包与01背包的区别在于物品的个数是否是无限的。除此之外&#xff0c;在解决01背包的时候dp的背包遍历的顺利是倒序&#xff0c;为的是保证物品只被添加一次&#xff0c;而完全背包…

实用功能,觊觎(Edge)浏览器的内置截(长)图功能

Edge浏览器内置截图功能 近年来&#xff0c;Edge浏览器不断更新和完善&#xff0c;也提供了长截图功能。在Edge中&#xff0c;只需点击右上角的“...”&#xff0c;然后选择“网页捕获”->“捕获整页”&#xff0c;即可实现长截图。这一功能的简单易用&#xff0c;使其成为…

计算机网络:应用层知识点概述及习题

网课资源&#xff1a; 湖科大教书匠 1、概述 习题1 1 在计算机网络体系结构中&#xff0c;应用层的主要功能是 A. 实现进程之间基于网络的通信 B. 通过进程之间的交互来实现特定网络应用 C. 实现分组在多个网络上传输 D. 透明传输比特流 2 以下不属于TCP/IP体系结构应用层范畴…

【LSTM实战】跨越千年,赋诗成文:用LSTM重现唐诗的韵律与情感

本文将介绍如何使用LSTM训练一个能够创作诗歌的模型。为了训练出效果优秀的模型&#xff0c;我整理了来自网络的4万首诗歌数据集。我们的模型可以直接使用预先训练好的参数&#xff0c;这意味着您无需从头开始训练&#xff0c;即可在自己的电脑上体验AI作诗的乐趣。我已经为您准…

鸿蒙网络编程系列50-仓颉版TCP回声服务器示例

1. TCP服务端简介 TCP服务端是基于TCP协议构建的一种网络服务模式&#xff0c;它为HTTP&#xff08;超文本传输协议&#xff09;、SMTP&#xff08;简单邮件传输协议&#xff09;等高层协议的应用程序提供了可靠的底层支持。在TCP服务端中&#xff0c;服务器启动后会监听一个或…

基于 SpringBoot 的作业管理系统【附源码】

基于 SpringBoot 的作业管理系统 效果如下&#xff1a; 系统注册页面 学生管理页面 作业管理页面 作业提交页面 系统管理员主页面 研究背景 随着社会的快速发展&#xff0c;信息技术的广泛应用已经渗透到各个行业。在教育领域&#xff0c;课程作业管理是学校教学活动中的重要…

怎么只提取视频中的声音?从视频中提取纯音频技巧

在数字媒体的广泛应用中&#xff0c;提取视频中的声音已成为一项常见且重要的操作。无论是为了学习、娱乐、创作还是法律用途&#xff0c;提取声音都能为我们带来诸多便利。怎么只提取视频中的声音&#xff1f;本文将详细介绍提取声音的原因、工具、方法以及注意事项。 一、为什…

Java多态的优势和弊端

1. public class text {public static void main(String[] args) {animal dnew dog();d.eat();// dog a (dog) d;//类似强制转换//a.lookhome();/* if(d instanceof dog){dog a(dog)d;a.lookhome();}else if(d instanceof cat){cat c(cat) d;c.work();}else{System.out.print…

FPGA 14 ,硬件开发板分类详解,FPGA开发板与普通开发板烧录的区别

目录 前言 在嵌入式系统开发中&#xff0c;硬件开发板是工程师常用的工具之一。不同类型的开发板有不同的特点和用途&#xff0c;其中最常见的两大类是普通开发板和FPGA开发板。这里分享记录&#xff0c;这两类开发板的分类&#xff0c;并深入探讨它们在烧录过程中的具体区别…

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

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

时序论文23|ICML24谷歌开源零样本时序大模型TimesFM

论文标题&#xff1a;A DECODER - ONLY FOUNDATION MODEL FOR TIME - SERIES FORECASTING 论文链接&#xff1a;https://arxiv.org/abs/2310.10688 论文链接&#xff1a;https://github.com/google-research/timesfm 前言 谷歌这篇时间序列大模型很早之前就在关注&#xff…

Redis的基本使用命令(GET,SET,KEYS,EXISTS,DEL,EXPIRE,TTL,TYPE)

目录 SET GET KEYS EXISTS DEL EXPIRE TTL redis中的过期策略是怎么实现的&#xff08;面试&#xff09; 上文介绍reids的安装以及基本概念&#xff0c;本章节主要介绍 Redis的基本使用命令的使用 Redis 是一个基于键值对&#xff08;KEY - VALUE&#xff09;存储的…

大疆上云api开发

目前很多公司希望使用上云api开发自己的无人机平台,但是官网资料不是特别全,下面浅谈一下本人开发过程中遇到的一系列问题。 本人使用机场为大疆机场2&#xff0c;飞机为M3TD&#xff0c;纯内网使用 部署 链接: 上云api代码. 首先从github上面拉去代码 上云api代码github. 后…

实现管易云到金蝶云星空的数据无缝集成

管易云数据集成到金蝶云星空&#xff1a;案例分享 在企业信息化系统中&#xff0c;数据的高效流动和准确对接是业务顺利运行的关键。本文将聚焦于一个具体的系统对接集成案例——通过轻易云数据集成平台实现管易云数据到金蝶云星空的无缝迁移&#xff0c;方案名称为“wk_店铺_…

Ubuntu上安装MySQL并且实现远程登录

目录 下载网络工具 查看网络连接 更新系统软件包&#xff1b; 安装mysql数据库 查看mysql数据库状态 以数字ip形式显示mysql的监听状态。&#xff08;默认监听端口是3306&#xff09; 查看安装mysql数据库时系统创建的目录信息。 根据查询到的系统用户名以及随机密码&a…

卷积神经网络各层介绍

目录 1 卷积层 2 BN层 3 激活层 3.1 ReLU&#xff08;Rectified Linear Unit&#xff09; 3.2 sigmoid 3.3 tanh&#xff08;双曲正切&#xff09; 3.4 Softmax 4 池化层 5 全连接层 6 模型例子 1 卷积层 卷积是使用一个卷积核&#xff08;滤波器&#xff09;对矩阵进…

LVS

一、 lvs简介 LVS:Linux Virtual Server &#xff0c;负载调度器&#xff0c;内核集成&#xff0c;章文嵩&#xff0c;阿里的四层 SLB(Server LoadBalance) 是基 于 LVSkeepalived 实现 LVS 官网 : http://www.linuxvirtualserver.org/ LVS 相关术语 VS: Virtual Serve…