22、构建自定义 SQL Server Linux 容器镜像及相关技术实践

SQL Server容器化部署实践

构建自定义 SQL Server Linux 容器镜像及相关技术实践

在容器化部署 SQL Server 时,我们可以通过一系列操作来实现自动化部署和优化镜像构建。下面将详细介绍如何运行脚本恢复数据库备份、使用多阶段构建优化镜像大小,以及利用 Docker Compose 和 YAML 文件管理多容器应用。

运行脚本恢复数据库备份

为了运行 checkbackups_restore.sh 脚本并启动 sqlservr 进程,我们需要在启动脚本中调用它们。以下是启动脚本 startup.sh 的代码:

#!/bin/bash
#Start the script to restore all database backups
#from Docker volume; run script in the background
/tmp/startup/checkbackups_restore.sh &
# Start SQL Server
/opt/mssql/bin/sqlservr

startup.sh 脚本会在后台运行 checkbackups_restore.sh 脚本,然后启动 SQL Server。需要注意的是,这两个脚本都应位于容器内的 /tmp/startup 目录中。因此,我们需要创建该目录并为脚本赋予执行权限。

以下是更新后的 Dockerfile,包含了创建工作目录、复制脚本、赋予权限以及运行启动脚本的步骤:

#Start from custom SQL Server 2017 on Linux image
#running as non-root with command line tools
#NOTE: Use the correct Docker image name
FROM customsql2017oncentoswithtools-nonroot:v1.0
#Create working directory
RUN mkdir -p /tmp/startup
#Copy bash scripts into working directory
# and assign the mssql user as owner
COPY --chown=mssql:0 . /tmp/startup
#Grant executable permissions to bash scripts
RUN chmod +x /tmp/startup/checkbackups_restore.sh
RUN chmod +x /tmp/startup/startup.sh
#Run startup script startup.sh
CMD ["/tmp/startup/startup.sh"]

具体操作步骤如下:
1. 将 Dockerfile checkbackups_restore.sh startup.sh 文件保存到一个目录中。
2. 使用该目录作为构建上下文,运行以下命令构建新的自定义镜像:

docker build -t customsql2017oncentos4dev-nonroot:v1.0 .
  1. 运行新容器进行测试:
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=mYSecUr3PAssw0rd" -p 1433:1433 --name sqldevlinuxcon01 --mount source=sqldbdata,target=/var/opt/mssql -d -h linuxsqldev01 customsql2017oncentos4dev-nonroot:v1.0

容器启动时,会运行 startup.sh 脚本,该脚本会调用 checkbackups_restore.sh 脚本遍历 /var/opt/mssql 目录中的 BAK 文件。由于我们使用的基础镜像已经安装了 SQL Server 命令行工具并运行了 sqlservr 进程,因此可以使用 sqlcmd 并传递 RESTORE DATABASE 命令从备份中恢复数据库。

在处理从生产环境恢复数据库备份到开发环境时,需要注意安全问题。不仅要限制对生产和开发环境的访问,还要采取措施模糊敏感数据。例如,在备份之前对数据进行混淆处理,或者使用专门的服务器对数据进行混淆以供开发环境使用。

多阶段构建优化镜像大小

多阶段构建是一种优化 Docker 镜像构建的技术,它可以在不增加复杂性的情况下减少镜像大小。下面通过一个示例来说明多阶段构建的原理和使用方法。

首先,我们来看一个普通的 Dockerfile,用于构建一个 ASP.NET 核心 Web 应用:

