如何使用Docker Build标签创建Docker Windows镜像

你是不是对Docker Windows镜像还不太了解?你目前是否在Windows环境下工作,想了解有关Docker构建容器镜像的内容?你来对地方了。学习新东西的最佳方式是通过使用docker builddocker build "tag"命令来实践!

在这篇文章中,你将学习如何使用docker build命令从Dockerfile创建你的第一个Windows Docker镜像。

让我们开始吧!

理解Docker容器镜像

多年来,测试或在多个操作系统(OS)上进行开发的唯一方法是拥有几台专门为你选择的OS版本镜像的物理或虚拟机。这种方法需要更多的硬件和开销,以为每个软件和OS规格提供新机器。

然而,如今随着Docker 容器镜像的使用逐渐增多,部分原因是微服务架构的流行。为了响应Docker的普及,微软已经开始公开支持其Docker Hub页面上多个旗舰产品的Docker镜像。他们甚至在Windows 10和Windows Server 2016中作为产品特性添加了对Windows镜像的本机支持!

A Docker image is run on a container by using the Docker Engine. Docker images have many benefits such as portability (applicable to multiple environments and platforms), customizable, and highly scalable.  As you can see below, unlike traditional virtual machines, the Docker engine runs on a layer between the host OS kernel and the isolated application services that are being containerized.

Source: Docker

理解Docker构建和镜像

docker build 命令可以用来自动化容器镜像的创建,采用容器即代码的 DevOps 实践,并将容器化集成到项目的开发周期中。 Dockerfile 只是包含构建指令的文本文件,Docker 使用它们来创建一个基于现有镜像的新容器镜像。

用户可以指定基础镜像和在部署或首次启动容器镜像时要运行的命令列表。在本文中,您将学习如何使用 Windows 容器从 Dockerfile 创建基于 Windows 的 Docker 镜像。

与使用预构建容器镜像相比,此过程具有几个优点:

  1. 您可以为几个 Windows 版本重建容器镜像 – 这对于在几个平台上测试代码更改非常有用。
  2. 您将能够更多地控制安装在容器中的内容。这将使您可以将容器大小保持在最小限度内。
  3. 出于安全原因,您可能希望检查容器中的漏洞并对基础镜像应用安全加固

先决条件/要求

本文是关于如何使用 Dockerfile 构建 Docker 镜像的实践指南。如果您想跟着做,请确保您已经具备以下先决条件。

  • 已安装 Docker for Windows。我将在我的环境中使用 Docker Community Edition (CE) 版本 2.1.0.4。
  • 需要 Internet 访问才能下载 Docker 镜像
  • Windows 10+ 操作系统(本教程使用版本 1709)
  • 启用了嵌套虚拟化
  • 本地计算机上有 5 GB 的可用磁盘空间
  • PowerShell 5.0+
  • 本教程使用 Visual Studio Code IDE。 但是,您可以使用任何您喜欢的 IDE。

注意:安装 Docker 时,请确保启用了 Windows 容器配置。

准备工作

首先,您需要一个文件夹来存储所有要构建的 Docker 镜像和容器。 为此,请打开 PowerShell 或 cmd 终端(本文将始终使用 PowerShell),并创建一个名为 C:\Containers 的新目录。

创建文件夹后,切换到该目录。 这将将控制台的当前工作目录更改为 C:\Containers,以便默认将所有下载内容保存到此目录中。

PS51> mkdir C:\Containers
PS51> cd C:\Containers

在这篇文章中,您将会有一个头等舱的开始。大部分用于完成此项目的文件已经可用。创建文件夹后,执行Git pull以从TechSnips Github存储库将所需的文件复制到C:\Containers文件夹。完成后,请检查C:\Containers文件夹是否如下所示。

Tutorial files

下载IIS Windows Docker镜像

