在Windows上使用Docker?立即开始学习吧,或者…!

如果你是初次接触容器和Docker,并且主要使用Windows,那么你将会有所收获。在本文中,你将学习如何在Windows 10上使用Docker桌面版或简称为本文中的Docker桌面版

Docker桌面版是Docker引擎和管理客户端打包在一起,方便在Windows 10上使用。在本文中,你将安装Docker桌面版,部署你的第一个容器,并在主机和容器之间共享数据。

Windows上使用Docker的先决条件

这是一篇演示如何在Windows上使用Docker桌面版的文章。要跟随操作,请确保首先满足以下几个特定要求。

  • 互联网连接,用于下载800MB以上的数据
  • 运行Pro、企业版或教育版的64位Windows 10,版本号为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桌面版

首先,您需要下载并安装 Docker Desktop 以在 Windows 上运行 Docker。Docker Desktop 有两个版本可用:稳定版本和测试版本。

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

警告:安装 Docker Desktop 后,系统会提示您安装 Hyper-V hypervisor(如果尚未安装)。通过这样做,Hyper-V hypervisor 阻止任何用户模式的 hypervisors,如 VirtualBox、VMWare 等,运行客户 VMs。对于VirtualBoxVMWare,Hyper-V 的支持有限,但正在改进中。

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

Docker.com

要直接从docker.com下载Docker Desktop,您可以转到产品页面,注册一个帐户并从那里下载。如果您打算在生产环境中使用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 run hello-world命令,让Docker下载并运行一个名为hello-world的示例容器映像。如果一切正常,您将看到如下输出。

A successful test image run via Docker Desktop

在Docker容器中运行命令

Docker Desktop已安装并验证一切正常?现在怎么办?要在Windows上开始使用Docker,容器中执行的一个常见任务是运行命令。通过docker run命令,您可以直接将命令发送到主机(即您的Windows 10 PC)并在运行中的容器中执行。

要在容器中使用docker run运行命令,首先需要指定一个镜像名称,然后是命令。要开始,请告诉Docker运行以下命令hostname,在一个名为alpine的容器中执行,如下所示。

> 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。你将看到显示内容。

现在,删除您刚创建的输入文件夹,并再次运行cat ...命令。观察到 shell 现在报告该文件不再存在。

Working with files in Docker containers

映射网络端口

另一个重要的概念是了解 Docker 在 Windows 上如何处理网络。简要介绍一下,让我们看看如何从本地主机访问在容器中运行的 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

在Windows上使用--publish-all参数时,Docker会为容器分配随机端口,除非显式定义它们。

现在打开一个网页浏览器,导航到http://localhost:32777或Docker分配的映射到端口80的端口,通过docker ps输出。如果一切顺利,您应该看到下面的网页显示出来。

Resulting webpage running in the Docker container

更改已发布的端口

现在您在Windows上的Docker中运行着一个提供简单网页的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 stop (docker ps -q)

确认所有容器都已停止,通过输入docker ps检查,不应该列出任何容器。

清理

你已经下载了一些容器镜像并运行了一些现在已经停止的容器。即使它们已经停止,它们分配的存储空间仍然存在于本地主机磁盘上。你必须删除这些容器以释放空间,避免在工作区中堆积。

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

> docker container rm <container ID>

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

> docker container prune

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