在 Windows 上使用 Docker?立即開始學習,或者…!

如果你是初次接觸容器和Docker,並且主要在Windows上工作,那麼你將會有所收穫。在這篇文章中,你將學習如何在Windows 10上安裝並配置Docker,使用Docker Desktop for Windows或簡稱為Docker Desktop

Docker Desktop是將Docker引擎和管理客戶端打包在一起,以方便在Windows 10上使用的工具。在本文中,你將安裝Docker Desktop,部署第一個容器,並在主機和容器之間共享數據。

安裝Docker在Windows上的先決條件

本文是一個逐步操作的文章,演示了使用Docker Desktop for Docker on Windows的各種步驟。請確保你首先滿足以下幾個具體要求。

  • 一個可以下載800MB+數據的互聯網連接
  • 運行Pro、Enterprise或Education版本的Windows 10 64位,並且版本號為1703或更新。這是為了在Windows 10上運行Hyper-V所必需的。
  • A CPU with SLAT (nested paging) compatibility. All AMD/Intel processors since approximately 2008 are SLAT compatible
  • 至少4GB的RAM
  • BIOS硬件虛擬化,有時被標記為虛擬化技術VTx。這必須被啟用並在任務管理器的性能選項卡中顯示為已啟用,如下圖所示。
Enabled BIOS virtualization shown in Windows Task Manager

下載並安裝Docker Desktop

首先,您需要下载并安装Docker Desktop才能在Windows上使用Docker。Docker Desktop有两个版本可供选择:稳定版本和测试版本。

稳定版本每季度发布一次,确保应用程序经过全面测试。在本文中,您将使用稳定版本。

注意:在安装过程中,Docker Desktop会提示您安装Hyper-V hypervisor(如果尚未安装)。通过这样做,Hyper-V hypervisor可以阻止任何用户模式hypervisor(如VirtualBox、VMWare等)运行客户机虚拟机。对于VirtualBox和VMWare,Hyper-V的支持有限但正在改进。

您还可以选择通过从Docker.com直接手动下载Docker Desktop或通过Windows软件包管理器Chocolatey下载。让我们简要介绍每种方法。

从Docker.com下载

要直接從docker.com下載Docker桌面版,您可以前往產品頁面進行註冊並從那裡下載。如果您打算在生產環境中使用Docker,這是首選方法。

然而,如果您只是第一次測試Docker,您也可以直接下載它,這會更加簡單。

下載EXE檔後,運行可執行檔並按照提示點擊並接受所有默認設置。

當被問及是否計劃使用Windows容器而非Linux容器時,如下所示,請不要勾選該選項。本文將使用Linux容器。

Installing Docker Desktop

安裝完成後,重新啟動您的計算機。

選擇使用Windows容器或Linux容器的選項將告訴Docker將映像連接到Windows內核或Linux內核。您可以在安裝後的任何時間通過在系統托盤中右鍵點擊Docker圖標,然後選擇切換到Windows容器來更改此設置,如下所示。

Switching to Windows containers

使用Chocolatey

另一種下載並安裝Docker Desktop的選項是使用Chocolatey。Chocolatey可以自動化許多下載/安裝任務。要這樣做,請以系統管理員身份打開命令行控制台(cmd或PowerShell),然後運行以下命令一次性下載並安裝該程序。

choco install docker-desktop

完成後,重新啟動Windows 10。

如果您想在某個時候嘗試測試版本,可以運行命令choco install docker-desktop --pre來下載並安裝它。

驗證Docker Desktop安裝

安裝完成後,Docker Desktop會自動運行作為在Windows上提供Docker的服務。在重新啟動後,登錄到Windows時,它會顯示在系統托盤中。但是,您如何確定它是否正常工作?

要驗證Docker Desktop是否正常工作,打開命令行控制台並運行docker命令。如果安裝成功,您將看到Docker命令參考。

最後,讓Docker下載並運行一個名為hello-world的示例容器映像,運行命令docker run hello-world。如果一切順利,您將看到以下輸出。

A successful test image run via Docker Desktop

在Docker容器中運行命令

已經安裝了Docker Desktop並且驗證一切正常?現在該怎麼做?在Windows上使用Docker的入門任務之一是在Docker容器中運行命令。通過docker run命令,您可以將命令直接通過主機(您的Windows 10電腦)傳送到運行中的容器中。

要在容器中運行命令,首先需要指定映像名稱,然後是命令。為了開始,告訴Docker在名為alpine的容器中運行命令hostname,如下所示。

> docker run alpine hostname
b74ff46601af

由於您現在的計算機上沒有alpine Docker映像,Docker在Windows上將從Docker Hub下載這個小映像,啟動一個容器並將命令直接發送到容器中,然後一次關閉。

如果您希望保持容器運行,還可以使用-it參數。此參數告訴Docker保持容器處於“交互模式”,在執行命令後將其保持在前台運行。然後,您將看到顯示終端提示符,準備就緒。

> docker run -it alpine sh
/ #

在終端中完成後,輸入exit返回到Windows 10。

從Docker主機訪問容器中的文件

另一个常见的任务是从容器访问主机文件。为了在容器中访问主机文件,Windows 上的 Docker 允许您将桌面上的文件夹路径链接到容器,以共享该文件夹。这个过程称为绑定

