歡迎光臨
每天分享高質量文章

如何在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]。簡單來說,就這麼幾步:
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 delete
minikube 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

基於Kubernetes的DevOps實踐培訓

基於Kubernetes的DevOps實踐培訓將於2018年8月24日在北京開課,3天時間帶你系統掌握Kubernetes本次培訓包括:容器特性、鏡像、網絡;Kubernetes架構、核心組件、基本功能;Kubernetes設計理念、架構設計、基本功能、常用物件、設計原則;Kubernetes的資料庫、運行時、網絡、插件已經落地經驗;微服務架構、組件、監控方案等,點擊下方圖片查看詳情。

赞(0)

分享創造快樂