1. 程式人生 > >Windows 10下Docker使用經驗談

Windows 10下Docker使用經驗談

dup 方便 figure 發的 重啟 inline bsp iso鏡像 vmw

最近一直在開發Apworks框架的案例代碼,同時也在一起修復Apworks框架中的Bug和一些設計上的不足。遇到的一個普遍問題是,代碼的調試過程需要依賴很多外部系統,比如MongoDB、PostgreSQL、RabbitMQ等。當然可以在本機逐一安裝這些服務,然後對服務進行配置,使其滿足自己開發調試的需要。這樣做當然是沒有問題的,只是比較麻煩。於是,我尋求docker的幫助,將服務全都運行在docker容器中,需要的時候一條簡單的docker命令即可啟動,不需要的時候,將docker容器停掉即可,非常方便,而且不會對主機環境造成幹擾。當然,實踐過程也不是那麽順利的,也踩了一些坑,現在就跟大家分享一下。

Docker for Windows 10

在Windows 10系統下的首選就是Docker for Windows 10。Docker對Windows 10的支持現在已經做得非常好了,無論在Windows Command下還是在Windows Powershell下都可以執行Docker命令,也可以像在Linux系統下一樣,運行所有的Docker容器。對Docker架構了解的讀者一定能夠更好地了解Docker for Windows 10運作的基本原理,即在Hyper-V的支持下,將Docker容器運行在Linux的虛擬機裏。因此,在Docker for Windows的工具中,可以設置這臺虛擬機的CPU個數,以及內存的大小。

技術分享

然而,一個比較麻煩的問題是,如果你需要使用-v參數來加載(mount)一個磁盤目錄(volume)的時候,就會出現問題,至少我在MongoDB中使用-v參數來將MongoDB的數據文件映射到主機目錄時,就會導致MongoDB無法正常啟動。這個問題在Hyper-V出現之前,在Virtual Box時代就有,而且根據社區的討論,似乎在Hyper-V的版本中也還是沒有解決。詳細信息可以參考這裏:https://stackoverflow.com/questions/42756776/how-do-i-configure-mongo-to-run-in-docker-to-using-an-external-drive-on-windows。

由於這樣的原因,我沒有在自己的開發環境中使用Docker for Windows 10,因為無法將MongoDB的數據庫文件映射存儲到主機(Host Machine)上,也就意味著每次啟動容器執行我的一些冒煙測試(Smoke Test),我都需要重建數據,非常麻煩。我選擇了在Hyper-V中搭建自己的Linux虛擬機來構建自己的開發和測試環境。

使用Hyper-V的Linux虛擬機來運行Docker容器

以前,只有服務器版本的Windows才支持Hyper-V,記得最早支持Hyper-V的Windows是Windows Server 2008。說起Hyper-V的歷史,也是有一定淵源的。最早有一家公司,名叫Connectix,它有一款產品就是大家熟悉的Connectix Virtual PC,一款硬件虛擬化產品,後來Connectix把Virtual PC產品賣給了微軟,成為了Microsoft Virtual PC,之後Connectix於2003年宣布解體,微軟把Virtual PC精神發揚光大,成就了現在的Hyper-V。從Windows 10開始,Professional/Enterprise版本的Windows 10都能夠支持Hyper-V了。大家可以直接在Windows 10中創建虛擬機,而不需要額外安裝vmware player、Oracle VirtualBox等這些第三方的虛擬機服務。

啟用Hyper-V的方法非常簡單,在Windows 10中,點擊開始菜單,或者按下鍵盤上的WIN鍵,然後輸入關鍵字windows features,這時會出現“Turn windows features on or off”菜單項(我的系統是英文版,中文版稍作修改):

技術分享

點擊這個菜單項,然後會打開大家熟悉的控制面板界面,直接選中其中的Hyper-V就行了:

技術分享

應用更改並重新啟動後,Hyper-V就已經裝好了。需要註意的是,如果你已經在控制面板中啟用了Hyper-V,那麽假如你再安裝Oracle VirtualBox的話,這樣Oracle VirtualBox僅可創建32位的虛擬機。當然原因我們也沒必要深究了。

Hyper-V成功安裝後,同樣,在開始菜單中輸入Hyper-V作為關鍵字,Hyper-V Manager菜單項就會顯示出來,點擊Hyper-V Manager的菜單項,即可打開Hyper-V的管理界面。在Hyper-V Manager中,可以非常方便地創建並管理虛擬機,虛擬機的操作系統可以是Windows的,也可以是Linux的,用戶只需要下載所需操作系統的ISO鏡像即可完成安裝,非常方便。這部分內容本文就不多說了,可以參考微軟官網Hyper-V的教程。

技術分享

比較有趣的事情是,Hyper-V對虛擬機的內存分配可以是動態的。比如我在創建Ubuntu Linux虛擬機的時候,選擇的是8GB的內存,但從上圖可以看出,目前系統僅分配了2GB多一點的內存給我的虛擬機,因為當時它只需要使用這麽多。這樣也能兼顧到主機的性能。在我創建的這個Ubuntu Linux虛擬機中,我配置使用了靜態IP地址,這是為了方便程序的開發測試。在我的測試數據中,我不需要因為虛擬機IP地址的改變而總是去修改數據庫的連接字符串。配置靜態IP的另一個好處就是,你可以很方便地使用Putty這樣的SSH工具來遠程連接到Hyper-V虛擬機,而不需要每次都打開Hyper-V Manager並登錄到虛擬機控制臺。Putty這套工具使用非常方便,並且綠色輕量,在此強烈推薦。

