Docker最全教程——数据库容器化之持久保存数据(十二)


640?wx_fmt=png 640?wx_fmt=png上一节我们讲述了SQL Server容器化实践( 注意,SQL Server现在也支持跨平台),本节将讲述如何持久保存数据,并且接下来将逐步讲解其他数据库(MySql、Redis、Mongodb等等)的容器化实践,中间再穿插一些知识点和实践细节。由于实践需要花费大量的时间,而目目前业务繁忙,只能加班来进行一些实践并编写,如果编写比较慢,请多多海涵。 640?wx_fmt=png


// 目录//

640?wx_fmt=png




如何持久保存数据?

默认情况下,在容器内创建的所有文件都存储在可写容器层中。这意味着:

· 当该容器不再存在时,数据不会持久存在,并且如果另一个进程需要,则可能很难从容器中获取数据。

· 容器的可写层紧密耦合到运行容器的主机。数据迁移很麻烦。

· 写入容器的可写层需要存储驱动程序来管理文件系统。存储驱动程序使用Linux内核提供统一的文件系统。与直接写入主机文件系统相比,这种额外的抽象降低了性能 。


因此,如果我们使用容器命令docker rm删除了容器,那么容器中的所有内容均将丢失,包括 SQL Server 和数据库文件。对于数据库(不仅仅是SQL Server)来说,了解 Docker 中的数据持久性至关重要那么我们如何在docker中持久保存我们的数据呢,即使关联的容器已经删除的情况下?


使用数据卷持久保存数据库文件

卷是保存Docker容器中的数据的首选机制。虽然绑定挂载依赖于主机的目录结构,但卷完全由Docker管理。主要有如下好处:

· 易于备份或迁移。

· 可以使用Docker CLI命令或Docker API管理卷。

· 适用于Linux和Windows容器。

· 可以在多个容器之间更安全地共享卷。

· 卷驱动程序允许在远程主机或云提供程序上存储卷,加密卷的内容或添加其他功能。

· 新卷可以通过容器预先填充内容。

因此,通常情况下,卷相对于容器的可写层中的持久数据来说是更好的选择,因为卷不会增加容器的大小,并且卷的内容存在于给定容器的生命周期之外。接下来,我们就一起来实践。


640?wx_fmt=png 


方式一,使用主机目录

首先,我们可以将主机目录加载为容器的数据卷,用来存储数据库文件。例如,我们可以通过-v <host directory>:/var/opt/mssql命令参数来完成需求:

PowerShell:

docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=123456abcD" `

   -p 1433:1433 --name mySqlServer `

   -v d:/temp/data:/var/opt/mssql `

   -d mcr.microsoft.com/mssql/server:2017-latest


640?wx_fmt=jpeg 

bash:

docker run -e 'ACCEPT_EULA=Y' \

-e 'SA_PASSWORD=123456abcD' \

-p 1433:1433 \

--name mySqlServer \

-v /temp/data:/var/opt/mssql \

-d mcr.microsoft.com/mssql/server:2017-latest


注意:-v参数应该在-d参数之前。


-v or –volume用于映射卷,冒号“:”前面的目录是宿主机目录,冒号后面的目录是容器内目录。

执行成功后,我们可以看到容器已正常运行,并且主机目录已绑定:

640?wx_fmt=jpeg 

我们启动SSMS工具创建一个数据库,然后打开本地资源管理器即可看到:

640?wx_fmt=jpeg 

接下来,我们删除容器,然后来验证数据库文件是否任然保留:

PowerShell:

set-location D:\temp\data\data

docker stop mySqlServer

docker rm mySqlServer

ls

执行结果如下所示:

640?wx_fmt=jpeg 

值得注意的是,SQL Server会自动从目录/var/opt/mssql挂载数据库,我们可以使用以下步骤来验证:

第一步:

PowerShell:

docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=123456abcD" `

   -p 1433:1433 --name mySqlServer `

   -v d:/temp/data:/var/opt/mssql `

   -d mcr.microsoft.com/mssql/server:2017-latest


