Docker 101 - 概覽
寫這篇文章時,使用的Docker版本是1.6.1。 對于Docker這樣迭代極快的系統,這很重要。
文章的目標讀者是聽說過Docker但并未使用過的用戶。 希望能夠介紹一些使用情況,并鼓勵越來越多的用戶。
Docker 可以打包應用,從而作為軟件開發的標準單元。 靜態的概念是鏡像(Image),動態的概念是容器(Container)。 是一種輕量級的虛擬化實現。
Docker家族
Docker 社區極為活躍,變更極大。開始使用之前,最好先看看官方文檔,確認文章描述的還跟得上時代。:)
官方的主要組件有:
- Docker Engine (aka Docker) - 創建和運行 Docker 容器
- Docker Hub - 社區化的 Docker 資源。在這里可以獲取和發布配置好的系統鏡像。
- Docker Compose - 組合 Dockers 形成統一服務的配置工具。事實上是 fig 的官方升級。
- Docker Registry - Docker Hub 私有版,便于團隊協同。
- Docker Swarm - Docker 主機集群和容器調度。
- Docker Machine - 自動化容器管配。可以應用在本地,遠程或云端的 Docker 創建。有點像 Ubuntu 整合的 MaaS,然而輕巧很多。目前還處于 beta 版本。
- Docker Mirror - Docker 提供了工具緩存 Docker Hub 的鏡像,便于本地團隊開發。
這么多是不是已經暈了?說好的小巧方便,易學易用呢?
這也不完全是 Docker 的錯,發展太快了,不要說書籍,連博文都很快落后。 整理下思路,看看學了有沒有用。
Docker 可以做什么
從把玩到實際應用,Docker可以:
快速且標準化的建立開發環境
這點類似 Vagrant,各有利弊。Docker 更模塊化。Vagrant 概念更加容易理解。 如何開始?這里是 Mac OSX 下 Rails Docker開發案例
將里面所說的 fig 換成 docker-compose 即可,語法都是一樣的。
整體說來的結構如下
- boot2docker做了命令行到vm中 docker 的翻譯器,可以透明的在 Mac 下使用 docker
- docker 根據Dockerfile從本地或遠程Docker Hub 中下載鏡像(預定義的打包系統)并低開銷的加載在 Container 中
- Dockerfile中還會定義一些配置命令,用于個性化 Container 中加載的鏡像
- docker run 命令幫助用戶在配置好的 container 運行程序
如果是 linux,那么基本從2開始就可以了,不用考慮 boot2docker 是什么。
其中 boot2docker 起到了 vm 的作用(基于 virtualbox),虛擬了一個 linux 系統。
將 docker 命令透明的轉化到虛擬機的 docker daemon 中(因為 Docker 本來就是支持遠程的)。 實際的實現基本是配置環境變量,因此非常穩定。
ruby 鏡像中包括了基本的依賴,就像運行在一個標準的 linux 中,因為是公用的,大家都一樣,不用擔心編譯需要什么包的問題。
docker 在容器中運行后,可以打包成新的鏡像分發。其中還引入了版本的概念,和git很像,基本的操作包括 push/pull/commit 等
如果有什么特殊的需要,可以修改并保存在 Dockerfile 中,隨 SCM 工具(git)提交,保證團隊使用的一致性。
當然可以把數據庫服務器應用都裝在一個 image 中,但這并不 docker
docker 的哲學中,模塊化是彈性的基礎。
因此,我們需要 docker-compose.yml 來定義容器間的運行時關系。
docker-compose 會自動將相關的依賴注入各個 docker 容器的環境變量。正確的應用這些特性才能靈活的擴展。
還請詳細參考官方的 Rails Docker 開發參考
在生產中彈性部署
Docker 最強大的地方,在于開包即用的生產特性。
利用 Docker Swarm 快速的創建 Docker 集群,瞬間實現彈性計算。
Docker Swarm 需要連接每個 host 上運行的 Docker Daemon,將多個本地,云端,甚至虛擬主機變成一個一體的抽象虛擬機。從而靈活的實現彈性部署。
整件事情也并不復雜,只需要一個網頁的指導就可以了
如果能夠有效的結合運營監控系統,就可以實現自動化的彈性適性部署,感覺就像擁有了全世界。而這一切,并不需要有個多么高科技的機房。
Demo 和產品分發
很多企業項目的上線,都特別痛苦。因為有無數的線上配置操作,長長的上線行動表讓人窒息。運營工程師各個都要處女座加 AB 型,但仍然狀況不斷。
Docker 可以讓這一切固化在版本控制的配置代碼里。
即使面對爆發的流量需要緊急擴容,也可以將成本降低到最低(當然,這需要長期的實踐和整體架構的支持)
Docker 也可以很容易的部署在 SaaS 服務的容器中,使用別人維護的基礎設施,專注于核心業務邏輯。
也可以有效的利用計算需求時空分配不均的問題,最大限度降低門檻。
實際應用Docker(特別是中國)
Docker 最讓人驚訝的恐怕就是在生產環境的普及,作為一個2歲的項目。在國內的京東和攜程都得到了相當規模的應用。
當然,他們的吐槽也不少。好在很多問題都在快速的解決中。
我們看看入門 Docker 可能會遇到的一些困難和解決方案。
網速或者你懂的
Docker 鏡像很難少于百兆,畢竟打包了個操作系統。網速會成為極大的問題。Docker 本地是個離散型的鏡像庫,因此同一鏡像只需要下載一次。同時,還提供了 mirror 和 registry 兩種工具或組件。
- mirror 可以幫你重定向請求到本地或第三方的加速庫,避免從緩慢而你懂的 Docker Hub 下載
- registry 可以在內網存儲團隊鏡像庫,快速的分享成果。
入門時,可以應用國內的 DaoCloud 提供的免費加速鏡像。注冊后在控制臺點加速器可以看到詳細的說明。http://daocloud.io 官方的幫助說明在這里
另外實際使用時,軟件內部的依賴管理系統如 deb 也會遭遇速度的問題。所以要預先部署一些工具如 artfactory / apt-cacher 等等。
docker 官方就提供了部署 apt-cacher工具的例子 看看是不是比以前方便一些。
文檔和教程
Docker 太快了,搜到的博文都很可能是過期的。建議先從官方文檔看起。
另外需要注意的是,Docker 是基于 linux 的,其他平臺都需要合適的虛擬機方案。
硬件要求
普通的開發電腦就可以。但要體驗集群,需要大內存和多核 CPU ,相對于 OpenStack 等的要求,應該說很貧民。對,是貧不是平。
團隊開發
建議先從配置文件共享做起。做到鏡像共享需要更多的熟悉。
文/王嘯
來自:http://blog.2byte.us/devops/rails/ruby/mac/docker/2015/06/23/docker-overview.html