构建自定义 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 .
- 运行新容器进行测试:
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
- 为下载的文件赋予执行权限:
sudo chmod +x /usr/local/bin/docker-compose
- 测试 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
以上流程图展示了使用这些技术的整体流程,从选择技术开始,到最终检查结果,如果失败则进行问题排查并重新选择技术。希望这个流程图能帮助你更好地理解和应用这些技术。
SQL Server容器化部署实践
超级会员免费看
75

被折叠的 条评论
为什么被折叠?



