1. 程式人生 > >如何在Windows 10上執行Docker和Kubernetes?

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

640

在Windows上學習Docker和Kubernetes,開始的時候會讓你覺得無從下手。最起碼安裝好這些軟體都不是一件容易的事情。實際上,你應該對Docker和Kubernetes相當熟悉了才知道如何選擇安裝時啟用哪些引數選項。
但是不要擔心!
這篇文章就是為在Winodws上剛剛入門容器和Kubernetes的同學而準備的。
你將會學習到如何做出正確的選擇來搭建Windows上的容器開發環境。讓我們從Docker說起。你正在使用Windows 10 Home版?你將無法執行Docker for Windows

640

當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是最佳選擇(除了特殊情況)

640

你有最新的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叢集

640

如果你想要跑一個本地的Kubernetes,那你應該考慮minikube。
Minikube是一個預裝有嵌入式Linux(Buildroot)和Docker daemon的VM。
它是一個最小完整的Kubernetes環境。
Minikube的VM可以通過VirtualBox或者Hyper-V來執行(當然也有其他選擇)。如果你已經有Hyper-V也要用它來跑Docker和minikube的話就會很方便。
當然如果你不能跑Hyper-V也沒關係,你可以用VirtualBox實現同樣的功能。
有很多的選擇和權衡,下圖列出了一些:
640前提

640

你可以從官網上下載安裝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做如下的練習,您可以以管理員啟動它:
640
看起來不錯!1. 在Windows 10 Pro上安裝Docker和Kubernetes

640

安裝Docker
安裝Docker for Windows:
choco install docker-for-windows -y

重啟你的電腦。Docker會問你是否要啟用Hyper-V。

640
選擇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.

640


另一個常見問題是Hyper-V沒有啟用,這樣你會見到如下錯誤:

640


你應該啟用Hyper-V。以管理員開啟新的命令提示符,敲入:
bcdedit /set hypervisorlaunchtype auto
你重啟電腦之後Docker就應該可以啟動了。
但如何知道Docker已經跑起來了呢?
開啟命令提示符:
docker ps
如果一切正常,那麼你會看見輸出一個空的列表(正在執行的容器列表)。
如果Docker deamon沒有執行的話,你可能就會遇到如下錯誤:

640


上面的錯誤表示你的Docker安裝不正常,Docker無法啟動。
你應該先啟動Docker daemon,然後再連線它。在Hyper-V上安裝Minikube

640

安裝minikube:
choco install minikube -y
在啟動叢集之前,你應該先建立一個外部的網路交換機。
第一步,你應該先檢視你電腦的網路介面卡。
你應該忽略掉虛擬網絡卡,而關注在真實活躍的物理網絡卡上,比如Ethernet或者WiFi。
選擇好物理網絡卡讓它與虛擬交換機共享網路連線。
要檢視你當前的網路介面卡,你可以在PowerShell裡面使用Get-NetAdapter cmdlet。
點選左下角的Windows圖示,輸入PowerShell來開啟它:
輸入如下命令來列出所有的介面卡:
Get-NetAdapter

640


如果你還是不知道該選哪個,那麼就選擇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的話,會遇到如下錯誤:

640


如果你想用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

640

如果你正使用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。

640


但是有時候你本地沒有daemon。
可能你需要在一臺遠端的機器上構建Docker容器。
可能你沒有Hyper-V環境,你的Docker daemon是安裝到VirtualBox裡面的VM中的。
特別是你正在執行minikube。
你的Docker CLI會連線到遠端的部署在minikube虛擬機器裡面的Docker Daemon上。

640


當你的容器執行在遠端的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安裝

640

你已經安裝好了Docker,那你如何知道它是否工作正常呢?
進入到終端,輸入:
docker run -ti -p 8080:80 wordpress
一旦Docker下載完所有的包,你可以通過http://localhost:8080來訪問。
注意:如果你在使用遠端的minikube上的Docker daemon時,你應該使用http://your_minikube_ip:8080來訪問。
你應該可以看到Wordpress的安裝嚮導了。
萬歲!恭喜你!
Wordress就在一個容器裡面對外服務了。
注意:你還不能完成那個Wordpress的安裝因為你還有資料庫。測試你的Kubernetes叢集安裝

640

是時候測試你的本地的Kubernetes叢集了。在這一部分,你將會部署Smashing.io面板。

640


部署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

640

Minikube本身自帶了一些好東西。
你可以訪問官方自帶的面板:
minikube dashboard

640


從這裡,你可以檢視你的叢集詳細資訊和部署應用。總結

640

現在你已經瞭解了在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實踐培訓

640?

基於Kubernetes的DevOps實踐培訓將於2018年8月24日在北京開課,3天時間帶你係統掌握Kubernetes本次培訓包括:容器特性、映象、網路;Kubernetes架構、核心元件、基本功能;Kubernetes設計理念、架構設計、基本功能、常用物件、設計原則;Kubernetes的資料庫、執行時、網路、外掛已經落地經驗;微服務架構、元件、監控方案等,點選下方圖片檢視詳情。

640?