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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

友思特新闻 | 友思特荣获广州科技创新创业大赛智能装备行业赛初创组优胜企业!

2024年11月19日&#xff0c;第十三届中国创新创业大赛&#xff08;广东广州赛区&#xff09;暨2024年广州科技创新创业大赛智能装备行业赛颁奖典礼隆重举行。 赛事奖项介绍&#xff1a;广州科技创新创业大赛智能装备行业赛 第十三届“中国创新创业大赛&#xff08;广东广州赛区…

FreeRTOS——消息队列

目录 一、概念及其作用 1.1概念 1.2特点 1.3工作原理 二、相关API 2.1创建队列 2.2任务中写队列 2.3任务中读队列 2.4中断中写队列 2.5中断中读队列 三、实现原理 3.1消息队列控制块 3.2消息队列的创建 3.3消息的发送 3.3.1任务中发送 3.3.2中断中发送 3.4消息的…

11 —— 打包模式的应用

需求&#xff1a;在开发模式下想让webpack使用style-loader进行css样式的处理&#xff1b;让它把css代码内嵌在js中&#xff1b;在生产模式下提取css代码 —— 判断当前运行命令时所在的环境 方案&#xff1a;借助cross-env全局软件包&#xff0c;设置参数区分打包运行环境 …

# issue 4 进程控制函数

目录 一、进程控制函数一 二、进程控制函数二 启动进程&#xff1a;&#xff08;exec系列&#xff09; 创建新进程&#xff1a; 测试代码&#xff1a; 测试结果&#xff1a; 三、进程控制函数三 结束进程&#xff1a; 测试代码&#xff1a; 测试结果&#xff1a; 四、…

C#实现blob分析——分别基于OpenCvSharp和Emgu实现

需求和效果预览 对于下图&#xff0c;需要检测左右两侧是否断开&#xff1a; 解决分析 设置左右2个ROI区域&#xff0c;找到ROI内面积最大的连通域&#xff0c;通过面积阈值和连通域宽高比判定是否断开。 可能遇到的问题&#xff1a;部分区域反光严重&#xff0c;二值化阈值不…

ZYNQ-7020嵌入式系统学习笔记(1)——使用ARM核配置UART发送Helloworld

本工程实现调用ZYNQ-7000的内部ARM处理器&#xff0c;通过UART给电脑发送字符串。 硬件&#xff1a;正点原子领航者-7020 开发平台&#xff1a;Vivado 2018、 SDK 1 Vivado部分操作 1.1 新建工程 设置工程名&#xff0c;选择芯片型号。 1.2 添加和配置PS IP 点击IP INTEGR…

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

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

【FRP 内网穿透 从0到1 那些注意事项】

【摘要】 最近跟第三方团队调试问题&#xff0c;遇到一个比较烦的操作。就是&#xff0c;你必须要发个版到公网环境&#xff0c;他们才能链接到你的接口地址&#xff0c;才能进行调试。按理说&#xff0c;也没啥&#xff0c;就是费点时间。但是&#xff0c;在调试的时候&#…

基于SpringBoot+RabbitMQ完成应⽤通信

前言&#xff1a; 经过上面俩章学习&#xff0c;我们已经知道Rabbit的使用方式RabbitMQ 七种工作模式介绍_rabbitmq 工作模式-CSDN博客 RabbitMQ的工作队列在Spring Boot中实现&#xff08;详解常⽤的⼯作模式&#xff09;-CSDN博客作为⼀个消息队列,RabbitMQ也可以⽤作应⽤程…

进度条程序

目录 1.回车与换行 2.缓冲区 强制刷新&#xff1a;fflush 策略 3.倒计时程序 4.进度条 4.1先做一下基本的准备工作 4.2现在我们正式来实现 进度: 比率: 旋转光标 表明动态变化: 4.3如果我们要完成一个下载任务 4.3.1实现: 4.3.2光标显示: 4.3.2.1证明一下&#…

软件测试——自动化测试常见函数

