如何在Windows 10上运行Docker和Kubernetes?

4,889 阅读12分钟
原文链接: mp.weixin.qq.com

在Windows上学习Docker和Kubernetes,开始的时候会让你觉得无从下手。最起码安装好这些软件都不是一件容易的事情。实际上,你应该对Docker和Kubernetes相当熟悉了才知道如何选择安装时启用哪些参数选项。 但是不要担心! 这篇文章就是为在Winodws上刚刚入门容器和Kubernetes的同学而准备的。 你将会学习到如何做出正确的选择来搭建Windows上的容器开发环境。 让我们从Docker说起。

你正在使用Windows 10 Home版?你将无法运行Docker for Windows

当Docker的开发者们决定在Winodows上实现Docker时,他们选择了Hyper-V作为虚拟化技术。这个优点十分明显:优秀的性能和原生的hypvervisor。 不幸的是并不是所有的Windows版本带Hyper-V支持。 如果你正在使用Windows 10 home版或者Student版,那么你就中招了。你将无法安装和运行Docker for Windows。 但是先别失望。 你有许多基于Docker Machine的替代品可用,例如Docker toolbox或者minikube。 Docker Machine的工作方式很简单:有一个VM装好了Linux和Docker给你。你可以从你的主机连到虚拟机上的Docker deamon。 Minikube可以说是基于Docker Machine的最有趣的VM之一——你可以在里面运行Kubernetes集群。 事实上,minikube是一个运行Docker和Kubernetes的VM。它通常是用来单独运行Kubernetes的,但是你也可以用它来跑Docker容器。 你可能不会拥有Docker for Windows那样的速度,但是毕竟你不需要Hyper-V就能够构建和运行容器了。

有了Windows 10 Pro,Docker for Windows是最佳选择(除了特殊情况)

你有最新的Win 10 Pro,你可以安装Docker for Windows。 你拥有了优秀的性能和开发者体验,一切都搞定了,是吗? 答案是不一定! Docker for Windows使用的hypvervisor是相当强大的——它属于Type-1 hypervisor。 它确实很强大但是它却无法与Virtualbox这样的Type-2 hypervisor一起工作。 你不能在同一台机器上同时运行Type 1和Type 2的hypervisor。换句话说,如果你运行Docker for Windows,那你就无法启动VirtualBox里面的VM了。 这跟你的设置相关,影响可大可小。 如果你已经完全使用容器化了,你就不需要担心VM——过时的东西。 但是如果你仍然要使用VM,以及类似Vagrant这样的工具,那你可能就有麻烦了。 你可以随意的启用或者关闭Hyper-V hypervisor,但是你要重启机器。 如果你频繁的要从容器切换到VM,那可能使用minikube更方便。当你从容器切换到VM的时候就不用重启电脑了。 缺点就是你没办法得到更高性能和更好体验。 最后,如果你要运行Windows容器——base镜像是来自于Windows的容器——Docker for Windows是唯一选择。 你只能使用Windows 10 Pro或者Enterprise版。

运行一个本地的Kubernetes集群

如果你想要跑一个本地的Kubernetes,那你应该考虑minikube。 Minikube是一个预装有嵌入式Linux(Buildroot)和Docker daemon的VM。 它是一个最小完整的Kubernetes环境。 Minikube的VM可以通过VirtualBox或者Hyper-V来运行(当然也有其他选择)。如果你已经有Hyper-V也要用它来跑Docker和minikube的话就会很方便。 当然如果你不能跑Hyper-V也没关系,你可以用VirtualBox实现同样的功能。 有很多的选择和权衡,下图列出了一些: 前提

你可以从官网上下载安装Docker for Windows、Docker Toolbox、VirtualBox、kubectl、Docker CLI等,但是相当麻烦。 你要去到官网找到正确的下载地址,选择正确的版本,下载安装,最后加到你的path里面去。 这当然可行,但是我敢肯定你更愿意把时间花在编码而不是从网站上下载安装软件包上。 使用Chocolatey Chocolatey是一个Widnows的包管理器。你告诉它想要安装的包,它会为你装好。你把软件安装的活外包给它了。 安装Chocolatey很简单,你可以在它的官方网站找到步骤[1]。简单来说,就这么几步: 1、以管理员启动cmd.exe 2、执行下面这个命令:

@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"

3、重新加载cmd.exe 如果安装成功,那么你可以搜索软件包:

choco search docker

我们来试一把,安装Cmder——一个Windows上的时尚shell:

choco install cmder -y

Chocolatey会安装到C:\tools下。如果你要用Cinder做如下的练习,您可以以管理员启动它: 看起来不错!

1. 在Windows 10 Pro上安装Docker和Kubernetes