#Use the .NET Core with SDK on Linux image
FROM mcr.microsoft.com/dotnet/core/sdk:2.2
WORKDIR /app
#Copy csproj and restore as distinct layers
COPY belgrade-product-catalog-demo/*.csproj ./belgrade-product-catalog-demo/
RUN dotnet restore ./belgrade-product-catalog-demo/
#Copy everything else and build app
COPY belgrade-product-catalog-demo/. ./belgrade-product-catalog-demo/
WORKDIR /app/belgrade-product-catalog-demo
RUN dotnet publish -c Release -o out

使用这个 Dockerfile 构建的镜像会包含 .NET SDK、源代码和编译后的代码,镜像大小可能会非常大。例如,构建的镜像大小为 1.81GB。

而使用多阶段构建,我们可以只包含生产环境所需的编译代码和依赖项,从而显著减小镜像大小。以下是使用多阶段构建的 Dockerfile:

#Step 1: Use the .NET Core with SDK on Linux image
FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
#Step 2
WORKDIR /app
#Step 3: copy csproj and restore as distinct layers
COPY belgrade-product-catalog-demo/*.csproj ./belgrade-product-catalog-demo/
#Step 4
RUN dotnet restore ./belgrade-product-catalog-demo/
#Step 5 copy everything else and build app
COPY belgrade-product-catalog-demo/. ./belgrade-product-catalog-demo/
#Step 6
WORKDIR /app/belgrade-product-catalog-demo
RUN dotnet publish -c Release -o out
#Step 7:
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
#Step 8
WORKDIR /app
#Step 9
COPY --from=build /app/belgrade-product-catalog-demo/out ./
#Step 10
EXPOSE 5000
#Step 11
ENTRYPOINT ["dotnet", "belgrade-product-catalog-demo.dll"]

在这个 Dockerfile 中,我们使用了两个 FROM 指令,分别定义了 build runtime 阶段。 build 阶段用于编译代码,而 runtime 阶段只复制编译后的代码和依赖项。最终构建的镜像大小仅为 262MB,相比之前的 1.81GB 有了显著的减小。

多阶段构建的流程可以用以下 mermaid 流程图表示:

graph LR
    A[开始] --> B[build 阶段: 编译代码]
    B --> C[生成 out 目录]
    C --> D[runtime 阶段: 复制 out 目录]
    D --> E[暴露端口并设置入口点]
    E --> F[构建最终镜像]
    F --> G[结束]

多阶段构建通过只包含生产环境所需的内容,避免了将开发工具和源代码包含在最终镜像中,从而优化了镜像大小。如果你想了解更多关于多阶段构建的信息,可以参考 https://docs.docker.com/develop/develop-images/multistage-build/

在 SQL Server 领域,虽然通常不需要为了部署数据库而构建多容器应用,但对于多实例架构(如 SQL Server Always On 可用性组或 SQL Server 复制),可能需要部署到高可用性平台,如 Kubernetes。不过,Kubernetes 的内容超出了本文的范围。

Docker Compose 和 YAML 文件管理多容器应用

Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具,而 YAML 文件则用于描述应用的服务、网络和卷等配置。

安装 Docker Compose

可以在 Linux Docker 主机或能远程连接到 Docker 主机的开发机器上安装 Docker Compose。以下是在 Linux Docker 主机上安装的步骤:
1. 下载当前稳定版本的 Docker Compose:

sudo curl -L "https://github.com/docker/compose/releases/download/1.25.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  1. 为下载的文件赋予执行权限:
sudo chmod +x /usr/local/bin/docker-compose
  1. 测试 Docker Compose 是否安装成功:
docker-compose –version
创建 YAML 文件管理多容器应用

我们以一个简单的两层应用为例,该应用包含一个运行在 ASP.NET Core 上的 Web 前端和一个后端 SQL Server 数据库。以下是对应的 YAML 文件 docker-compose.yml 的内容:

version: "3"
services:
    wfe:
        build: ./mssql-aspcore-example-app
        ports:
            - "8080:5000"
        depends_on:
            - db
    db:
        build: ./mssql-aspcore-example-db
        environment:
            SA_PASSWORD: "mYSecUr3PAssw0rd"
            ACCEPT_EULA: "Y"
        ports:
            - "1500:1433"

对 YAML 文件的详细分析如下:
- version :指定 Compose 文件使用的版本号,用于语法验证。版本 3 适用于 Docker 引擎版本 1.13.0 及更高版本。
- services :描述多容器应用中要运行的不同服务,这里包括 wfe db 服务。 db 服务的名称与 appsettings.json 文件中定义的数据库连接字符串相对应。
- build :类似于 docker build 命令,指示 Docker Compose 在指定目录中查找 Dockerfile 来构建服务的镜像。
- ports :类似于 docker run 命令中的 -p 参数,将容器的 TCP 端口发布到主机。 wfe 服务使用主机的 8080 端口映射到容器的 5000 端口, db 服务使用 1500 端口,也可以选择不定义 ports ,默认使用 1433 端口。
- depends_on :设置服务之间的依赖关系。在这个例子中, wfe 服务依赖于 db 服务,因此 Docker Compose 会先启动 db 服务,再启动 wfe 服务。但需要注意的是,Docker Compose 不会等待容器完全就绪才启动依赖的容器,只是等待容器开始运行。
- environment :类似于 docker run 命令中的 -e 参数,用于传递环境变量。这里传递了运行 SQL Server 实例所需的两个环境变量。

保存 docker-compose.yml 文件后,运行以下命令启动服务:

docker-compose up

Docker Compose 在执行过程中会完成以下任务:
1. 创建网络 :Docker 会为两个容器创建一个桥接网络,使它们能够相互通信。默认情况下,Docker Compose 会为应用创建一个单一的 Docker 网络。
2. 构建镜像 :根据对应的 Dockerfile 构建 wfe db 镜像。由于 wfe 依赖于 db ,会先构建 db 镜像。如果镜像已经存在,Docker 会直接使用现有镜像。默认情况下,镜像名称的格式为 directoryName_service:latest
3. 创建并启动容器 :根据构建的镜像创建并启动对应的容器。先创建并运行 db 容器,然后是 wfe 容器。

使用 Docker Compose 和 YAML 文件可以方便地管理多容器应用的部署和配置。但需要注意 YAML 文件的格式,有时可能需要使用 YAML 解析器来确保格式正确,例如 https://codebeautify.org/yaml-validator

通过以上步骤,我们可以实现自动化部署 SQL Server 实例、优化 Docker 镜像大小以及管理多容器应用,提高开发和部署的效率。

构建自定义 SQL Server Linux 容器镜像及相关技术实践(续)

总结与最佳实践

在前面的内容中,我们详细介绍了如何运行脚本恢复数据库备份、使用多阶段构建优化镜像大小以及利用 Docker Compose 和 YAML 文件管理多容器应用。下面将对这些技术进行总结,并给出一些最佳实践建议。

技术总结
技术 作用 关键步骤
运行脚本恢复数据库备份 自动化恢复数据库备份,启动 SQL Server 进程 创建启动脚本,设置脚本权限,构建自定义镜像,运行容器
多阶段构建 优化 Docker 镜像大小,减少不必要的内容 使用多个 FROM 指令,分离编译和运行阶段,复制必要的文件
Docker Compose 和 YAML 文件 简化多容器应用的部署和管理 安装 Docker Compose,创建 YAML 文件描述服务,运行 docker-compose up 启动服务
最佳实践建议
  • 数据库备份恢复
    • 安全第一 :在从生产环境恢复备份到开发环境时,务必采取措施保护敏感数据,如数据混淆、访问控制等。
    • 脚本测试 :在正式使用脚本恢复备份之前,先在测试环境中进行充分测试,确保脚本的正确性和稳定性。
  • 多阶段构建
    • 按需复制 :只复制生产环境所需的文件和依赖项,避免将开发工具和源代码包含在最终镜像中。
    • 合理命名 :为每个阶段使用有意义的别名,方便在 Dockerfile 中引用和管理。
  • Docker Compose 和 YAML 文件
    • 格式检查 :使用 YAML 解析器检查 YAML 文件的格式,避免因格式错误导致的问题。
    • 依赖管理 :合理设置服务之间的依赖关系,确保容器按正确的顺序启动。
未来展望

随着容器技术的不断发展,我们可以预见在 SQL Server 容器化部署方面会有更多的创新和改进。以下是一些可能的发展方向:

  • 更智能的自动化 :未来的工具和脚本可能会更加智能,能够自动检测备份文件的变化,自动恢复数据库,减少人工干预。
  • 集成更多服务 :与更多的云服务和容器编排工具集成,如 Kubernetes、AWS ECS 等,实现更高级的部署和管理。
  • 性能优化 :不断优化容器的性能,减少资源消耗,提高数据库的响应速度和吞吐量。
常见问题解答

在使用上述技术过程中,可能会遇到一些常见问题,下面为你解答。

数据库备份恢复问题
  • 问题 :脚本运行失败,无法恢复数据库备份。
  • 解答 :检查脚本的权限是否正确,备份文件是否存在且格式正确,SQL Server 命令行工具是否安装并可用。
多阶段构建问题
  • 问题 :最终镜像大小仍然很大,没有达到预期的优化效果。
  • 解答 :检查是否复制了不必要的文件,确保只复制生产环境所需的内容。可以使用 docker history 命令查看镜像的构建历史,找出占用空间较大的层。
Docker Compose 和 YAML 文件问题
  • 问题 :容器无法正常启动,提示依赖服务未就绪。
  • 解答 :由于 Docker Compose 不会等待容器完全就绪才启动依赖的容器,你可以在应用代码中添加等待逻辑,或者使用第三方工具(如 wait-for-it.sh )来确保依赖服务就绪后再启动应用。
总结

通过本文的介绍,你学习了如何构建自定义 SQL Server Linux 容器镜像,包括运行脚本恢复数据库备份、使用多阶段构建优化镜像大小以及利用 Docker Compose 和 YAML 文件管理多容器应用。同时,我们还给出了技术总结、最佳实践建议、未来展望和常见问题解答。希望这些内容能够帮助你更好地进行 SQL Server 容器化部署,提高开发和运维效率。

在实际应用中,你可以根据自己的需求和场景选择合适的技术和方法。不断探索和实践,相信你会在容器化部署领域取得更好的成果。

如果你对本文内容有任何疑问或建议,欢迎在评论区留言讨论。

graph LR
    A[开始] --> B[选择技术]
    B --> C{数据库备份恢复}
    B --> D{多阶段构建}
    B --> E{Docker Compose 和 YAML 文件}
    C --> F[创建脚本和镜像]
    D --> G[编写多阶段 Dockerfile]
    E --> H[安装和配置 Docker Compose]
    F --> I[运行容器恢复备份]
    G --> J[构建优化镜像]
    H --> K[创建 YAML 文件并启动服务]
    I --> L[检查备份恢复结果]
    J --> M[验证镜像大小]
    K --> N[检查容器运行状态]
    L --> O{是否成功}
    M --> O
    N --> O
    O --> P[结束]
    O --> Q{失败}
    Q --> R[排查问题]
    R --> B

以上流程图展示了使用这些技术的整体流程,从选择技术开始,到最终检查结果,如果失败则进行问题排查并重新选择技术。希望这个流程图能帮助你更好地理解和应用这些技术。

内容概要:本文介绍了一个基于冠豪猪优化算法(CPO)的无人机三维路径规划项目,利用Python实现了在复杂三维环境中为无人机规划安全、高效、低能耗飞行路径的完整解决方案。项目涵盖空间环境建模、无人机动力学约束、路径编码、多目标代价函数设计以及CPO算法的核心实现。通过体素网格建模、动态障碍物处理、路径平滑技术和多约束融合机制,系统能够在高维、密集障碍环境下快速搜索出满足飞行可行性、安全性与能效最优的路径,并支持在线重规划以适应动态环境变化。文中还提供了关键模块的代码示例,包括环境建模、路径评估和CPO优化流程。; 适合人群:具备一定Python编程基础和优化算法基础知识,从事无人机、智能机器人、路径规划或智能优化算法研究的相关科研人员与工程技术人员,尤其适合研究生及有一定工作经验的研发工程师。; 使用场景及目标:①应用于复杂三维环境下的无人机自主导航与避障;②研究智能优化算法(如CPO)在路径规划中的实际部署与性能优化;③实现多目标(路径最短、能耗最低、安全性最高)耦合条件下的工程化路径求解;④构建可扩展的智能无人系统决策框架。; 阅读建议:建议结合文中模型架构与代码示例进行实践运行,重点关注目标函数设计、CPO算法改进策略与约束处理机制,宜在仿真环境中测试不同场景以深入理解算法行为与系统鲁棒性。
在科技快速演进的时代背景下,移动终端性能持续提升,用户对移动应用的功能需求日益增长。增强现实、虚拟现实、机器人导航、自动驾驶辅助、手势识别、物体检测与距离测量等前沿技术正成为研究与应用的热点。作为支撑这些技术的核心,双目视觉系统通过模仿人类双眼的成像机制,同步获取两路图像数据,并借助图像处理与立体匹配算法提取场景深度信息,进而生成点云并实现三维重建。这一技术体系对提高移动终端的智能化程度及优化人机交互体验具有关键作用。 双目视觉系统需对同步采集的两路视频流进行严格的时间同步与空间校正,确保图像在时空维度上精确对齐,这是后续深度计算与立体匹配的基础。立体匹配旨在建立两幅图像中对应特征点的关联,通常依赖复杂且高效的计算算法以满足实时处理的要求。点云生成则是将匹配后的特征点转换为三维空间坐标集合,以表征物体的立体结构;其质量直接取决于图像处理效率与匹配算法的精度。三维重建基于点云数据,运用计算机图形学方法构建物体或场景的三维模型,该技术在增强现实与虚拟现实等领域尤为重要,能够为用户创造高度沉浸的交互环境。 双目视觉技术已广泛应用于多个领域:在增强现实与虚拟现实中,它可提升场景的真实感与沉浸感;在机器人导航与自动驾驶辅助系统中,能实时感知环境并完成距离测量,为路径规划与决策提供依据;在手势识别与物体检测方面,可精准捕捉用户动作与物体位置,推动人机交互设计与智能识别系统的发展。此外,结合深度计算与点云技术,双目系统在精确距离测量方面展现出显著潜力,能为多样化的应用场景提供可靠数据支持。 综上所述,双目视觉技术在图像处理、深度计算、立体匹配、点云生成及三维重建等环节均扮演着不可或缺的角色。其应用跨越多个科技前沿领域,不仅推动了移动设备智能化的发展,也为丰富交互体验提供了坚实的技术基础。随着相关算法的持续优化与硬件性能的不断提升,未来双目视觉技术有望在各类智能系统中实现更广泛、更深层次的应用。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值