關於Docker在測試方面的應用

Docker 火了很長一段時間了,前段時間簡單的學習和試玩了一會兒,發現他對測試頗有價值,以爲有必要再次深刻研究。java

這裏標記一些較好的學習網址,用做參考:mysql

InfoQ上面有系列的文章:git

深刻淺出Docker在InfoQ上的內容: http://www.infoq.com/cn/dockerdeep/github

深刻淺出Docker(一):Docker核心技術預覽:http://www.infoq.com/cn/dockerdeep/
深刻淺出Docker(二):Docker命令行探祕:http://www.infoq.com/cn/articles/docker-command-line-quest
深刻淺出Docker(三):Docker開源之路:http://www.infoq.com/cn/articles/docker-open-source-road
深刻淺出Docker(四):Docker的集成測試部署之道:http://www.infoq.com/cn/articles/docker-integrated-test-and-deployment
深刻淺出Docker(五):基於Fig搭建開發環境:http://www.infoq.com/cn/articles/docker-build-development-environment-based-on-fig
深刻淺出Docker(六):像谷歌同樣部署你的應用:http://www.infoq.com/cn/articles/deploy-your-application-like-google

Docker源碼分析(一):Docker架構:http://www.infoq.com/cn/articles/docker-source-code-analysis-part1
Docker源碼分析(二):Docker Client建立與命令執行:http://www.infoq.com/cn/articles/docker-source-code-analysis-part2
Docker源碼分析(四):Docker Daemon之NewDaemon實現:http://www.infoq.com/cn/articles/docker-source-code-analysis-part4
Docker源碼分析(五):Docker Server的建立:http://www.infoq.com/cn/articles/docker-source-code-analysis-part5
Docker源碼分析(六):Docker Daemon網絡:http://www.infoq.com/cn/articles/docker-source-code-analysis-part6

解讀2014之Docker篇:才氣、勇氣、運氣:http://www.infoq.com/cn/articles/2014-review-dockerweb

-----------------------------------------------------------------------------------------------------------------sql

簡單來看,什麼是Docker?docker

Docker的英文本意是碼頭工人,也就是搬運工,這種搬運工搬運的是集裝箱(Container),集裝箱裏面裝的可不是商品貨物,而是任意類型的App,Docker把App(叫Payload)裝在Container內,經過Linux Container技術的包裝將App變成一種標準化的、可移植的、自管理的組件,這種組件能夠在你的筆記本上開發、調試、運行,最終很是方便和一致地運行在生產環境下的各類雲機房和服務器上。shell

Docker的核心底層技術是LXC(Linux Container),Docker在其上面加了薄薄的一層,添加了許多有用的功能。數據庫

Docker提供了一種可移植的配置標準化機制,容許你一致性地在不一樣的機器上運行同一個Container;而LXC自己可能由於不一樣機器的不一樣配置而沒法方便地移植運行;
Docker以App爲中心,爲應用的部署作了不少優化,而LXC的幫助腳本主要是聚焦於如何機器啓動地更快和耗更少的內存;
Docker爲App提供了一種自動化構建機制(Dockerfile),包括打包,基礎設施依賴管理和安裝等等;
Docker提供了一種相似git的Container版本化的機制,容許你對你建立過的容器進行版本管理,依靠這種機制,你還能夠下載別人建立的Container,甚至像git那樣進行合併;
Docker Container是可重用的,依賴於版本化機制,你很容易重用別人的Container(叫Image),做爲基礎版本進行擴展;
Docker Container是可共享的,有點相似github同樣,Docker有本身的INDEX,你能夠建立本身的Docker用戶並上傳和下載Docker Image;
Docker提供了不少的工具鏈,造成了一個生態系統;這些工具的目標是自動化、個性化和集成化,包括對PAAS平臺的支持等;編程


Docker 有什麼用呢?

從運維的角度來講,你的應用程序通常都須要特定版本的操做系統、應用服務器、 JDK 、數據庫服務器,還可能須要調整配置文件和其餘一些依賴關係。應用程序可能須要綁定到指定的端口和必定量的內存。這些運行應用程序所須要的組件和配置就是所說的應用程序操做系統。你固然能夠寫一個包含下載和安裝這些組件的安裝腳本。 Docker 簡化了這個流程,經過建立一個包含應用程序和基礎設施的鏡像(image),看成一個組件進行管理。這些鏡像能夠建立 Docker 容器(container),容器運行在 Docker 提供的容器虛擬化平臺上。