安装Docker 安装Docker for Windows:

choco install docker-for-windows -y

重启你的电脑。Docker会问你是否要启用Hyper-V。

选择Yes。 你需要知道Docker需要启用VT-X/AMD-v的硬件虚拟化扩展来运行容器。你需要在重启电脑时在BIOS里面配置它。 你可以用systeminfo命令来检查VT-x/AMD-v是否打开。 如果你不确定VT-x/AMD-v是否打开,也不用担心。因为你没有的话,Docker会报错: Hardware assisted virtualization and data execution protection must be enabled in the BIOS.

另一个常见问题是Hyper-V没有启用,这样你会见到如下错误:

你应该启用Hyper-V。以管理员打开新的命令提示符,敲入:

bcdedit /set hypervisorlaunchtype auto

你重启电脑之后Docker就应该可以启动了。 但如何知道Docker已经跑起来了呢? 打开命令提示符:

docker ps

如果一切正常,那么你会看见输出一个空的列表(正在运行的容器列表)。 如果Docker deamon没有运行的话,你可能就会遇到如下错误:

上面的错误表示你的Docker安装不正常,Docker无法启动。 你应该先启动Docker daemon,然后再连接它。

在Hyper-V上安装Minikube

安装minikube:

choco install minikube -y

在启动集群之前,你应该先创建一个外部的网络交换机。 第一步,你应该先查看你电脑的网络适配器。 你应该忽略掉虚拟网卡,而关注在真实活跃的物理网卡上,比如Ethernet或者WiFi。 选择好物理网卡让它与虚拟交换机共享网络连接。 要查看你当前的网络适配器,你可以在PowerShell里面使用Get-NetAdapter cmdlet。 点击左下角的Windows图标,输入PowerShell来打开它: 输入如下命令来列出所有的适配器:

Get-NetAdapter

如果你还是不知道该选哪个,那么就选择Up状态的那个。 一旦你选择好了适配器,你就可以开始创建外部虚拟交换机了:

New-Switch -Name "minikube" -AllowManagement $TRUE -NetAdapternmae "INSERT_HERE_ADAPTER"

别忘了填入之前选择的适配器名字。 如果你没有创建好网络交换机,那么启动minikube的时候会报如下错误: E0427 09:06:16.000298 3252 start.go:159] Error starting host: Error creating host: Error executing step: Running precreate checks. no External vswitch found. A valid vswitch must be available for this command to run. Check https://docs.docker.com/machine/drivers/hyper-v/. 你可以运行以下命令来测试minikube安装是否成功:

minikube start --vm-driver=hyperv --hyperv-virtual-switch=minikube

请注意:--vm-driver=hyperv --hyperv-virtual-switch=minikube 只在第一次启动时需要。如果你希望更改driver或者内存,那么你需要执行minkube destroy然后用新的配置重新创建。 如果minikube启动失败,那么你可以通过以下命令调试:

minikube deleteminikube start  —vm-driver=hyperv —hyperv-virtual-switch=minikube —v=7 —alsologtostderr

更多的输出日志可以帮助你快速排错。我遇到过如下的问题: E0427 09:19:10.114873 10012 start.go:159] Error starting host: Error starting stopped host: exit status 1. 这看不出来啥。我就打开详细的日志输出,错误就变得明显了:

+ Hyper-V\Start-VM minikube+ + ~~~~~~~~~~~~~~~~~~~~~~~~~+ + CategoryInfo : FromStdErr: (:) [Start-VM], VirtualizationException    + + FullyQualifiedErrorId : OutOfMemory,Microsoft.HyperV.PowerShell.Commands.StartVM

内存不够了! 这时可以看看安装成功了没。在命令提示符输入:

kubectl get nodes

你会看到Kubernetes里面有一个node显示出来。 在VirtualBox里面运行虚拟机 因为你已经在设备上启用了Hyper-V,你就无法再通过virtualbox跑VM了。如果你强行要启用vm的话,会遇到如下错误:

如果你想用VirtualBox这种Type-2 的hypervisor, 你先要停掉Hyper-V然后重启电脑。 以管理员打开命令提示符:

bcdedit /set hypervisorlaunchtype off

当机器重启之后,你就可以正常使用VirtualBox了。 如果你又想要用Docker和minkube了,你要重新打开Hyper-V然后重启机器。 以管理员打开命令行,输入:
bcdedit /set hypervsiorlaunchtype auto

重启, 这样你就可以将容器部署到Kubernetes中了。 请跳到测试你的Docker安装[2]。

2. 在Win 10 Home版本上安装Docker和Kubernetes

如果你正使用Windows 10的Home版或者Student版,你可能不需要安装Docker Machine 工具(比如Docker Toolbox)。 你应该使用minikube作为远程的Docker deamon和本地的Kubernetes集群。 你可以下载安装minikube:

