如何在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
相關文章
相關標籤/搜索