GVKun编程网logo

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

13

对于Docker最全教程——数据库容器化之持久保存数据感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍十一,并为您提供关于Docker数据卷-Docker容器数据持久化方式、Docker最全教程

对于Docker 最全教程 —— 数据库容器化之持久保存数据感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍十一,并为您提供关于Docker 数据卷-Docker容器数据持久化方式、Docker 最全教程 —— 从理论到实战(二)、Docker 最全教程 —— 数据库容器化之持久保存数据(十二)、Docker 最全教程之 Python 爬网实战 (二十一)的有用信息。

本文目录一览:

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

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

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

目录

  

如何持久保存数据?

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

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

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

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

 

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

 

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

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

・ 易于备份或迁移。

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

・ 适用于 Linux 和 Windows 容器。

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

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

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

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

 

 

方式一,使用主机目录

首先,我们可以将主机目录加载为容器的数据卷,用来存储数据库文件。例如,我们可以通过 - 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

 

 

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 用于映射卷,冒号 “:” 前面的目录是宿主机目录,冒号后面的目录是容器内目录。

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

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

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

PowerShell:

set-location D:\temp\data\data

docker stop mySqlServer

docker rm mySqlServer

ls

执行结果如下所示:

值得注意的是,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

 

 

注意: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

 

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

docker volume inspect my-data

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

Docker 数据卷-Docker容器数据持久化方式

Docker 数据卷-Docker容器数据持久化方式

以tomcat为例,若是我们需要启动一个docker tomcat 容器,并将我们的工程放进tomcat启动

在没有数据卷的情况下,我们所采用的方式:

利用dockerfile将工程拷贝到tomcat 的 webapps目录下创建一个新的镜像,然后通过这个新的镜像来创建容器并启动,以此部署。

这种方式固然好用,但是却需要创建新的镜像,假如需要部署新的工程,又要创建新的镜像。很麻烦

而且,这种方式会造成重复写的问题,就是我们的工程文件实质上在docker容器和宿主机上写入了两次。造成性能损耗。

还有一个最问题就是,当我们在启动的工程中进行,将文件上传到服务器的操作,实际上我们的文件时上传到了docker容器中,而当容器被删除时,我们所上传的文件就丢失了。这就造成了数据无法持久化的问题。

那么数据卷是如何解决这个问题的呢?

首先演示一下数据卷的使用方式:

创建 index.html 文件,并写入 hello Docker!

root@ubuntu_server:/usr/local/docker/tomcat/ROOT# echo hello Docker! >index.html

启动以数据卷方式启动官方tomcat镜像

docker run -p8082:8080 -d --name tomcat4 -v /usr/local/docker/tomcat/ROOT:/usr/local/tomcat/webapps/ROOT tomcat:jdk8

如上命令中 可以看到 同以往启动docker容器的命令不同之处在于 加了 这串 -v /usr/local/docker/tomcat/ROOT:/usr/local/tomcat/webapps/ROOT

这就是数据卷的使用方式,通过这串命令,我们将tomcat容器中的webapps/ROOT 目录内容,替换为 我们这宿主机上创建的/ROOT 目录内容。

实际上也没有替换只是将宿主机上这个文件夹创建为数据卷,然后将 tomcat容器上的/ROOT目录指向了这个数据卷。

通过这种方式,当我们修改了容器上该目录内容时,数据卷的内容也会改变,这就实现了容器数据的持久化。



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

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

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

上篇内容链接: https://www.cnblogs.com/codelove/p/10030439.html

Docker ASP.NET Core

Docker 正在逐渐成为容器行业的事实标准,受到 Windows Linux 生态系统领域最重要供应商的支持。 (Microsoft 是支持 Docker 的主要云供应商之一。)现在Docker 基本上已经各大云或本地的任何数据中心普及

如何将.NET 程序托管到 Docker 之中,相信这是广大.NET 开发者的一个疑问。事实上,.NET Framework 支持在 Docker 中运行,但是仅能在 windows 容器中运行,这并不符合我们的预期,因此,本篇我们只侧重于讨论 ASP.NET Core Docker

在使用之前,笔者还是有必要介绍下 ASP.NET Core。如果您对此非常熟悉和了解或者对此节不感兴趣,可以跳过本节。

 

ASP.NET Core 简介