技術分享 技術分享

根據不同的Linux環境,靜態IP地址的配置方式也會不同,這裏也不多解釋了,網上相關的文章還是很多的。

另一個比較頭疼的問題就是,在國內通過Docker Hub下載Docker鏡像是非常慢的,慢到你無法忍受,其中原因大家都心知肚明。一個解決方案是在Docker CE的配置文件中設定本地的Docker Registry鏡像鏈接,比如可以使用阿裏雲提供的鏈接地址。此時,需要登錄阿裏雲並創建一個個人賬號,然後按照https://yq.aliyun.com/articles/29941一文中的介紹,登錄容器Hub服務的控制臺,然後點擊“Docker Hub鏡像站點”,拷貝專屬加速器地址然後配置到/etc/docker/daemon.json文件中即可。具體方法可以按照上面的鏈接做。

技術分享

在配置好鏡像地址並重啟之後,使用docker pull、docker run等命令就會非常快了,大家不妨一試。對於Docker for Windows,你需要打開設置界面,然後在Daemon頁中的Registry mirrors部分,填入鏡像鏈接地址即可。

技術分享

或許你會問,安裝和配置Docker用於搭建自己的開發和測試環境並不容易,我為何不自己在本機裝我所需的數據庫、消息隊列、緩存等服務,而去弄個Docker來運行這些基礎服務呢?我想,驅使我這麽做的原因大概是如下幾點吧:

  1. 如果我的應用程序所依賴的基礎服務比較多的話,在開發機器上逐一安裝這些服務是比較耗時的,而且我很難針對不同版本的服務進行測試。使用Docker可以很方便地在基礎服務版本之間進行切換,比如可以使用Docker鏡像的tag來指定我所需要的MongoDB的版本
  2. 使用Docker,使得基礎服務環境搭建可以被復制。例如我可以使用一個批處理腳本(或者Shell腳本)將運行Docker容器的命令寫入,那麽無論我在哪臺機器上,只要能夠運行這個批處理腳本,都可以一鍵搭建基礎服務環境,無需更多操作。由docker-compose支持的部署方式使得基礎服務的部署變得更加簡單,也就是當我的應用程序準備上線時,我只需要將我的docker-compose YAML文件上傳到Docker Orchestrator上,由其負責管理和運行相關的容器即可
  3. 在Hyper-V托管的虛擬機中運行Docker容器,可以更好地利用和分配主機資源,在不需要的時候可以將主機性能損耗降到最低。目前硬件價格都不算昂貴,運行一個4GB內存的虛擬機並不是那麽吃力。此外,Hyper-V的關機選項允許在主機關閉的時候,讓虛擬機處於休眠待機狀態,而在主機運行時又按需喚醒虛擬機,因此,每次開機,基礎服務都是正常運行狀態,你只需要直接運行你的應用程序即可

下面我簡單介紹一下docker-compose工具。

Docker-compose簡介

Docker-compose聽起來像是一個由YAML語法定義的文本文件,通過docker-compose命令行解釋執行。在docker-compose.yml文件中,你可以編輯你需要運行的Docker容器(稱之為服務),以及這些服務之間的依賴關系。Docker-compose可以很好地幫你維護這些服務的生命周期。在Docker for Windows中,docker-compose是被默認安裝的,你可以通過--version參數來查看安裝的版本:

技術分享

而對於運行於Hyper-V托管的Linux中,docker-compose需要單獨安裝。安裝方法請參考:https://docs.docker.com/compose/install/。推薦使用1.13.0以上的版本,新版本對Compose file 3.0的支持會比較好。

舉個例子,在我自己開發的Apworks框架中,我使用如下docker-compose.yml來定義我的基礎服務運行容器:

version: "3"
services:
  mongo:
    image: mongo
    ports:
      - "27017:27017"
    container_name: apworks_mongodb

  postgres:
    image: orchardup/postgresql
    ports:
      - "5432:5432"
    environment:
      - POSTGRESQL_USER=test
      - POSTGRESQL_PASS=oe9jaacZLbR9pN
      - POSTGRESQL_DB=test
    container_name: apworks_psql

  rabbit:
    image: rabbitmq
    ports:
      - 5672:5672
      - 4369:4369
      - 5671:5671
      - 25672:25672
    container_name: apworks_rabbitmq

這個docker-compose.yml文件中指定啟動三個容器:MongoDB、PostgreSQL以及RabbitMQ,分別定義成了三個服務(service)。這個compose文件還是比較簡單的,沒有牽涉到容器之間的依賴關系。我只需要在這個文件所在目錄中,執行下面這條命令,即可同時啟動這三個服務:

sudo docker-compose up

非常方便。啟動結果如下:

技術分享

還可以在docker-compose命令中加入-d參數,使得所有服務在後臺運行。有關Compose文件的格式定義,請參考:https://docs.docker.com/compose/compose-file/。在工作中我們也使用了docker-compose幫助用戶搭建他們自己的微服務環境,我們分發給用戶的僅僅是一個docker-compose.yml文本文件,一旦運行,所有的基礎服務容器都會運行起來,用以為前臺的數據分析系統提供服務保障。

總結

本文介紹了我在Windows 10系統下使用Docker來幫助開發和測試的一些經驗和感受。Docker是一個非常好的東西,對於系統的部署和運維有很大的幫助,並且它是雲友好的,有著全球各大雲服務供應商的支持,能夠很方便地部署並運行在雲環境中。今後我還會介紹一下Azure下Docker容器的支持和使用,歡迎大家各抒己見,分享自己的使用經驗。

Windows 10下Docker使用經驗談