如何使用Docker Build Tag創建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 指令可用於自動化容器映像檔的建立,採用容器即程式碼 (container-as-code) 的 DevOps 實踐,並將容器化整合到您的專案開發週期中。Dockerfiles 只是包含建構指令的文字檔案,由 Docker 用於根據現有映像檔建立新的容器映像檔。

用戶可以指定基礎映像檔和部署或首次啟動容器映像檔時要運行的命令清單。在本文中,您將學習如何使用 Windows 容器從 Dockerfile 建立基於 Windows 的 Docker 映像檔。

這個過程比使用預先建立的容器映像檔具有幾個好處:

  1. 您能夠為多個 Windows 版本重新建立容器映像檔,這對於在多個平台上測試程式碼變更非常有用。
  2. 您將更加控制在容器中安裝了什麼。這將使您能夠將容器大小保持在最小範圍內。
  3. 出於安全原因,您可能希望檢查容器中的漏洞並對基礎映像檔進行安全硬化

先決條件/需求

本文是一個學習如何使用 Dockerfile 建立 Docker 映像檔的實作課程。如果您想跟隨進度,請確保已經準備好以下先決條件。

  • 已安裝 Docker for Windows。我將在我的環境中使用 Docker 社區版 (CE) 版本 2.1.0.4。
  • 需要互联网访问以下载 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 映像,這是本教程所需的。更新的映像列表可以在 official Microsoft Docker hub image page 上找到。

查看當前 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);所以在我們的案例中,圖像的擁有者是
# Microsoft,應用程式是 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的文件夾路徑來引用Dockerfile。

下面是一個示例,確保控制台位於C:\ Containers目錄中,然後從C:\ Containers \ Container1目錄中的Dockerfile建立一個新的映像。

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

一旦開始,您可以看到該命令的進度,因為它逐行遍歷docker文件中的每個指令:

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/