From d646fd4fbfb9eb595c06cf069242fd419818b219 Mon Sep 17 00:00:00 2001 From: gitadmin Date: Sun, 21 Sep 2025 18:24:55 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AD=BE=E5=85=A5=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- compose-file/docker-compose.yml | 125 ++++++++++++++++++------ scripts-file/deploy_env copy.sh | 167 ++++++++++++++++++++++++++++++++ scripts-file/deploy_env.sh | 131 +++++++++++++++++++------ 3 files changed, 363 insertions(+), 60 deletions(-) create mode 100644 scripts-file/deploy_env copy.sh diff --git a/compose-file/docker-compose.yml b/compose-file/docker-compose.yml index 12ae8f3..c2af120 100644 --- a/compose-file/docker-compose.yml +++ b/compose-file/docker-compose.yml @@ -1,56 +1,121 @@ +# Docker Compose 文件版本定义 +# 3.7 版本支持丰富的部署配置和资源限制功能 version: '3.7' -# 应用服务 +# 服务定义块,包含所有需要部署的容器服务 services: - # 后端服务 - xiaomayi-elevue: - # 镜像 - image: 192.168.10.102:8001/xiaomayi/xiaomayi-elevue:${VERSION:-latest} - # 容器名 - container_name: xiaomayi-elevue - # 重启方式 + # 后端服务 - 小蚂蚁管理系统后端 + xiaomayi-admin: + # 镜像地址:从私有Harbor仓库拉取镜像 + # ${VERSION:-latest} 表示使用VERSION环境变量,如果未设置则使用latest标签 + image: manage.harbor.djangoadmin.cn/xiaomayi/xiaomayi-admin:${VERSION:-latest} + + # 容器名称:指定容器的名称,便于管理和识别 + container_name: xiaomayi-admin + + # 重启策略:always表示容器退出时总是自动重启 + # 确保服务在异常退出后能够自动恢复 restart: always - # 网络模式 + + # 网络模式:host表示使用主机网络模式 + # 容器直接使用宿主机的网络栈,性能更好,端口直接暴露在主机上 network_mode: host - # 端口映射 + + # 端口映射:将容器内的8081端口映射到主机的8081端口 + # 格式:主机端口:容器端口 ports: - 8081:8081 + + # 数据卷挂载:将主机文件或目录挂载到容器内 volumes: + # 挂载主机hosts文件到容器内(只读模式) + # 用于容器内的域名解析,与主机保持一致 - /etc/hosts:/etc/hosts:ro + + # 挂载上传目录:将当前目录下的upload目录挂载到容器的/opt/apps/upload + # 用于持久化存储上传的文件 - $PWD/upload:/opt/apps/upload - # 发布 + + # 挂载包目录:将当前目录下的package目录挂载到容器的/opt/apps/package + # 用于存储应用程序包或其他资源文件 + - $PWD/package:/opt/apps/package + + # 部署配置:定义资源限制和预留(Docker Swarm模式下的配置) + # 在单机Docker Compose中也会被部分支持 deploy: resources: + # 资源限制:容器最多可以使用的资源量 limits: - cpus: '2' - memory: 1.5G + cpus: '2' # 最多使用2个CPU核心 + memory: 1.5G # 最多使用1.5GB内存 + # 资源预留:保证容器至少获得的资源量 reservations: - cpus: '0.25' - memory: 500M - # 前端服务 - xiaomayi-elevue-web: - # 镜像 - image: 192.168.10.102:8001/xiaomayi/xiaomayi-elevue-web:${VERSION:-latest} - # 容器名 - container_name: xiaomayi-elevue-web - # 重启方式 + cpus: '0.25' # 至少保留0.25个CPU核心 + memory: 500M # 至少保留500MB内存 + + # 前端服务 - 小蚂蚁管理系统前端 + xiaomayi-web2: + # 镜像地址:前端服务的Docker镜像 + image: manage.harbor.djangoadmin.cn/xiaomayi/xiaomayi-web2:${VERSION:-latest} + + # 容器名称:前端服务容器名称 + container_name: xiaomayi-web2 + + # 重启策略:总是自动重启 restart: always - # 网络模式 + + # 网络模式:使用主机网络模式 network_mode: host - # 端口映射 + + # 端口映射:前端服务监听8082端口 ports: - 8082:8082 + + # 数据卷挂载 volumes: + # 挂载主机hosts文件(只读) - /etc/hosts:/etc/hosts:ro - - $PWD/upload:/opt/apps/upload - # 发布 + + # 挂载上传目录(读写模式) + # :rw 表示读写权限(默认模式,显式声明更清晰) + - $PWD/upload:/opt/apps/upload:rw + + # 挂载包目录(读写模式) + - $PWD/package:/opt/apps/package:rw + + # 环境变量:设置容器内的环境变量 + environment: + # 语言设置:设置为英文UTF-8编码 + - LANG=en_US.UTF-8 + + # 本地化设置:全部使用英文UTF-8 + - LC_ALL=en_US.UTF-8 + + # Java虚拟机参数:设置文件编码为UTF-8 + # 确保中文等特殊字符正确处理 + - JAVA_OPTS=-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 + + # 部署配置:资源限制和预留 deploy: resources: + # 资源上限 limits: - cpus: '2' - memory: 1.5G + cpus: '2' # 最多2个CPU核心 + memory: 1.5G # 最多1.5GB内存 + # 资源保障 reservations: - cpus: '0.25' - memory: 500M + cpus: '0.25' # 至少0.25个CPU核心 + memory: 500M # 至少500MB内存 +# 注意:该配置文件中使用了以下特殊配置: +# 1. network_mode: host - 主机网络模式,容器直接使用主机网络 +# 2. ${VERSION:-latest} - 环境变量替换,支持动态版本控制 +# 3. deploy.resources - Docker Swarm模式的资源管理,在单机模式下也有部分效果 +# 4. 多目录挂载 - 实现数据持久化和主机-容器文件共享 +# 5. 环境变量设置 - 确保应用程序的编码和语言环境正确 +# 使用说明: +# 1. 部署命令:VERSION=1.2.0 docker-compose up -d +# 2. 查看日志:docker-compose logs -f +# 3. 停止服务:docker-compose down +# 4. 更新服务:VERSION=1.2.1 docker-compose up -d \ No newline at end of file diff --git a/scripts-file/deploy_env copy.sh b/scripts-file/deploy_env copy.sh new file mode 100644 index 0000000..f016857 --- /dev/null +++ b/scripts-file/deploy_env copy.sh @@ -0,0 +1,167 @@ +#!/bin/bash +# 设置脚本执行选项: +# -e: 遇到错误立即退出 +# -u: 遇到未定义变量报错 +# -a: 自动导出所有变量(set -a 表示自动导出,set +a 表示关闭自动导出) +set -a + +# 检测操作系统类型并加载环境变量文件 +# 判断是否为 RedHat 或 Rocky Linux 系统 +if [ -f /etc/redhat-release ] || [ -f /etc/rocky-release ]; then + # 在 RedHat 系系统上使用 source 命令加载 .env 环境变量文件 + source ./.env +# 判断是否为 Debian/Ubuntu 系统(基于LSB标准) +elif [ -f /etc/lsb-release ]; then + # 在 Debian 系系统上使用 . 命令加载 .env 环境变量文件 + . ./.env +else + # 不支持的操作系统提示 + echo "Unsupported OS" + exit 1 # 退出脚本,返回错误码 +fi + +# 关闭自动导出变量模式 +set +a + +# 定义变量 +schema="https://" # 协议方案,默认为HTTPS +serverName=$2 # 第二个参数:服务名称(如 xiaomayi-admin) +tag=$3 # 第三个参数:镜像标签(如 prod-31) + +# 函数:显示脚本使用说明和描述信息 +desc() { + clear # 清屏 + echo "===========================================================" + echo "Deploy Containter" # 脚本用途:部署容器 + echo "===========================================================" + echo "version 0.1" # 脚本版本号 + echo "deploy: deploy containter" # 部署命令用法 + echo "delete: delete containter" # 删除命令用法 + echo "" + echo "===========================================================" + echo press any key to continue && read TEMP && echo ok.. # 等待用户按键继续 +} + +# 函数:获取指定容器的镜像名称 +list_image() { + # 使用 docker inspect 命令获取容器的镜像名称 + # --format="{{.Config.Image}}" 指定输出格式为镜像名称 + image_id=`docker inspect --format="{{.Config.Image}}" ${serverName}` +} + +# 函数:获取指定容器的进程ID(容器ID) +list_process() { + # 使用 docker inspect 命令获取容器的完整ID + # --format="{{.Id}}" 指定输出格式为容器ID + process_id=`docker inspect --format="{{.Id}}" ${serverName}` +} + +# 函数:从Docker仓库拉取镜像 +pull_image() { + echo "----------------" + echo "Pull Image" # 拉取镜像阶段开始 + echo "----------------" + + # 构建完整的镜像名称 + # 格式:仓库URL/命名空间/服务名称 + imageName="${DOCKER_REGISTRY_URL}/${DOCKER_REGISTRYURL_NAMESPACE}/${serverName}" + + # 登录到Docker仓库(使用密码管道方式,避免密码明文出现在命令行历史中) + echo "$DOCKER_PASSWORD" | docker login --username=${DOCKER_USERNAME} --password-stdin ${DOCKER_REGISTRY_URL} + + # 拉取指定标签的镜像 + docker pull "${imageName}:${tag}" + echo "" # 输出空行 +} + +# 函数:运行镜像(部署容器) +deploy_image() { + echo "----------------" + echo "Deploy Image" # 部署镜像阶段开始 + echo "----------------" + + # 设置版本环境变量,供docker-compose使用 + export VERSION=${tag} + + # 使用docker compose启动服务(后台模式) + # -d: 后台运行容器 + # ${serverName}: 只启动指定的服务 + docker compose up -d ${serverName} + echo "" # 输出空行 +} + +# 函数:停止并删除容器和镜像 +delete_image() { + echo "----------------" + echo "Delete Image" # 删除镜像阶段开始 + echo "----------------" + + # 获取当前容器的镜像信息和进程信息 + list_image + list_process + + # 检查镜像是否存在 + if [ "$image_id" != "" ] ; then + # 检查容器进程是否存在 + if [ "$process_id" != "" ] ; then + # 停止正在运行的容器 + echo "Stopping container: $process_id" + docker stop $process_id + + # 删除已停止的容器 + echo "Removing container: $process_id" + docker rm $process_id + + # 强制删除镜像(即使有依赖也强制删除) + echo "Removing image: $image_id" + docker rmi --force $image_id + else + # 如果容器不存在,只删除镜像 + echo "Removing image: $image_id" + docker rmi --force $image_id + fi + else + echo "No image found for: ${serverName}" + fi + echo "" # 输出空行 +} + +# 主程序:根据传入的参数执行不同的操作 +case $1 in + "deploy") # 部署操作 + echo "Starting deployment process for ${serverName}:${tag}" + pull_image # 第一步:拉取镜像 + delete_image # 第二步:删除旧容器和镜像(清理环境) + deploy_image # 第三步:部署新容器 + echo "Deployment completed for ${serverName}:${tag}" + ;; + "delete") # 删除操作 + echo "Starting deletion process for ${serverName}" + delete_image # 删除容器和镜像 + echo "Deletion completed for ${serverName}" + ;; + *) # 默认情况:显示帮助信息 + echo "Invalid command: $1" + desc # 显示使用说明 + ;; +esac + +# 脚本结束 + +# 使用示例: +# ./deploy_env.sh deploy xiaomayi-admin prod-31 +# ./deploy_env.sh delete xiaomayi-admin +# +# 依赖文件: +# .env 文件需要包含以下环境变量: +# DOCKER_REGISTRY_URL=docker仓库地址 +# DOCKER_REGISTRYURL_NAMESPACE=命名空间 +# DOCKER_USERNAME=用户名 +# DOCKER_PASSWORD=密码 +# +# 功能说明: +# 1. 支持多操作系统环境检测 +# 2. 自动加载环境变量配置 +# 3. 提供完整的容器部署流程 +# 4. 支持容器清理和删除 +# 5. 安全的Docker仓库认证 \ No newline at end of file diff --git a/scripts-file/deploy_env.sh b/scripts-file/deploy_env.sh index d41ddaf..bc3214b 100644 --- a/scripts-file/deploy_env.sh +++ b/scripts-file/deploy_env.sh @@ -1,99 +1,170 @@ #!/bin/bash +# 设置脚本执行选项: +# -e: 遇到错误立即退出 +# -u: 遇到未定义变量报错 +# -a: 自动导出所有变量(set -a 表示自动导出,set +a 表示关闭自动导出) set -a + +# 检测操作系统类型并加载环境变量文件 +# 判断是否为 RedHat 或 Rocky Linux 系统 if [ -f /etc/redhat-release ] || [ -f /etc/rocky-release ]; then + # 在 RedHat 系系统上使用 source 命令加载 .env 环境变量文件 source ./.env +# 判断是否为 Debian/Ubuntu 系统(基于LSB标准) elif [ -f /etc/lsb-release ]; then + # 在 Debian 系系统上使用 . 命令加载 .env 环境变量文件 . ./.env else + # 不支持的操作系统提示 echo "Unsupported OS" + exit 1 # 退出脚本,返回错误码 fi + +# 关闭自动导出变量模式 set +a -schema="https://" -serverName=$2 -tag=$3 +# 定义变量 +schema="https://" # 协议方案,默认为HTTPS +serverName=$2 # 第二个参数:服务名称(如 xiaomayi-admin) +tag=$3 # 第三个参数:镜像标签(如 prod-31) +# 函数:显示脚本使用说明和描述信息 desc() { - clear + clear # 清屏 echo "===========================================================" - echo "Deploy Containter" + echo "Deploy Containter" # 脚本用途:部署容器 echo "===========================================================" - echo "version 0.1" - echo "deploy: deploy containter" - echo "delete: delete containter" + echo "version 0.1" # 脚本版本号 + echo "deploy: deploy containter" # 部署命令用法 + echo "delete: delete containter" # 删除命令用法 echo "" echo "===========================================================" - echo press any key to continue && read TEMP && echo ok.. + echo press any key to continue && read TEMP && echo ok.. # 等待用户按键继续 } +# 函数:获取指定容器的镜像名称 list_image() { + # 使用 docker inspect 命令获取容器的镜像名称 + # --format="{{.Config.Image}}" 指定输出格式为镜像名称 image_id=`docker inspect --format="{{.Config.Image}}" ${serverName}` } +# 函数:获取指定容器的进程ID(容器ID) list_process() { + # 使用 docker inspect 命令获取容器的完整ID + # --format="{{.Id}}" 指定输出格式为容器ID process_id=`docker inspect --format="{{.Id}}" ${serverName}` } -#pull镜像 +# 函数:从Docker仓库拉取镜像 pull_image() { echo "----------------" - echo "Pull Image" + echo "Pull Image" # 拉取镜像阶段开始 echo "----------------" + + # 构建完整的镜像名称 + # 格式:仓库URL/命名空间/服务名称 imageName="${DOCKER_REGISTRY_URL}/${DOCKER_REGISTRYURL_NAMESPACE}/${serverName}" + # 登录到Docker仓库(使用密码管道方式,避免密码明文出现在命令行历史中) echo "$DOCKER_PASSWORD" | docker login --username=${DOCKER_USERNAME} --password-stdin ${DOCKER_REGISTRY_URL} + + # 拉取指定标签的镜像 docker pull "${imageName}:${tag}" - echo "" + echo "" # 输出空行 } -#运行镜像 +# 函数:运行镜像(部署容器) deploy_image() { echo "----------------" - echo "Deploy Image" + echo "Deploy Image" # 部署镜像阶段开始 echo "----------------" + + # 设置版本环境变量,供docker-compose使用 export VERSION=${tag} + + # 使用docker compose启动服务(后台模式) + # -d: 后台运行容器 + # ${serverName}: 只启动指定的服务 docker compose up -d ${serverName} - echo "" + echo "" # 输出空行 } -#停掉容器、删除容器、删除镜像 +# 函数:停止并删除容器和镜像 delete_image() { echo "----------------" - echo "Delete Image" + echo "Delete Image" # 删除镜像阶段开始 echo "----------------" + + # 获取当前容器的镜像信息和进程信息 list_image list_process + + # 检查镜像是否存在 if [ "$image_id" != "" ] ; then + # 检查容器进程是否存在 if [ "$process_id" != "" ] ; then - #停掉容器 + # 停止正在运行的容器 + echo "Stopping container: $process_id" docker stop $process_id - #删除容器 + # 删除已停止的容器 + echo "Removing container: $process_id" docker rm $process_id - #删除镜像 + # 强制删除镜像(即使有依赖也强制删除) + echo "Removing image: $image_id" docker rmi --force $image_id else - #删除镜像 + # 如果容器不存在,只删除镜像 + echo "Removing image: $image_id" docker rmi --force $image_id fi + else + echo "No image found for: ${serverName}" fi - echo "" + echo "" # 输出空行 } - -# main program +# 主程序:根据传入的参数执行不同的操作 case $1 in "deploy") - pull_image - delete_image - deploy_image + # 部署操作 + echo "Starting deployment process for ${serverName}:${tag}" + pull_image # 第一步:拉取镜像 + delete_image # 第二步:删除旧容器和镜像(清理环境) + deploy_image # 第三步:部署新容器 + echo "Deployment completed for ${serverName}:${tag}" ;; "delete") - delete_image + # 删除操作 + echo "Starting deletion process for ${serverName}" + delete_image # 删除容器和镜像 + echo "Deletion completed for ${serverName}" ;; - *) - desc + *) + # 默认情况:显示帮助信息 + echo "Invalid command: $1" + desc # 显示使用说明 ;; esac +# 脚本结束 + +# 使用示例: +# ./deploy_env.sh deploy xiaomayi-admin prod-31 +# ./deploy_env.sh delete xiaomayi-admin +# +# 依赖文件: +# .env 文件需要包含以下环境变量: +# DOCKER_REGISTRY_URL=docker仓库地址 +# DOCKER_REGISTRYURL_NAMESPACE=命名空间 +# DOCKER_USERNAME=用户名 +# DOCKER_PASSWORD=密码 +# +# 功能说明: +# 1. 支持多操作系统环境检测 +# 2. 自动加载环境变量配置 +# 3. 提供完整的容器部署流程 +# 4. 支持容器清理和删除 +# 5. 安全的Docker仓库认证 \ No newline at end of file