Windows 10下Docker使用經驗談

最近一直在開發Apworks框架案例代碼,同時也在一塊兒修復Apworks框架中的Bug和一些設計上的不足。遇到的一個廣泛問題是,代碼的調試過程須要依賴不少外部系統,好比MongoDB、PostgreSQL、RabbitMQ等。固然能夠在本機逐一安裝這些服務,而後對服務進行配置,使其知足本身開發調試的須要。這樣作固然是沒有問題的,只是比較麻煩。因而,我尋求docker的幫助,將服務全都運行在docker容器中,須要的時候一條簡單的docker命令便可啓動,不須要的時候,將docker容器停掉便可,很是方便,並且不會對主機環境形成干擾。固然,實踐過程也不是那麼順利的,也踩了一些坑,如今就跟你們分享一下。html

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個數,以及內存的大小。git

image

然而,一個比較麻煩的問題是,若是你須要使用-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-windowsgithub

因爲這樣的緣由,我沒有在本身的開發環境中使用Docker for Windows 10,由於沒法將MongoDB的數據庫文件映射存儲到主機(Host Machine)上,也就意味着每次啓動容器執行個人一些冒煙測試(Smoke Test),我都須要重建數據,很是麻煩。我選擇了在Hyper-V中搭建本身的Linux虛擬機來構建本身的開發和測試環境。sql

使用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等這些第三方的虛擬機服務。mongodb

啓用Hyper-V的方法很是簡單,在Windows 10中,點擊開始菜單,或者按下鍵盤上的WIN鍵,而後輸入關鍵字windows features,這時會出現「Turn windows features on or off」菜單項(個人系統是英文版,中文版稍做修改):docker

image

點擊這個菜單項,而後會打開你們熟悉的控制面板界面,直接選中其中的Hyper-V就好了:shell

image

應用更改並從新啓動後,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的教程。json

image

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

image   image

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

另外一個比較頭疼的問題就是,在國內經過Docker Hub下載Docker鏡像是很是慢的,慢到你沒法忍受,其中緣由你們都心知肚明。一個解決方案是在Docker CE的配置文件中設定本地的Docker Registry鏡像連接,好比可使用阿里雲提供的連接地址。此時,須要登陸阿里雲並建立一個我的帳號,而後按照https://yq.aliyun.com/articles/29941一文中的介紹,登陸容器Hub服務的控制檯,而後點擊「Docker Hub鏡像站點」,拷貝專屬加速器地址而後配置到/etc/docker/daemon.json文件中便可。具體方法能夠按照上面的連接作。

image

在配置好鏡像地址並重啓以後,使用docker pull、docker run等命令就會很是快了,你們不妨一試。對於Docker for Windows,你須要打開設置界面,而後在Daemon頁中的Registry mirrors部分,填入鏡像連接地址便可。

image

或許你會問,安裝和配置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參數來查看安裝的版本:

image

而對於運行於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

很是方便。啓動結果以下:

image

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

總結

本文介紹了我在Windows 10系統下使用Docker來幫助開發和測試的一些經驗和感覺。Docker是一個很是好的東西,對於系統的部署和運維有很大的幫助,而且它是雲友好的,有着全球各大雲服務供應商的支持,可以很方便地部署並運行在雲環境中。從此我還會介紹一下Azure下Docker容器的支持和使用,歡迎你們各抒己見,分享本身的使用經驗。

相關文章
相關標籤/搜索