首先要执行的任务是下载一个“模板”或基础镜像。稍后您将构建自己的Docker镜像,但首先需要一个开始的镜像。您将下载最新的IIS和Windows Server Core镜像,这些镜像是本教程所需的。可以在官方微软Docker Hub镜像页面上找到更新的镜像列表。

审查当前的Docker基础镜像

在从镜像存储库下载镜像之前,让我们首先审查一下您当前在本地系统上拥有的Docker基础镜像。为此,请以管理员身份运行PowerShell控制台,然后键入docker images。此命令将返回本地系统上的所有镜像。

如下所示,您可以看到可用的镜像最初是空的。

PS51> docker images
Docker Build Tag : Listing available Docker images

下载基础镜像

现在是时候从Docker Hub下载基础的IIS镜像了。为此,请按照下面所示运行docker pull。这个过程可能需要一些时间,具体取决于您的互联网速度。

PS51> docker pull mcr.microsoft.com/windows/servercore/iis
Downloading an image from the Docker Hub

现在运行docker images,您应该可以看到最新的Microsoft Windows Core IIS镜像可用于本教程。

PS51> docker images
Viewing available Docker images

检查Dockerfile

在早期的步骤中,您已经为本教程下载了一个现有的Dockerfile。现在让我们来看看这究竟包含了什么。

在您喜欢的编辑器中打开C:\Containers\Container1\Dockerfile文件。这个Dockerfile的内容用于定义构建时容器镜像的配置。

您可以在内联注释中看到此文件的每个部分的解释。

#指定将使用最新的Microsoft / IIS图像作为基础图像
#用于指定构建过程将使用哪个基础容器映像。

#请注意命名约定为“**所有者/应用程序名称:标记名称**”
#(显示为microsoft/iis:latest);因此在我们的情况下,映像的所有者是
#微软,应用程序是具有正在使用的“latest”标记名称的IIS
#以指定您将拉取可用的最新映像版本。
FROM microsoft/iis:latest

#将wwwroot文件夹的内容复制到新容器映像中的inetpub / wwwroot文件夹
#用于指定要将WWWroot文件夹复制到IIS inetpub WWWroot
#容器中的文件夹。您不必指定本地文件的完整路径
#因为docker已经内置了引用文件和文件夹的逻辑
#相对于系统上docker文件位置的文件和文件夹
#相对路径。还要注意,docker只会识别正斜杠作为文件路径-因为这是一个
#基于Windows的容器而不是Linux。
COPY wwwroot c:/inetpub/wwwroot

#在新容器中运行一些PowerShell命令来设置映像

#运行PowerShell命令以删除默认的IIS文件并创建一个新的
#名为TestPool的应用程序池
RUN powershell Remove-Item c:/inetpub/wwwroot/iisstart.htm -force
RUN powershell Remove-Item c:/inetpub/wwwroot/iisstart.png -force
RUN powershell Import-Module WebAdministration
RUN powershell New-WebAppPool -Name 'TestPool'

#在新容器映像上公开端口80
#用于打开TCP端口80以允许网站的http连接。
#但是,此行已被注释掉,因为IIS容器已经具有此端口
#默认已经打开。
#EXPOSE 80

#设置容器映像的主要命令
#这告诉图像运行w3svc服务的服务监视器。
#当指定了这个时,容器将自动停止运行
#如果w3svc服务停止。这行被注释掉是因为
#IIS容器已经默认放置了此入口点。
#ENTRYPOINT ["C:\\ServiceMonitor.exe", "w3svc"]

构建新的 Docker 镜像

您已经准备好 Dockerfile 并下载了基本的 IIS 镜像。现在是使用 Dockerfile 构建新的 Docker 镜像的时候了。

要构建新的镜像,请使用docker build "tag"命令。此命令创建镜像。在本文中,您可以看到下面您还使用了-t **选项,该选项替换了“tag”部分。此选项允许您为新的镜像指定一个友好的标签名称,并通过指定 Dockerfile 所在的文件夹路径来引用它。