Docker 的構成
Docker 有兩個主要組件:
Docker:開源的容器虛擬化平臺
Docker Hub:共享和管理 Docker 鏡像的 Saas 平臺


Docker 採用 Linux 容器 來提供隔離、沙箱、複製、資源限制、快照和其餘的一些優點。鏡像是 Docker 的「構建組件」,也是應用操做系統的只讀模版。容器是從鏡像建立出來的運行狀態,是 Docker 的「運行組件」。容器是能夠運行、啓動、中止、移動和刪除的。鏡像保存的倉庫是 Docker 的「分發組件」。

Docker的鏡像與容器
Docker 按啓動順序包含兩個組件:
服務端:運行在宿主機上,負責構建、運行和分發 Docker 容器等重要工做
客戶端:Docker 二進制程序,接收用戶的命令和服務程序進行通訊
客戶端能夠和服務端運行在一臺主機上,也能夠在不一樣的主機上。服務端須要用 pull 命令從倉庫中拉一個鏡像下來。服務端能夠從 Docker Hub 或者其餘配置的倉庫中下載鏡像。服務端主機能夠從倉庫中下載和安裝多個鏡像。而後客戶端就能夠用 run命令 來啓動容器。客戶端與服務端經過socket或者REST API 進行通訊。

Docker 的安裝
在 CentOS 中安裝 Docker:
sudo yum -y install docker-io    #安裝 docker
sudo service docker start        #啓動 docker 服務
sudo chkconfig docker on         #若是須要 docker 服務爲自啓動


在Ubuntu/Debian中安裝 Docker:
sudo apt-get udpate
sudo apt-get install docker.io
sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io     #命令自動補全
其它操做系統的安裝能夠查看官方文檔。

Docker的運行與退出
在瞭解了Image和Container的概念後,咱們能夠開始下載一個Image,Docker的好處就是提供了一個相似github的Image倉庫管理,你能夠很是方便pull別人的Image下來運行,例如,咱們能夠下載一個CentOS Image:
sudo docker pull centos:centos6
這裏 centos6是一個 tag,相似於 Git 的 tag,能過它來肯定下載的 CentOS 的版本。下載完成後,執行docker images命令來列出你已經下載的 images。

下載以後,咱們經過命令行來運行一個容器,命令很簡單,例如咱們想執行一個 shell 終端:
sudo docker run -i -t centos:centos6 /bin/bash


默認狀況下,docker 容器是不提供交互shell 的,也不提供標準輸入。能夠指定-i選項來提供交互,提供-t 選項來分配一個僞終端。
在 Shell 中你能夠作你想作的任意操做,安裝軟件,編寫程序,運行命令等。當你操做後想將結果保存,這時能夠用 docker commit 命令將 Container 提交成 Image。哦,假如你這裏還處在交互 shell 中,記得先使用 Ctrl+d 或者 exit 命令退出。
sudo docker ps -a


首先執行 ps 命令查看容器ID
而後使用 commit 命令將容器進行保存
sudo docker commit 851d custom/centos-aliyun
容器提交後,執行sudo docker images就能看到剛纔提交的容器。


docker端口映射
常常要在 Docker 中開啓某些網絡服務,須要將 docker 虛擬機的網絡端口與宿主機端口鏈接起來。好比將 docker 中的8080端口映射到宿主機的80端口上:
sudo docker run -p 80:8080 custom/tomcat


宿主機硬盤掛載
這也是經常使用功能之一,尤爲是服務須要記錄日誌、保存文件等時候。
sudo docker run -i -t -v /host/dir:/container/path ubuntu /bin/bash
以上是把宿主機器的/host/dir 掛載到/container/path 路徑上。


容器間共享存儲
主要藉助於-volumes-from參數實現
COUCH1=$(sudo docker run -d -v /var/lib/couchdb shykes/couchdb:2013-05-03)COUCH2=$(sudo docker run -d -volumes-from $COUCH1 shykes/couchdb:2013-05-03)
這個特性,讓人有許多想像空間,好比,一個容器實例用於 Web 存儲,另外兩個實例用於 Web 請求,實現讀寫分離。

鏡像的導入/導出
方法1: 使用 save/load 命令來實現鏡像的導入導出
sudo docker save IMAGENAME | bzip2 -9 -c>img.tar.bz2    #或者你喜歡 tar.gz
sudo docker save IMAGENAME > imageName.tar.gz

鏡像導入功能使用 load 命令解壓導入便可
sudo docker load < imageName.tar.gz        # 喜歡壓縮的同窗    bzip2 -d -c <img.tar.bz2 | sudo docker load

