.NET 猿自從認識了小鯨魚,感覺功力大增。上篇《docker4dotnet #1 前世今生&世界你好》中給大家介紹瞭如何在Windows上面配置Docker for Windows和Docker Tools for Visual Studio來使用docker協助.NET Core應用的開發,這篇我們來看看如何建立和管理容器化主機。
所謂容器化主機Dockerized Host,就是安裝了docker engine的主機,可以使用docker工具進行管理。使用docker來協助開發,我們至少需要本地和雲端的容器化主機,本地用於開發,測試,打包;雲端的用於生產環境釋出。使用容器化主機我們可以將所有的環境標準化,也即是使用統一的docker工具來完成容器在不同環境中的遷移(搬運),真正將容器化開發的優勢發揮出來。
使用docker釋出應用與以往的應用釋出方式有很大不同,從上圖中可以看出。
- 因為應用本身與依賴,應用伺服器和作業系統都是分離的;我們在自動化過程中就必須處理各種不同的場景,難以標準化;而使用容器技術,我們就可以將自動化簡化為對容器的搬運。
- 各種依賴的解決都集中在開發環境中完成,常見的npm,nexus, nuget等工具都是開發人員很熟悉的,這些依賴的獲取都可以由開發人員自己解決,在後續的自動化中無需再次處理。
- 僅從自動化的複雜程度來說,你可以很明顯的看出傳統開發中自動化會變成各種複雜情況的匯聚點,這就是為什麼做CI/CD需要如此複雜的工具;如果再考慮不同種類的工具,如:Jenkins/TeamCity/Travis,Chef/Puppet等,這個環境會變的非常難以控制和維護。
- 以往我們必須給不同的應用建立不同的執行環境,而且這個環境必須從作業系統開始一層層搭建;使用容器話之後,不同型別的應用可以執行在統一的作業系統層之上,大大提高了資源利用率和靈活性。
在不同的環境中統一使用容器化主機就是向著容器化開發演進的第一步,也是大幅降低自動化系統複雜程度的第一步。
建立容器化主機
今天給大家介紹一下docker工具集中用來管理容器化主機的工具 docker-machine。上一篇文章中我們提到 Docker for Windows 其實是在 Hyper-V 中建立了一臺執行著 docker daemon 守護程式的 linux vm 來接收 windows 命令列中執行的 docker 指令的,在你第一次啟動 docker for windows 的過程中, docker-machine 工具完成了這個 vm 的初始化工作。
這個初始化的操作很簡單,如果你已經安裝了 docker for windows,可以開啟命令列(注意:一定要用管理員許可權),然後鍵入如下命令;
docker-machine create --driver hyperv {machine-name}
這樣,docker-machine 就完成了在你本地的hyper-v上初始化一臺可以執行容器的vm(一般稱為Dockerized host 容器化主機)的工作了。
注:在以上過程中如果docker-machine無法在本地找到boot2docker.iso這個檔案的話,會從網路上下載,這個過程會很慢,我已經將這個檔案上傳到了 d4dtools 的網站盤中,請在公眾號中輸入 d4dtools 獲取。
下載後放入當前使用者的~\.docker\machine\cache\ 這個目錄即可。
完成初始化後,如果你希望讓docker命令直接對這個新的主機進行操作,可以執行下面的命令。
@FOR /f "tokens=*" %i IN ('docker-machine env {machine-name}') DO @%i
注意將{machine-name}替換成你自己的容器化主機名稱,這個命令會設定以下三個環境變數
SET DOCKER_TLS_VERIFY=1 SET DOCKER_HOST=tcp://xxx.xxx.xxx.xxx:2376 SET DOCKER_CERT_PATH=C:\Users\LeiXu\.docker\machine\machines\{machine-name} SET DOCKER_MACHINE_NAME={machine-name}
完成後如果執行 docker 命令,那麼你所使用的就是新的容器化主機了。
Docker-Machine 的環境驅動
上面的命令中你會注意到 –driver hyperv 這個引數,docker 提供了很多驅動可以讓你在不同的環境中一鍵建立容器化主機,這些環境包括:
– Virtual Box (virtualbox)
– Hyper-V (hyperv)
– Azure (azure)
– Aws (amazonec2)
– VMware Fusion (vmwarefusion)
– VMware vCloud Air (vmwarevcloudair)
– Vmware vSphere (vmwarevshpere)
– …
括號中的內容就是驅動的命令引數,完整的列表可以訪問:
https://docs.docker.com/machine/reference/create
另外,阿里雲也提供了driver,不過並不在 docker 官方列表中
https://github.com/denverdino/docker-machine-driver-aliyunecs
小編測試了以下幾個環境
Azure 國際版命令:
docker-machine create --driver azure --azure-subscription-id {sub-id} --azure-open-port 80 {machine-name}
Azure 世紀互聯版命令:
docker-machine create --driver azure --azure-environment "AzureChinaCloud" --azure-subscription-id {sub-id} --azure-open-port 80 --azure-location "ChinaNorth" {machine-name}
AWS 國際版命令:
docker-machine create --driver amazonec2 --amazonec2-region "ap-northeast-1" --amazonec2-vpc-id {vpc-id} {machine-name}
這些命令都可以提供豐富的引數來控制主機的作業系統映象,主機配置大小,網路連線,主機位置等。大家可以通過以下命令獲取這些引數的詳情:
docker-machine create --driver {driver-name}
這些主機建立好以後,如果要列出所有繫結到你自己環境上主機,可以執行:
docker-machine ls
如果你需要直接登陸到主機上進行操作,可以 執行:
docker-machine ssh {machine-name}
因為docker-machine在建立主機的過程中已經自動完成了public key的生成和配置,你無須輸入使用者名稱和密碼就可以ssh進入主機進行操作,所有這些public key的證書檔案都存放在 ~\.docker\machine的目錄下面。
注:因為網路的原因,這些操作有可能失敗。如果遇到這種情況,先進入雲平臺的控制檯檢視相關的資源是否都建立成功呢了,如果已經資源已經在那裡了。嘗試執行:
docker-machine regenerate-certs {machine-name}
這樣會強制宿主機的 docker deamon 重啟,一般來說可以解決問題。
使用docker-machine這個工具,你可以完成容器化主機的建立,啟動,關閉等主要操作;而不必通過雲提供商的控制檯來完成,也就是說你本地的docker環境就變成中對於所有開發,測試和生產環境的控制檯;通過docker所提供的命令,你可以完成從應用打包,環境建立,釋出部署的整個過程。當然,如果你的團隊比較大,其中的一些步驟還是需要藉助自動化系統來完成,這樣才能完成程式碼的整合和團隊協同,安全性控制和叢集環境的編排也是需要考慮的問題。這些,我們將在後續的文章中給大家提供解決方案。
將應用釋出到雲端
到了這裡,小編到覺得沒啥可說的了,docker的釋出實在是簡單!簡單!簡單!重要事情說三遍。
進入你的應用目錄呼叫那個 dockertask.ps1 指令碼,就可以完成應用的打包和image上傳操作
.\DockerTask.ps1 -Build -Environment Release -Machine {machine-name}
然後執行
docker images
就可以看到已經上傳到你的目標宿主機上面的 images,這時就可以執行 docker run 了 (注意:要確保你正確配置了 宿主機的環境變數)
docker run -p 80:80 username/webapp01:latest
注:這個過程中你可能會碰到docker版本不匹配的問題
你可以安裝 docker version manager 這個工具,然後使用以下命令來獲取使用正確版本
dvm install {version}
dvm use {version}安裝命令(Poweshell):
Invoke-WebRequest https://download.getcarina.com/dvm/latest/install.ps1 -UseBasicParsing | Invoke-Expression
小結
到這裡,我們就完成了本地和雲端的docker環境的建立,並進行了最簡單的應用部署。你可以看到,docker 提供了一套簡單易用的工具和部署方式,讓我們的應用開發,除錯和打包部署都變的非常快捷。下一篇中我們將介紹如何使用macOS環境完成.net core應用的建立,除錯和docker打包部署過程。
請關注微信公眾號 【devopshub】,獲取更多關於DevOps研發運維一體化的資訊