在上一篇文章软件测试——自动化测试概念篇-CSDN博客中&#xff0c;给大家演示了一下自动化程序&#xff0c;而本篇文章会带大家详细学习selenium库。 selenium库是python官方的库&#xff0c;里面包含了很多操控浏览器的函数。 本节重点 元素定位操作测试对象窗口等待导航弹…

STM32F103C8T6实时时钟RTC

目录 前言 一、RTC基本硬件结构 二、Unix时间戳 2.1 unix时间戳定义 2.2 时间戳与日历日期时间的转换 2.3 指针函数使用注意事项 ​三、RTC和BKP硬件结构 四、驱动代码解析 前言 STM32F103C8T6外部低速时钟LSE&#xff08;一般为32.768KHz&#xff09;用的引脚是PC14和PC…

AI社媒引流工具:解锁智能化营销的新未来

在数字化浪潮的推动下&#xff0c;社交媒体成为品牌营销的主战场。然而&#xff0c;面对海量的用户数据和日益复杂的运营需求&#xff0c;传统营销方法显得力不从心。AI社媒引流王应运而生&#xff0c;帮助企业在多平台中精准触达目标用户&#xff0c;提升营销效率和效果。 1.…

知识中台:提升企业知识管理的智能化水平

在数字化转型的浪潮中&#xff0c;企业知识管理的智能化水平成为提升竞争力的关键。HelpLook知识中台通过集成先进的AI技术&#xff0c;为企业提供了一个智能化的知识管理平台。 一、知识管理智能化的重要性 智能化的知识管理不仅能够提高信息检索的效率&#xff0c;还能通过…

Unreal5从入门到精通之EnhancedInput增强输入系统详解

前言 从Unreal5开始,老版的输入系统,正式替换为EnhancedInput增强型输入系统,他们之间有什么区别呢? 如果有使用过Unity的同学,大概也知道,Unity也在2020版本之后逐渐把输入系统也升级成了新版输入系统,为什么Unreal和Unity都热衷于升级输入系统呢?这之间又有什么联系…

C语言数据结构与算法--简单实现队列的入队和出队

&#xff08;一&#xff09;队列的基本概念 和栈相反&#xff0c;队列(Queue)是一种先进先出&#xff08;First In First Out&#xff09;的线性表。只 允许在表的一端进行插入&#xff0c;而在另一端删除元素&#xff0c;如日常生活中的排队现象。队列中 允许插入的一端叫队尾…

docker搭建私有仓库,实现镜像的推送和拉取

1.拉取docker仓库镜像 docker pull registry 2.启动registry容器 docker run -d registry 3.查看当前仓库中存在的镜像&#xff08;一&#xff09; curl -XGET http://192.168.111.162: 5000/v2/_catalog 192.168.111.162 部署docker仓库宿主机的ip 5000 部署docker仓库映射到宿…

算法学习笔记(九):网格图DFS、图论算法DFS、动态规划DP、贪心

一.网格图DFS 适用于需要计算连通块个数、大小的题目 1.岛屿数量 给你一个由 1(陆地) 和 0&#xff08;水&#xff09;组成的二维网格&#xff0c;请你计算网格中岛屿的数量 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和\或竖直方向上相邻的陆地连接形成 此外&…

Cmakelist.txt之Linux-redis配置

1.cmakelist.txt cmake_minimum_required(VERSION 3.16) ​ project(redis_linux_test LANGUAGES C) ​ ​ ​ add_executable(redis_linux_test main.c) ​ # 设置hiredis库的头文件路径和库文件路径 set(Hiredis_INCLUDE_DIR /usr/local/include/hiredis) set(Hiredis_LIBRA…

【Node.js】Node.js 和浏览器之间的差异

Node.js 是一个强大的运行时环境&#xff0c;它在现代 JavaScript 开发中扮演着重要角色。然而&#xff0c;许多开发者在使用 Node.js 时常常会感到困惑&#xff0c;尤其是与浏览器环境的对比。本文将深入探讨 Node.js 和浏览器之间的差异&#xff0c;帮助你全面理解两者的设计…