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

在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]。简单来讲,就这么几步: 一、以管理员启动cmd.exe 二、执行下面这个命令:

@"%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"复制代码@"%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"

三、从新加载cmd.exe 若是安装成功,那么你能够搜索软件包:

choco search docker复制代码choco search docker

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

choco install cmder -y复制代码choco install cmder -y

Chocolatey会安装到C:\tools下。若是你要用Cinder作以下的练习,您能够以管理员启动它: 看起来不错!

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

安装Docker 安装Docker for Windows:

choco install docker-for-windows -y复制代码choco install docker-for-windows -y

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

选择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复制代码bcdedit /set hypervisorlaunchtype auto

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

docker ps复制代码docker ps

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

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

在Hyper-V上安装Minikube

安装minikube:

choco install minikube -y复制代码choco install minikube -y

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

Get-NetAdapter复制代码Get-NetAdapter

若是你仍是不知道该选哪一个,那么就选择Up状态的那个。 一旦你选择好了适配器,你就能够开始建立外部虚拟交换机了:

New-Switch -Name "minikube" -AllowManagement $TRUE -NetAdapternmae "INSERT_HERE_ADAPTER"复制代码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复制代码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复制代码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复制代码+ Hyper-V\Start-VM minikube+ + ~~~~~~~~~~~~~~~~~~~~~~~~~+ + CategoryInfo : FromStdErr: (:) [Start-VM], VirtualizationException    + + FullyQualifiedErrorId : OutOfMemory,Microsoft.HyperV.PowerShell.Commands.StartVM

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

kubectl get nodes复制代码kubectl get nodes

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

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

bcdedit /set hypervisorlaunchtype off复制代码bcdedit /set hypervisorlaunchtype off

当机器重启以后,你就能够正常使用VirtualBox了。 若是你又想要用Docker和minkube了,你要从新打开Hyper-V而后重启机器。 以管理员打开命令行,输入:
bcdedit /set hypervsiorlaunchtype auto复制代码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复制代码choco install minikube
在装完了之后,你能够启动:

minikube start复制代码minikube start
这个命令会下载一个VirtualBox要用到的ISO,而后启动VM。启动以后你就能够查看集群状态:

kubectl get nodes复制代码kubectl get nodes

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

choco install docker -y复制代码choco install docker -y
你能够连到minkube上远程的Docker daemon:

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

注意:每次你打开一个新的命令行窗口,你都须要以上命令。一种提醒你本身的简单方式是敲一下minikube docker-env。 若是链接成功,你能够列出当前正在运行的容器:

docker ps复制代码docker ps

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

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

大部分时间你都只会跟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复制代码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复制代码minikube ip

你能够经过http://your_minikube_ip:8080来访问,看到Nignx的欢迎页面。

测试你的Docker安装

你已经安装好了Docker,那你如何知道它是否工做正常呢? 进入到终端,输入:
docker run -ti -p 8080:80 wordpress复制代码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复制代码kubectl run smashing --image=/visibilityspots/smashing --port=3030
一旦Kubernetes完成了容器的安装,你能够查看运行状态:

kubectl get pods复制代码kubectl get pods
暴露面板 你能够将你部署的服务器暴露出来:

kubectl expose deployment smashing --type=NodePort复制代码kubectl expose deployment smashing --type=NodePort
你能够经过浏览器打开面板:
minikube service smashing复制代码minikube service smashing
这样你就能够从Kubernetes里面访问面板了! 万岁! 鸟瞰Kubernetes

Minikube自己自带了一些好东西。 你能够访问官方自带的面板:

minikube dashboard复制代码minikube dashboard

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

总结

如今你已经了解了在Windows上安装Docker和Kubernetes的全部选项。 若是你遇到了文章没提到的错误,请经过@learnk8s或者slack告诉咱们。 接下来,你能够在你的环境里面部署更多应用了。请看文档[3]。 相关连接:
  1. https://chocolatey.org/installdocker

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

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

原文连接:https://medium.freecodecamp.org/get-started-with-docker-and-kubernetes-on-windows-10-73c328c6f89a
相关文章
相关标签/搜索