方法2: push/pull 將 image 文件推送到Docker Hub上去。這種方法相似於 git。你能夠在 Docker Hub 上創建本身的公有或者私有庫,適用於遠程分享。缺點是,有時 image 文件特別大,須要考慮網絡帶寬問題。

方法3: 搭建本身的私服repository,將 image 提交到私服,適用於企業網絡。

Dockerfile
在 Shell 腳本環境中一步步安裝,低效且勞累。Docker 能夠經過自定義 Dockerfile 實現自動化構建 docker 鏡像的腳本,既方便分享也便於修改與模板化。
# VERSION 1.0.0
# 默認Centos,能夠改爲你須要的任意鏡像FROM centos
# 簽名MAINTAINER wupher "wupher@foxmail.com"RUN echo 'We are running some
# of cool things'RUN yum update RUN yum install -y openssh-serverRUN mkdir -p /var/run/sshd# 設置root ssh遠程登陸密碼RUN echo "root:123456" | chpasswdRUN yum install -y mysql-serverRUN yum install -y java-1.7.0-openjdk# 安裝tomcat 等……
# 掛載硬盤,用於保存 logVOLUME ["/var/log/", "/var/volume2"]
# 容器開放22端口EXPOSE 22
# 容器開放 8080端口EXPOSE 8080
# 設置Tomcat初始化運行,SSH終端服務器做爲後臺運行,這樣 docker run image的時候,這些服務就自動啓動了ENTRYPOINT service tomcat start && /usr/sbin/sshd -D
完整的 DockerFiler,能夠參考官方文檔。

應用場景
Docker目前有如下應用場景:
測試:Docker 很適合用於測試發佈,將 Docker 封裝後能夠直接提供給測試人員進行運行,再也不須要測試人員與運維、開發進行配合,進行環境搭建與部署。
測試數據分離:在測試中,常常因爲測試場景變換,須要修改依賴的數據庫數據或者清空變更 memcache、Redis 中的緩存數據。Docker 相較於傳統的虛擬機,更輕量與方便。能夠很容易的將這些數據分離到不一樣的鏡像中,根據不一樣須要隨時進行切換。
開發:開發人員共同使用同一個 Docker 鏡像,同時修改的源代碼都被掛載到本地磁盤。再也不由於環境的不一樣而形成的不一樣程序行爲而傷透腦筋,同時新人到崗時也能迅速創建開發、編譯環境。
PaaS 雲服務:Docker 能夠支持命令行封裝與編程,經過自動加載與服務自發現,能夠很方便的將封裝於 Docker 鏡像中的服務擴展成雲服務。相似像 Doc 轉換預覽這樣的服務封裝於鏡像中,根據業務請求的狀況隨時增長和減小容器的運行數量,隨需應變。
使用 Docker 來作分步式集羣模擬

現有缺陷(截止2014年11月)
沒法修改 hosts 文件,不能本身作域名解析。一種經常使用的方法是安裝dnsmasq 。
VM 的系統時間是 UTC 時間,貌似沒辦法修改。辦法倒也不是沒有,最經常使用的辦法是將宿主機器的/etc/localtime 映射到鏡像的/etc/localtime:ro 上去。可是這隻能使鏡像與宿主機器保持時區一致,假如但願不一樣的鏡像使用不一樣時區,只有在每次啓動時經過CMD 或者 ENTRPOINT命令來自動調整時區。
目前還沒找到辦法將 Container 的 IP 改爲靜態 IP,重啓容器的時候,IP 可能會發生變化。
受限於 Lxc,外圍環境必須爲 Linux,並且內核版本必須大於2.6.27。
如今還不支持內存轉儲及運行狀態導出。

1.Docker的應用場景?
    對企業用戶而言:東西雖好,我用不上,關我毛事。也就是說,必定要對本身有用的纔可以被使用。
  談到這個問題,就須要看一下Docker的出身,Docker由一家叫作dotCloud的公司2013年3月發佈的,而dotCloud是一個PAAS提供商,在docker的博客中,Docker將本身定位爲「分發應用的開放平臺」,其網站上也明確地提到了Docker的典型應用場景:
  - 對應用進行自動打包和部署(Automating the packaging and deployment of applications)
  - 建立輕量、私有的PAAS環境(Creation of lightweight, private PAAS environments)
  - 自動化測試和持續整合與部署(Automated testing and continuous integration/deployment )
  - 部署和擴展Web應用、數據庫和後端服務(Deploying and scaling web apps, databases and backend services)
  因而可知,Docker的目的是讓用戶用簡單的「集裝箱」方式,快速的部署大量的、標準化的應用運行環境,因此,只要是這類的需求,Docker都比較適合。