要创建一个绑定,首先在本地驱动器上创建一个文件夹。在这个例子中,我将使用E:\并将其命名为input。然后在该文件夹中创建一个名为file.txt的新文本文档。可以自由选择任何路径和文件。

一旦您确定了要在主机和容器之间共享的文件夹,Docker 需要使用--mount参数来挂载该文件夹。--mount参数需要三个参数:挂载类型、源主机目录路径和目标目录路径。目标路径将是容器内的符号链接。

下面是一个示例,将整个E:\挂载到 Windows 10 主机上,显示为 Linux 容器内的/home/TEST目录。

> docker run --mount type=bind,source="E:/",target=/home/TEST -it alpine

当您尝试挂载主机文件夹时,Docker Desktop 将要求您允许与 Docker 容器共享此驱动器,如下所示。

Sharing a Docker drive

如果您按照前面的描述在 Windows 10 文件夹中创建了file.txt文件,请运行cat /home/TEST/input/file.txt。您将看到文件内容被显示出来。

現在,刪除剛創建的input文件夾,然後再次運行cat ...命令。觀察到shell現在報告該文件不存在。

Working with files in Docker containers

映射網絡端口

另一個重要的概念是了解Windows上的Docker如何處理網絡。為了簡要介紹,讓我們看看如何從本地主機訪問運行在容器中的Web服務。

首先,啟動一個運行示例網頁的演示映像。下載並運行名為dockersamples/static-site的Docker映像。您將使用docker container run來執行此操作。

以下命令同時執行四個操作:

  • 從Docker Hub下載名為static-site的Docker映像,保存在docker-samples目錄下
  • static-site映像啟動一個容器實例
  • 立即將容器與終端前景分離(--detach
  • 使運行的容器的網絡端口對Windows 10主機可訪問(--publish-all
docker container run --detach --publish-all dockersamples/static-site
## 另一種縮寫語法,執行相同的操作:
## docker container run -d -P dockersamples/static-site
## docker run -d -P dockersamples/static-site

運行後,Docker將返回創建的容器ID,如下所示。

Docker container ID returned from running a container

發布網絡端口

自從使用--publish-all參數之後,本地主機端口現在被映射到容器的網絡堆棧。您可以使用docker ps子命令列出所有運行中的容器,包括所有運行中容器所分配的端口。在下面的示例中,有一個容器正在運行,將主機端口32777映射到容器端口80,將主機端口32776映射到容器端口443。

Showing port mapping of Docker container

在使用--publish-all參數時,Docker在Windows上為容器分配隨機端口,除非明確定義它們。

現在打開網頁瀏覽器,導航到http://localhost:32777或Docker分配的映射到端口80的端口,該端口由docker ps輸出。如果一切順利,您應該能看到下面的網頁。

Resulting webpage running in the Docker container

更改已發布的端口

現在您在Docker上運行了一個在Windows上提供簡單網頁的Docker容器。恭喜!但現在您需要指定一個特定的端口綁定,而不是依賴於隨機端口選擇,使用--publish-all。沒問題。使用-p參數。

首先,通過指定它的容器ID的唯一字符串停止運行中的容器。您可以通過運行docker ps找到這個容器ID。一旦您知道容器ID,停止容器並啟動一個新的容器,同時指定Docker分配一個特定的端口進行發布。

指定端口的语法是<外部端口>:<容器端口>。对于每个您想要发布的端口,使用--publish-p开关,并指定外部端口和容器端口号,如下所示。

> docker stop f766
> docker run --detach -p 1337:80 dockersamples/static-site

当您指定容器ID时,只需键入足够的ID以使其唯一即可。如果您只运行一个容器,其ID为f766f4ac8d66bf7,您可以使用任意数量的字符来标识容器,包括只有f。要求是您输入的内容可以唯一标识一个容器。

现在打开您的Web浏览器,导航到localhost:1337。请记住,您不会更改镜像,镜像始终监听端口80;您要更改的是Docker配置中的端口转发规则,以便连接到容器。

Webpage being served up on port 1337

停止所有容器

使用docker stop命令,您可以停止一个容器,但如何同时停止多个容器呢?一种方法是提供多个以空格分隔的容器ID。您可以在下面看到如何停止三个容器,它们的ID分别为fd50b0a446e736ee57c3b7da7c45664906ff

> docker stop fd50 36ee 7c45

如果您正在使用PowerShell管理Docker容器,您还可以使用一种快捷方式停止所有容器。通过PowerShell的命令扩展,将容器ID列表通过docker ps -q传递给停止参数 docker stop (docker ps -q)

确认所有容器都已停止,当您键入docker ps时,不会显示任何容器。

清理

您已下载了一些容器镜像并运行了一些已停止的容器。即使它们已停止,它们分配的存储空间仍未从本地主机磁盘上删除。您必须删除这些容器以释放空间,避免在工作空间中产生混乱。

要删除单个容器,请使用容器删除rm参数,如下所示。

> docker container rm <container ID>

或者,要删除所有已停止的容器,请使用prune参数,如下所示。

> docker container prune

Source:
https://adamtheautomator.com/docker-windows/