docker exec -it mySqlServer "bash"


第二步:

/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '123456abcD'


第三步:

SELECT Name from sys.Databases

GO


640?wx_fmt=jpeg 

注意:SQL Server容器启动时需要一些时间,启动完成后才能连接。


方式二,使用数据卷

我们可以使用docker volume命令来创建卷,然后


PowerShell:

docker volume create my-data

docker volume ls


docker run -e "ACCEPT_EULA=Y" `

   -e "MSSQL_SA_PASSWORD=123456abcD" `

   -p 1433:1433 --name mySqlServer `

   -v my-data:/var/opt/mssql `

   -d mcr.microsoft.com/mssql/server:2017-latest


640?wx_fmt=jpeg 

我们可以使用以下命令来检查数据卷:

docker volume inspect my-data

640?wx_fmt=jpeg 

同样的,我们也可以使用上一节的命令删除容器并再次创建来验证数据是否丢失。这里我们就不做演示了。

Docker最全教程——从理论到实战(一)

Docker最全教程——从理论到实战(二)

Docker最全教程——从理论到实战(三)

Docker最全教程——从理论到实战(四)

Docker最全教程——从理论到实战(五)

Docker最全教程——从理论到实战(六)

Docker最全教程——从理论到实战(七)

Docker最全教程——从理论到实战(八)    

Docker最全教程——从理论到实战(九)

Docker最全教程之使用Tencent&nbsp;Hub来完成CI(十)

Docker最全教程——数据库容器化(十一)

原文地址:https://www.cnblogs.com/nasha/p/10260158.html


 

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg



### 使用 Docker 部署基于 Java 的 CRMDB 应用 #### 准备工作 为了成功部署基于 Java 的 CRMDB 应用程序,需先安装并配置好 DockerDocker Compose 工具。确保环境满足最低硬件需求以及网络连接正常。 #### 构建镜像 构建自定义的 Docker 镜像是第一步。假设已有一个 Maven 或 Gradle 项目结构的应用源码,可以编写 `Dockerfile` 来描述如何打包应用程序到容器中: ```dockerfile FROM openjdk:17-jdk-alpine WORKDIR /app COPY target/my-app.jar my-app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "/app/my-app.jar"] ``` 此脚本指定了基础镜像为 OpenJDK 版本 17,并将编译后的 JAR 文件复制进去作为入口点运行[^1]。 #### 编写 docker-compose.yml 文件 对于多服务架构下的应用(比如包含数据库),可以通过 `docker-compose.yml` 文件来简化管理多个关联的服务实例的过程。下面是一个简单的例子用于说明如何设置 Web 应用及其对应的 MySQL 数据库服务: ```yaml version: '3' services: crmdb-web: build: . ports: - "8080:8080" environment: SPRING_DATASOURCE_URL: jdbc:mysql://crmdb-db:3306/crm?useSSL=false&serverTimezone=UTC SPRING_JPA_HIBERNATE_DDL_AUTO: update depends_on: - crmdb-db crmdb-db: image: mysql:latest environment: MYSQL_ROOT_PASSWORD: example MYSQL_DATABASE: crm volumes: - db-data:/var/lib/mysql volumes: db-data: ``` 这段 YAML 文档定义了一个名为 `crmd-web` 的前端服务和一个名为 `crmdb-db` 后端数据存储节点之间的关系。通过指定依赖项 (`depends_on`) 可以控制启动顺序;而持久化卷则用来保存重要的数据库状态信息防止丢失[^4]。 #### 运行与测试 完成上述准备工作之后,在终端执行如下指令即可一键拉起整个系统: ```bash $ docker-compose up --build ``` 这会自动下载所需的镜像资源、建立必要的网络链接并将所有组件按照设定的方式组合起来共同运作。访问 http://localhost:8080 即可查看正在工作的 CRMDB 应用了。 如果遇到任何问题,如“No DataSource set”,可能是因为 Spring Boot 应用未能正确初始化其数据源连接池。此时建议进入具体的服务容器内部进一步排查错误日志或调整参数配置[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值