下面您可以看到一个示例,确保控制台位于 C:\Containers 目录,然后从 C:\Containers\Container1 目录中的 Dockerfile 构建新的镜像。

PS51> cd C:\Containers
PS51> docker build -t container1 .\Container1

一旦开始,您可以看到命令的进度,因为它逐行遍历 Dockerfile 中的每个指令:

Building a progress of the command as it traverses each instruction in the docker filenew Docker image

完成后,您现在应该有一个新的 Docker 镜像了!

现在运行docker images命令查看可用的镜像。您可以在下面看到创建的 container1 镜像的示例。

Viewing available Docker images

注意:docker build —help命令是一个有用的参数,可以显示有关正在运行的 docker 命令的详细信息。

运行 Docker 容器

此时,您应该已经创建了一个新的镜像。现在是使用该镜像启动容器的时候了。要启动一个新的容器,请使用docker run命令。

docker run命令将基于您之前创建的container1镜像启动一个新的Docker容器。您可以在下面看到一个示例。

请注意,使用了-d参数。这告诉docker运行时在分离模式下启动镜像,然后在用于运行容器的根进程退出时退出。

docker run完成时,它会返回创建的容器的ID。下面的示例将此ID捕获到一个$containerID变量中,以便我们稍后可以轻松地引用它。

PS51> $containerID = docker run -d container1
PS51> $containerID
Running a Docker container

容器启动后,现在运行docker ps命令。此命令允许您查看当前正在运行哪些使用每个镜像的容器。请注意下面自动生成了一个运行中的镜像别名(在本例中为busy_habit)。有时,此别名用于管理容器,而不是使用容器ID。

Listing running Docker containers

在Docker容器中运行代码

A new container is built from a new image you just created. Let’s now start actually using that container to run code. Running code inside of a Docker container is done using the docker exec command.

在此示例中,运行docker exec以查看容器中使用以下命令语法的Get-ChildItem命令的PowerShell输出。这将确保Dockerfile中的指令已成功删除默认的IIS文件。

PS51> docker exec $containerID powershell Get-ChildItem c:\inetpub\wwwroot

您可以在下面看到,唯一存在的文件是index.html,这意味着默认文件已被删除。

Running PowerShell commands in a Docker container

现在在容器中运行ipconfig命令,以获取容器镜像的本地IP地址,以便您尝试连接到IIS网站。

PS51> docker exec $containerID ipconfig

您可以看到下面,ipconfig在容器中运行,就像在本地计算机上运行一样,并返回了所有的IP信息。

Running ipconfig in a Docker container

检查IIS网站

现在是时候揭示您劳动的果实了!是时候看看在Docker容器中运行的IIS服务器是否正常提供index.html页面了。

打开浏览器,粘贴通过ipconfig找到的IP4地址到地址栏中。如果一切正常,您应该会看到一个如下的Hello World!!消息。

IIS webpage running in a Docker container

审查Docker历史

当使用Docker容器时,一个有用的命令是docker history命令。虽然这并不一定与创建镜像或容器本身有关,但docker history命令是一个有用的命令,允许您审查对容器镜像所做的更改。

PS51> docker history container1

您可以看到下面,docker history返回了在您一直在使用的container1容器上执行的所有Dockerfile和PowerShell活动。

Inspecting container changes with docker history

清理正在运行的Docker镜像

以下步骤用于清理在您的计算机上运行的所有已停止的容器。这将释放磁盘空间和系统资源。

运行docker ps命令以查看在您的系统上运行的容器列表:

PS51> docker ps
Viewing available Docker containers

现在使用docker stop命令停止运行的容器:

PS51> docker stop <image nick name: busy_haibt in my case>
PS51> docker stop <image nick name: unruffled_driscoll in my case>
Stopping Docker containers

最后,您可以使用docker system prune命令永久删除已停止的容器。

PS51> docker system prune
Removing Docker images

进一步阅读

Source:
https://adamtheautomator.com/docker-build-tag/