2.Docker可否替代虛擬機?
  有些激進的言論聲稱Docker將是現有虛擬機技術的終結者,我的以爲此言論有些浮誇了。Docker是面向應用的,其終極目標是構建PAAS平臺,而現有虛擬機主要目的是提供一個靈活的計算資源池,是面向架構的,其終極目標是構建一個IAAS平臺,或者是SDDC。
  因此,二者並無直接的衝突,各幹各的事兒,只是之前因爲容器技術還不成熟,虛擬機技術暫時搶了一部分面向應用的使用需求,隨着之後的發展,這些應用場景會逐漸的轉向Docker的陣營。
  而且,二者相輔相成。Docker的老東家dotCloud的PAAS服務便基於Amazon的AWS服務,所以,虛擬機是Docker的土壤,而Docker則向用戶展示了業務。

3.Docker可否知足企業的運維需求?
  企業對運維的需求簡單來講主要考量穩定性、可管理性,以及業務高可用和可恢復能力三個方面。


      從穩定性上看,Docker在6月10日發佈了1.0版本,把該版本稱爲一個「里程碑」,並聲稱「1.0的發佈代表在質量、功能完整、後臺兼容和 API 穩定性方面已經提高了一個級別,達到企業 IT 標準」。但在此以前,dotCloud一直警告用戶「不要在生產環境中運行 Docker 」,在RHEL 7中,Docker的版本爲0.11.1,這是1.0發佈前的RC版本,雖然紅帽會將以後的Docker更新和補丁修復更新到0.11版本中,可是,企業客戶在使用這樣一個較新的軟件版本時,仍需承擔不小的穩定性風險的。而在不少企業客戶的軟件版本選擇規範上,都有「需採用已經發布超過半年的穩定版本」的要求。


  可管理性方面,企業的IT運維人員須要所使用的軟件具備很好的可視化管理能力,而且具備可行的監控手段。
  Docker目前的集中化管理主要有DockerUI 、Dockland、Shipyard 等,其中 Shipyard成熟度和活躍度最好。
  Docker的主要做用是應用的發佈和運行,可是,看起來Shipyard在Application的管理上還很粗糙,而且,整個管理思路並非以應用爲中心的,這可能會給企業在集中管理Docker的時候,帶來了必定的「麻煩」。


  而監控的主要目的是快速瞭解系統、運行的建康情況,對風險狀態進行告警,這方面,Docker較爲缺少,還須要企業針對相關環境進行定製化的監控實現。
    在業務高可用和可恢復性方面,咱們知道,在企業中只有核心業務、非核心業務,沒有「非關鍵業務」,任何一個業務都是須要高度可用的,所以,企業業務平臺都要考慮三個事情:本地高可用、數據備份、遠程災難恢復。

      在使用Docker的時候,也許須要從另外一個角度考慮問題,在Docker的應用場景中,提倡「無狀態」應用,也就是說,業務數據僅在數據層進行存儲,而業務層不關注任何數據。業務層的高可用就能夠經過快速的從新部署來實現,數據層仍然採用傳統模式,或者藉助於傳統的方式實現高可用和可恢復性。但這須要時間進行方案摸索和驗證,其可行性和可靠性須要時間來去證實。
      Docker到大規模的企業環境應用還有很多的路要走,可是,它所帶來的便利性仍然不可小視,這將是革命性的改變,「不足」換種說法就是「機會」,這須要大量了解企業業務的合做夥伴圍繞Docker推出相應的解決方案,而Docker的開放性給這種努力帶來了極大的便利性。
  而對於企業來講,Docker對開發、測試團隊帶來的便利性很是巨大,而開發、測試環境對之上所討論到的缺點並不關注,因此,在開發、測試團隊大膽的推廣、使用Docker無疑可以得到極大的收益。

固然,過程當中遇到一個實際的應用案例:《一個更好的開發/測試體驗:在AWS上運行Docker》:http://www.csdn.net/article/2014-10-10/2822038

最後的結尾

Docker 如今受到的關注愈來愈多,前幾天還有傳聞說微軟要收購Docker。可是最終的結果如何,就不得而知了。

固然,不論將來Docker如何,相信隨着開源社區的努力,和你們在應用過程當中的優化與完善,最終Docker會在實際生產環境中愈來愈普及,與實際結合也將會愈來愈緊密,在實際中的應用也將會解決更多的實際問題,發揮更大的價值!

相關文章
相關標籤/搜索