ASP.NET Core 是一个跨平台的高性能开源框架,用于生成基于云且连接 Internet 的新式应用程序。使用 ASP.NET Core我们可以:

    • 建置 Web 应用程序和服务、IoT 应用和移动后端。

    • 能够在 Windows、macOS 和 Linux 上进行开发和运行。部署到云或本地。

    • 在 .NET Core 或 .NET Framework 上运行。

    • 能够在 IIS、Nginx、Apache、Docker 上进行托管或在自己的进程中进行自托管我们的应用。

 

 

性能是.NET Core 的一个关键特性,这里有必要介绍下。在这块,我们摘取了一份社区的测试汇总统计,仅供参考:

 

具体过程大家可以访问此链接来查看详情:https://www.cnblogs.com/savorboard/archive/2016/10/17/dotnet-benchmarks.html

 

ASP.NET Core Docker

 

刚才说了这么多,我们回到主题。.NET Core 天生就为跨平台设计,并且和 Docker 搭配非常友好,而且微软官方在这块提供了很多支持。比如说:

 

  • 轻量
  • 跨平台,天生对 Linux 友好
  • 模块化
  • 提供了轻量型容器镜像高性能(领先于 Java servletsGo node.js

 

 

 

接下来,我们一起来了解官方镜像。ASP.NET Core 的官方镜像名称为 microsoft/aspnetcore,微软针对 Docker 上的 ASP.NET Core 应用进行了优化,因此容器可以更快启动。为开发人员生成 Docker 镜像时,Microsoft 侧重于提供了以下主要方案:

 

  1. 用于开发和生成 .NET Core 应用的镜像
  2. 用于运行 .NET Core 应用的镜像

 

例如.NET Core 2.1,官方提供的镜像:

为什么是多个镜像?因为在开发、生成和运行容器化应用程序时,通常具有不同的优先级。 通过为这些单独的任务提供不同的镜像,有助于独立优化开发、生成和部署应用程序的过程。在开发期间,我们侧重的是开发更改的速度以及调试的能力。在生产环境,我们侧重的是应用部署和容器启动的速度和效率。

 

这里我们顺便提下我们基于.NET Core 2.1 开发的免费开源框架 ——Magicodes.Admin,其 demo 现在已经完全托管在 Docker 之中,部署在腾讯云的容器服务之中,大家可以点击访问测试下速度和稳定性,启动速度这点没得说。推荐访问 Https 地址,因域名在备案之中,http 域名可能无法访问。

Magicodes.Admin 开源库地址:https://gitee.com/xl_wenqiang/Magicodes.Admin.Core

 

Demo 地址:https://demoadmin.xin-lai.com

Admin

123456abcD

 

在本篇 Docker 教程中,我们会结合 Magicodes.Admin 的实践进行讲解,同时我们也会尽量提供一些实践案例分享给大家,比如 Magicodes.Admin demo、Magicodes 云服务、小程序商城(即将开源)、爱车 APP 等 Docker 完整托管案例,以便大家更易于理解和使用 Docker。在 Magicodes.Admin 框架中,接口服务使用.NET Core 2.1 开发,在 docker 上基于 microsoft/dotnet:2.1-aspnetcore-runtime 镜像使用 Kestrel web 服务器,后台前端使用 Angular 开发,在 docker 上基于 nginx 镜像使用 nginx 服务器进行托管,并启用了 HTTPS 支持和 GZIP 压缩。

我们回过来继续。.NET 镜像 (microsoft/dotnet) 同样适用于基于 .NET Core 的控制台应用。使用 Docker 和 .NET Core 非常适用于生产部署和托管,主要有以下几点:

  • 无需本地安装 —— 可以直接使用 .NET Framework,而无需本地安装。只下载相关的 Docker 镜像,其中包含 .NET Framework。

  • 在容器中开发 —— 你可以在一致的环境中开发,使开发和生产环境类似(可避免一些问题,例如开发人员计算机上的全局状态)。 通过 VS 的一些扩展插件,我们甚至可以直接从 Visual Studio 启动容器。

  • 容器中测试 —— 可以在容器中测试,减少由于环境配置不当或上次测试遗留的其他更改而导致的故障。

  • 在容器中生成 —— 可以在容器中生成代码。

  • 在所有环境中部署 —— 可以通过你的所有环境部署镜像。 这种方法减少了配置差异导致的故障,通常通过外部配置(例如,注入的环境变量)改变镜像行为。

注意:

Docker 镜像容器可以在 Linux 和 Windows 上本机运行。 但是,Windows 镜像仅能在 Windows 主机上运行,Linux 镜像可以在 Linux 主机和 Windows 主机上运行(到目前为止,使用 Hyper-V Linux VM),其中主机是指服务器或 VM。

注意:

.NET Framework 也可以使用 Docker 进行托管,不过仅能托管到 windows 容器之中。

在具体应用和实践之前,我们有必要了解以下内容。

 

Kestrel

Kestrel 是一个基于 libuv 的跨平台 ASP.NET Core web 服务器,libuv 是一个跨平台的异步 I/O 库。ASP.NET Core 模板项目使用 Kestrel 作为默认的 web 服务器。

Kestrel 支持以下功能:

  • HTTPS

  • 用于启用不透明升级的 WebSockets

  • 位于 Nginx 之后的高性能 Unix sockets

Kestrel 被.NET Core 支持的所有平台和版本所支持。Kestrel 可以单独使用,也可以与反向代理服务器(如 IIS、Nginx 或 Apache)一起使用。 反向代理服务器接收到来自 Internet 的 HTTP 请求,并在进行一些初步处理后将这些请求转发到 Kestrel。

在没有 Kestrel 或自定义服务器实现的情况下,不能使用 IIS、Nginx 和 Apache。 ASP.NET Core 设计为在其自己的进程中运行,以实现跨平台统一操作。 IIS、Nginx 和 Apache 规定自己的启动过程和环境。 若要直接使用这些服务器技术,ASP.NET Core 必须满足每个服务器的需求。 使用 Kestrel 等 Web 服务器实现时,ASP.NET Core 可以控制托管在不同服务器技术上的启动过程和环境。

注意:

Kestrel 可以单独使用,也可以与反向代理服务器(如 IIS、Nginx 或 Apache)一起使用。在 docker 容器中,我们推荐使用 Kestrel。

在大部分情况下,我们推荐使用反向代理服务器。主要是有以下好处:

  • 可以限制所承载的应用中的公开的公共外围应用。

  • 可以提供额外的配置和防护层。

  • 可以更好地与现有基础结构集成。

  • 可以简化负载均衡和 SSL 配置。 仅反向代理服务器需要 SSL 证书,并且该服务器可使用普通 HTTP 在内部网络上与应用服务器通信。

说了这么多,总归还是 “纸上得来终觉浅,绝知此事要躬行”。我们来一起实践:

首先我们需要安装以下包:

Install-Package Microsoft.AspNetCore.Server.Kestrel -Version 2.1.3

然后就可以编写启动代码:

在上面的代码中,我们通过了配置文件来配置 Kestrel,我们也推荐大家使用配置文件来配置 Kestrel。相关配置 Demo 如下:

当然,我们也可以通过代码来配置 kestrel:

 

按环境加载配置

ASP.NET Core 基于使用环境变量的运行时环境配置应用行为。ASP.NET Core 在应用启动时读取环境变量 ASPNETCORE_ENVIRONMENT,并将该值存储在 IHostingEnvironment.EnvironmentName 中。 ASPNETCORE_ENVIRONMENT 可设置为任意值,但框架支持三个值:Development、Staging 和 Production。 如果未设置 ASPNETCORE_ENVIRONMENT,则默认为 Production。

注意:

在 Docker 容器中,我们经常会修改 ASPNETCORE_ENVIRONMENT 环境变量来模拟开发、测试和生产环境。

因此在代码中,我们可以根据环境变量来启用或关闭相应的功能,其中场景最广泛的一点是 —— 根据不同的环境加载不同的配置。同时,内置的环境变量配置提供程序(EnvironmentVariablesConfigurationProvider)还可以在运行时从环境变量键值对加载配置。具体见以下代码:

 

内置的日志记录提供程序

ASP.NET Core 提供以下内置日志记录提供程序,在很多情况下,对我们会很有帮助:

  • 控制台日志提供程序

  • 调试日志提供程序

  • EventSource 日志提供程序

  • EventLog 日志提供程序

 

控制台日志提供程序

在 Docker 环境下,为了便于排错,我们推荐启用此日志提供程序。在平常的情况下,我们通过控制台运行程序(比如通过 dotnet run 运行)也会输出控制台日志。在使用之前,需要安装以下包:

Install-Package Microsoft.Extensions.Logging.Console -Version 2.1.1

然后我们可以在代码中通过以下代码启用:

logging.AddConsole();

完整代码如图所示:

添加了之后,我们在云端的容器服务的日志中,就可以看到控制台日志了。下面以腾讯云容器服务为例。首先打开腾讯云【容器服务】的【服务】页面,如图所示:

我们可以点击【日志】操作按钮的图标来查看日志:

 

我们也可以点击具体的某个实例来查看相关日志,这里就不多写了。

注意:

通过控制台日志,我们可以输出一些启动信息以用来做启动诊断,同时我们也可以根据控制台日志来查看请求状况和运行状况。

 

调试日志提供程序

和控制台日志一样,也需要安装相关依赖包:

Install-Package Microsoft.Extensions.Logging.Debug -Version 2.1.1

该包使用 System.Diagnostics.Debug 类(Debug.WriteLine 方法调用)来写入日志输出。注意,在 Linux 中,此提供程序将日志写入 /var/log/message

代码启用方式如下所示:

logging.AddDebug();

 

EventSource 日志提供程序

包依赖关系如下:

Install-Package Microsoft.Extensions.Logging.EventSource -Version 2.1.1

该提供程序可实现事件跟踪。不过值得注意的是,该提供程序尚无支持 Linux 或 macOS 的事件集合和显示工具。期待官方提供相关工具。

而在 windows server,可以通过开源工具 https://github.com/Microsoft/perfview 来收集和查看日志,如下图所示:

 

EventLog 日志提供程序

需要添加包:Microsoft.Extensions.Logging.EventLog。

主要用于向 Windows 事件日志发送日志输出。

 

关于 ASP.NET Core 的相关内容,我们先介绍到这里。接下来我们主要是围绕 Docker 开发工作流程在进行讲解。

 

搭建并使用 Docker

Docker 的安装非常简单,我们这里仅以 windows 10 操作系统(推荐)为例进行讲解。

 

安装 Docker

这里以 Docker for windows 为例,其他环境请参考官网教程。

注意:

不推荐使用 Docker Toolbox,Docker Toolbox 适用于较旧的 Mac 和 Windows 系统。

要安装 Docker,请先查看用于 Windows 的 Docker:安装须知了解相关信息。

安装须知链接:https://docs.docker.com/docker-for-windows/install/#what-to-know-before-you-install

注意:

使用 Docker for windows 需要启用 Hyper-V 功能。以下是系统要求:

  • Windows 10 64 位:Pro,Enterprise 或 Education(Build 14393 或更高版本)。

  • 在 BIOS 中启用虚拟化。通常,默认情况下启用虚拟化。这与启用 Hyper-V 不同。

  • 支持 CPU SLAT 的功能。

  • 至少 4GB 的 RAM。

Docker for Windows 安装包括:安装提供 Docker Engine,Docker CLI 客户端,Docker Compose,Docker Machine 和 Kitematic。

安装包下载链接:https://store.docker.com/editions/community/docker-ce-desktop-windows

参考:https://docs.docker.com/docker-for-windows/

安装完后,会提示点击重启电脑。重启后会自动启动 Docker 程序,如果弹出下图所示提示,则需要在 Windows 功能中启用 Hyper-V 功能和 在 BIOS CPU 配置中打开 “虚拟化配置”,打开之后,如下图所示,虚拟化会显示已启用。反之安装成功。

注意虚拟化已启用,如下图所示(这里秀一把我 NB 的台式机,是不是比你们的服务器都高端 N 个档次):

以上配置完成后我们推荐将 docker 容器切换到 Linux 环境,选择右下角 Docker 图标右键选择” Switch to Linux containers” 进行切换,如果显示” Switch to Windows containers” 则已处于 Linux 容器。

这是我们可以测试 Docker 环境是否正常,打开命令行,输入 docker –version:

注意:

我们推荐使用 Linux 容器服务,因为目前主流的容器系统是 Linux,并且从资源的利用来说,Linux 可以让资源得到更大的利用。

 

关于 docker 的安装和配置,这里不再细说,大家可以关注我们的公众号 “magiccodes“来查阅相关的教程以及录屏。

 

配置 Docker 本地环境

安装完成并且启动后,右下角有个小图标:

右键打开设置。

Docker for Windows 中的共享驱动器必须配置为支持卷映射和调试。右键单击系统托盘中的 Docker 图标,单击 “设置”,然后选择 “共享驱动器”。 选择 Docker 存储文件的驱动器。 单击 “应用”。

其他的配置我们这里就不多说了,具体见公众号 “magiccodes” 中提供的录屏教程。

 

运行一个简单的 demo

我们先运行官方的 Hello world 示例:

docker run hello-world

我们也可以简单运行一个 web 示例,比如:

docker run --name aspnetcore_sample --rm -it -p 8000:80 microsoft/dotnet-samples:aspnetapp

应用程序启动后,使用浏览器打开 http://localhost:8000,即可看到以下界面:

Docker 的安装和配置在 Windows 10 操作系统下非常简单,我们也极力推荐大家使用此环境。毕竟,一个好的开发环境可以大大提高大家的使用和开发效率。

 

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

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


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


//
目录
//




如何持久保存数据?

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

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

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

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


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


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

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

· 易于备份或迁移。

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

· 适用于 Linux 和 Windows 容器。

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

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

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

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


 


方式一,使用主机目录

首先,我们可以将主机目录加载为容器的数据卷,用来存储数据库文件。例如,我们可以通过 - 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


 

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 用于映射卷,冒号 “:” 前面的目录是宿主机目录,冒号后面的目录是容器内目录。

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

 

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

 

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

PowerShell:

set-location D:\temp\data\data

docker stop mySqlServer

docker rm mySqlServer

ls

执行结果如下所示:

 

值得注意的是,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


 

注意: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


 

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

docker volume inspect my-data

 

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

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



本文分享自微信公众号 - dotNET 跨平台(opendotnet)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与 “OSC 源创计划”,欢迎正在阅读的你也加入,一起分享。

Docker 最全教程之 Python 爬网实战 (二十一)

Docker 最全教程之 Python 爬网实战 (二十一)

Python 目前是流行度增长最快的主流编程语言,也是第二大最受开发者喜爱的语言(参考 Stack Overflow 2019 开发者调查报告发布)。笔者建议.NET、Java 开发人员可以将 Python 发展为第二语言,一方面 Python 在某些领域确实非常犀利(爬虫、算法、人工智能等等),另一方面,相信我,Python 上手完全没有门槛,你甚至无需购买任何书籍!

由于近期在筹备 4.21 的长沙开发者大会,耽误了不少时间。不过这次邀请到了腾讯资深技术专家、.NET 中国社区领袖,微软 MVP 张善友;52ABP 开源框架的作者,微软 MVP 梁桐铭;知名技术类作家汪鹏,腾讯高级工程师卓伟,腾讯云高级产品经理胡李伟等等,有兴趣参加的朋友可以点击公众号菜单【联系我们】==>【报名】进行报名,技术不分语言,亦没有界限,期待和你分享、交流!

目录

关于 Python

官方镜像

使用 Python 抓取博客列表

需求说明

了解 Beautiful Soup

分析并获取抓取规则

编写代码实现抓取逻辑

编写 Dockerfile

运行并查看抓取结果

 

关于 Python

Python 是一种计算机程序设计语言。是一种动态的、面向对象的脚本语言,最初被设计用于编写自动化脚本 (shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。Python 目前是流行度增长最快的主流编程语言,也是第二大最受开发者喜爱的语言(参考 Stack Overflow 2019 开发者调查报告发布)

Python 是一种解释型脚本语言,可以应用于以下领域:

  • Web 和 Internet 开发
  • 科学计算和统计
  • 教育
  • 桌面界面开发
  • 软件开发
  • 后端开发

Python 学习起来没有门槛,但是通过它,你可以用更短的时间,更高的效率学习和掌握机器学习,甚至是深度学习的技能。不过单单只会 Python 对大多数人来说是不行的,你最好还掌握一门静态语言(.NET/Java)。同时,笔者也建议.NET、Java 开发人员可以将 Python 发展为第二语言,一方面 Python 在某些领域确实非常犀利(爬虫、算法、人工智能等等),另一方面,相信我,Python 上手完全没有门槛,你甚至无需购买任何书籍!

 

官方镜像

官方镜像地址:https://hub.docker.com/_/python

注意,请认准官方镜像:

 

使用 Python 抓取博客列表

需求说明

本篇使用 Python 来抓取我的博客园的博客列表,打印出标题、链接、日期和摘要。

博客地址:http://www.cnblogs.com/codelove/

内容如下所示:

 

了解 Beautiful Soup

Beautiful Soup 是一个可以从 HTML 或 XML 文件中提取数据的 Python 库,支持多种解析器。Beautiful Soup 简单的说,就是一个灵活又方便的网页解析库,是一个爬网利器。本篇教程我们就基于 Beautiful Soup 来抓取博客数据。

Beautiful Soup 官方网站:https://beautifulsoup.readthedocs.io

 主要解析器说明:

分析并获取抓取规则

首先我们使用 Chrome 浏览器打开以下地址:http://www.cnblogs.com/codelove/

然后按下 F12 打开开发人员工具,通过工具我们梳理了以下规则:

  • 博客块(div.day)

 

  • 博客标题 (div. postTitle a)

 

  • 其他内容获取,如日期、博客链接、简介,这里我们就不截图了。

 

然后我们通过观察博客路径,获取到 url 分页规律:

根据以上分析,我们胸有成竹,开始编码。

编写代码实现抓取逻辑

在编码前,请阅读 BeautifulSoup 官方文档。然后根据需求,我们编写 Python 的代码如下所示:

# 关于BeautifulSoup,请阅读官方文档:https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/#id52

from bs4 import BeautifulSoup

import os

import sys

import requests

import time

import re

url = "https://www.cnblogs.com/codelove/default.html?page={page}"

 

#已完成的页数序号,初时为0

page = 0

while True:

    page += 1

    request_url = url.format(page=page)

    response = requests.get(request_url)

    #使用BeautifulSoup的html5lib解析器解析HTML(兼容性最好)

    html = BeautifulSoup(response.text,''html5lib'')

 

    #获取当前HTML的所有的博客元素

    blog_list = html.select(".forFlow .day")

 

    # 循环在读不到新的博客时结束

    if not blog_list:

        break

 

    print("fetch: ", request_url)

 

    for blog in blog_list:

        # 获取标题

        title = blog.select(".postTitle a")[0].string

        print(''--------------------------''+title+''--------------------------'');

 

        # 获取博客链接

        blog_url = blog.select(".postTitle a")[0]["href"]

        print(blog_url);

 

        # 获取博客日期

        date = blog.select(".dayTitle a")[0].get_text()

        print(date)

 

        # 获取博客简介

        des = blog.select(".postCon > div")[0].get_text()

        print(des)

 

        print(''-------------------------------------------------------------------------------------'');

  

如上述代码所示,我们根据分析的规则循环翻页并且从每一页的 HTML 中抽取出了我们需要的博客信息,并打印出来,相关代码已提供注释,这里我们就不多说了。

 

编写 Dockerfile

代码写完,按照惯例,我们仍然是使用 Docker 实现本地无 SDK 开发,因此编写 Dockerfile 如下所示:

# 使用官方镜像

FROM python:3.7-slim

 

# 设置工作目录

WORKDIR /app

 

# 复制当前目录

COPY . /app

 

# 安装模块

RUN pip install --trusted-host pypi.python.org -r requirements.txt

 

# Run app.py when the container launches

CMD ["python", "app.py"]

  

注意,由于我们使用到了比如 beautifulsoup 等第三方库,因此我们需要安装相关模块。requirements.txt 内容如下所示(注意换行):

html5lib

beautifulsoup4

requests

 

运行并查看抓取结果

构建完成后,我们运行起来结果如下所示:

 

 

原文出处:https://www.cnblogs.com/codelove/p/10715091.html

今天关于Docker 最全教程 —— 数据库容器化之持久保存数据十一的分享就到这里,希望大家有所收获,若想了解更多关于Docker 数据卷-Docker容器数据持久化方式、Docker 最全教程 —— 从理论到实战(二)、Docker 最全教程 —— 数据库容器化之持久保存数据(十二)、Docker 最全教程之 Python 爬网实战 (二十一)等相关知识,可以在本站进行查询。

本文标签:

上一篇容器 (docker) 内运行 Nginx(docker启动nginx容器)

下一篇leetcode 10. Regular Expression Matching