choco install minikube
在装完了以后,你可以启动:

minikube start
这个命令会下载一个VirtualBox要用到的ISO,然后启动VM。启动之后你就可以查看集群状态:

kubectl get nodes

看见一个node列出来。 要连接到远程的Docker deamon,你应该安装Docker客户端:

choco install docker -y
你可以连到minkube上远程的Docker daemon:

@FOR /f "tokens=*" %i IN ('minikube docker-env') DO @%i

注意:每次你打开一个新的命令行窗口,你都需要以上命令。一种提醒你自己的简单方式是敲一下minikube docker-env。 如果连接成功,你可以列出当前正在运行的容器:

docker ps

你会看到很多容器正在运行。大部分属于Kubernetes。 你已经一切准备就绪! 但是在你继续之前,你需要清楚使用minikube作为你远程Docker daemon的一些限制。 Docker被设计为两个部分:
  • Docker daemon ——你可以将它理解为一个API server。你把命令发给它的API,Docker接收然后执行命令。

  • Docker CLI —— 将命令发送给Daemon API的可执行文件。

大部分时间你都只会跟Docker CLI 交互,你不会看到Docker daemon。 那么为什么要有客户端和服务器?为什么不用一个文件? 这都是为了灵活性。 当你运行Docker for Windows时,Docker CLI连接的是本地的Docker daemon。

但是有时候你本地没有daemon。 可能你需要在一台远端的机器上构建Docker容器。 可能你没有Hyper-V环境,你的Docker daemon是安装到VirtualBox里面的VM中的。 特别是你正在运行minikube。 你的Docker CLI会连接到远程的部署在minikube虚拟机里面的Docker Daemon上。

当你的容器运行在远程的Docker daemon上的时候,你需要调整端口绑定。 在Docker for Windows,你可以将容器端口绑定到8080:

docker run -ti -p 8080:80 nginx

注意:容器本身暴露的是80,你把它映射到了8080。 然后你可以访问http://localhost:8080然后看见Nginx的欢迎页面。 如果你在远程的Docker daemon上运行此命令然后访问这个URL时,你会发现什么也没有,URL不可达。 所以有什么不同? Docker deamon负责运行容器和端口转发。 Docker for Windows的daemon是在本地运行的——你自己的本机。 所以你可以访问本机上的容器。 Minikube则不同,它的Docker daemon是运行在VM里面的。 它是远程的deamon。 如果你想要看见你运行的容器你需要访问Docker daemon所在的机器。 你可以用以下命令找到IP:
minikube ip

你可以通过http://your_minikube_ip:8080来访问,看到Nignx的欢迎页面。

测试你的Docker安装

你已经安装好了Docker,那你如何知道它是否工作正常呢? 进入到终端,输入:
docker run -ti -p 8080:80 wordpress
一旦Docker下载完所有的包,你可以通过http://localhost:8080来访问。 注意:如果你在使用远程的minikube上的Docker daemon时,你应该使用http://your_minikube_ip:8080来访问。 你应该可以看到Wordpress的安装向导了。 万岁!恭喜你! Wordress就在一个容器里面对外服务了。 注意:你还不能完成那个Wordpress的安装因为你还有数据库。

测试你的Kubernetes集群安装

是时候测试你的本地的Kubernetes集群了。在这一部分,你将会部署Smashing.io面板。

部署Smashing到Kubernetes里面 你可以用如下命令部署:
kubectl run smashing --image=/visibilityspots/smashing --port=3030
一旦Kubernetes完成了容器的安装,你可以查看运行状态:

kubectl get pods
暴露面板 你可以将你部署的服务器暴露出来:

kubectl expose deployment smashing --type=NodePort
你可以通过浏览器打开面板:
minikube service smashing
这样你就可以从Kubernetes里面访问面板了! 万岁! 鸟瞰Kubernetes

Minikube本身自带了一些好东西。 你可以访问官方自带的面板:

minikube dashboard

从这里,你可以查看你的集群详细信息和部署应用。

总结

现在你已经了解了在Windows上安装Docker和Kubernetes的所有选项。 如果你遇到了文章没提到的错误,请通过@learnk8s或者slack告诉我们。 接下来,你可以在你的环境里面部署更多应用了。请看文档[3]。 相关链接:
  1. https://chocolatey.org/install

  2. https://learnk8s.io/blog/installing-docker-and-kubernetes-on-windows#testing-your-docker-installation

  3. https://learnk8s.io/blog/deploying-laravel-to-kubernetes

原文链接:https://medium.freecodecamp.org/get-started-with-docker-and-kubernetes-on-windows-10-73c328c6f89a