摘要:近期非常火熱,無論是從上的代碼活躍度,還是宣布在中正式支持,都給業界一個信號,這是一項創新型的技術解決方案??梢院喕渴鸲喾N應用實例工作,比如應用后臺應用數據庫應用大數據應用比如集群消息隊列等等都可以打包成一個部署。
1. docker是什么
Docker is an open-source engine that automates the deployment of any application as a lightweight, portable, self-sufficient container that will run virtually anywhere.
Docker是 PaaS 提供商dotCloud開源的一個基于 LXC 的高級容器引擎, 源代碼托管在 Github 上, 基于go語言并遵從Apache2.0協議開源。Docker近期非常火熱,無論是從 GitHub 上的代碼活躍度,還是Redhat宣布在RHEL7中正式支持Docker,都給業界一個信號,這是一項創新型的技術解決方案。就連 Google 公司的 Compute Engine 也支持 docker 在其之上運行,國內“BAT”先鋒企業百度Baidu App Engine(BAE)平臺也是以Docker作為其PaaS云基礎。
Docker產生的目的就是為了解決以下問題:
環境管理復雜:從各種OS到各種中間件再到各種App,一款產品能夠成功發布,作為開發者需要關心的東西太多,且難于管理,這個問題在軟件行業中普遍存在并需要直接面對。Docker可以簡化部署多種應用實例工作,比如Web應用、后臺應用、數據庫應用、大數據應用比如Hadoop集群、消息隊列等等都可以打包成一個Image部署。
云計算時代的到來:AWS的成功,引導開發者將應用轉移到云上, 解決了硬件管理的問題,然而軟件配置和管理相關的問題依然存在 (AWS cloudformation是這個方向的業界標準, 樣例模板可參考這里)。Docker的出現正好能幫助軟件開發者開闊思路,嘗試新的軟件管理方法來解決這個問題。
虛擬化手段的變化:云時代采用標配硬件來降低成本,采用虛擬化手段來滿足用戶按需分配的資源需求以及保證可用性和隔離性。然而無論是KVM還是Xen,在 Docker 看來都在浪費資源,因為用戶需要的是高效運行環境而非OS,GuestOS既浪費資源又難于管理,更加輕量級的LXC更加靈活和快速。
LXC的便攜性:LXC在 Linux 2.6 的 Kernel 里就已經存在了,但是其設計之初并非為云計算考慮的,缺少標準化的描述手段和容器的可便攜性,決定其構建出的環境難于分發和標準化管理(相對于KVM之類image和snapshot的概念)。Docker就在這個問題上做出了實質性的創新方法。
Docker的主要特性如下:
文件系統隔離:每個進程容器運行在完全獨立的根文件系統里。
資源隔離:可以使用cgroup為每個進程容器分配不同的系統資源,例如CPU和內存。
網絡隔離:每個進程容器運行在自己的網絡命名空間里,擁有自己的虛擬接口和IP地址。
寫時復制:采用寫時復制方式創建根文件系統,這讓部署變得極其快捷,并且節省內存和硬盤空間。
日志記錄:Docker將會收集和記錄每個進程容器的標準流(stdout/stderr/stdin),用于實時檢索或批量檢索。
變更管理:容器文件系統的變更可以提交到新的映像中,并可重復使用以創建更多的容器。無需使用模板或手動配置。
交互式Shell:Docker可以分配一個虛擬終端并關聯到任何容器的標準輸入上,例如運行一個一次性交互shell。
2. 比較 2.1 docker vs 傳統虛擬化技術作為一種新興的虛擬化方式,Docker 跟傳統的虛擬化方式(xen、kvm、vmware)相比具有眾多的優勢。
首先,Docker 容器的啟動可以在秒級實現,這相比傳統的虛擬機方式要快得多。 其次,Docker 對系統資源的利用率很高,一臺主機上可以同時運行數千個 Docker 容器。容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷盡量小。傳統虛擬機方式運行 10 個不同的應用就要起 10 個虛擬機,而Docker 只需要啟動 10 個隔離的應用即可。
具體說來,Docker 在如下幾個方面具有較大的優勢。
- 更快速的交付和部署
對開發和運維(devop)人員來說,最希望的就是一次創建或配置,可以在任意地方正常運行。
開發者可以使用一個標準的鏡像來構建一套開發容器,開發完成之后,運維人員可以直接使用這個容器來部署代碼。 Docker 可以快速創建容器,快速迭代應用程序,并讓整個過程全程可見,使團隊中的其他成員更容易理解應用程序是如何創建和工作的。 Docker 容器很輕很快!容器的啟動時間是秒級的,大量地節約開發、測試、部署的時間。
更高效的虛擬化
Docker 容器的運行不需要額外的 hypervisor 支持,它是內核級的虛擬化,因此可以實現更高的性能和效率。
更輕松的遷移和擴展
Docker 容器幾乎可以在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、個人電腦、服務器等。 這種兼容性可以讓用戶把一個應用程序從一個平臺直接遷移到另外一個。
更簡單的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分發和更新,從而實現自動化并且高效的管理。
對比傳統虛擬機總結:
特性 | 容器 | 虛擬機 |
---|---|---|
啟動 | 秒級 | 分鐘級 |
硬盤使用 | 一般為 MB | 一般為 GB |
性能 | 接近原生 | 弱于 |
系統支持量 | 單機支持上千個容器 | 一般幾十個 |
Docker以Linux容器LXC為基礎,實現輕量級的操作系統虛擬化解決方案。在LXC的基礎上Docker進行了進一步的封裝,讓用戶不需要去關心容器的管理,使得操作更為簡便,具體改進有:
Portable deployment across machines
Docker提供了一種可移植的配置標準化機制,允許你一致性地在不同的機器上運行同一個Container;而LXC本身可能因為不同機器的不同配置而無法方便地移植運行;
Application-centric
Docker以App為中心,為應用的部署做了很多優化,而LXC的幫助腳本主要是聚焦于如何機器啟動地更快和耗更少的內存;
Automatic build
Docker為App提供了一種自動化構建機制(Dockerfile),包括打包,基礎設施依賴管理和安裝等等;
Versioning
Docker提供了一種類似git的Container版本化的機制,允許你對你創建過的容器進行版本管理,依靠這種機制,你還可以下載別人創建的Container,甚至像git那樣進行合并;
Component reuse
Docker Container是可重用的,依賴于版本化機制,你很容易重用別人的Container(叫Image),作為基礎版本進行擴展;
Sharing
Docker Container是可共享的,有點類似github一樣,Docker有自己的INDEX,你可以創建自己的Docker用戶并上傳和下載Docker Image;
Tool ecosystem
Docker提供了很多的工具鏈,形成了一個生態系統;這些工具的目標是自動化、個性化和集成化,包括對PAAS平臺的支持等。
Docker作為一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。Docker可以自動化打包和部署任何應用、創建一個輕量級私有PaaS云、搭建開發測試環境、部署可擴展的Web應用等。這決定了它在企業中的應用場景是有限的,Docker將自己定位為“分發應用的開放平臺”,其網站上也明確地提到了Docker的典型應用場景:
Automating the packaging and deployment of applications
Creation of lightweight, private PAAS environments
Automated testing and continuous integration/deployment
Deploying and scaling web apps, databases and backend services
對應用進行自動打包和部署,創建輕量、私有的PAAS環境,自動化測試和持續整合與部署,部署和擴展Web應用、數據庫和后端服務。
平臺即服務一般與大數據量系統同在,反觀當前我司各IT系統,可以在以下情形下使用docker替代方案:
結合vagrant或supervisor,搭建統一的開發、測試環境
多個開發人員共同進行一個項目,就必須保持開發環境完全一致,部署到測試環境、正式環境后,最好都是同一套環境,通過容器來保存狀態,分發給開發人員或部署,可以讓“代碼在我機子上運行沒有問題”這種說辭將成為歷史。
對memcached、mysql甚至tomcat,打包成一個個容器,避免重復配置
比如將一個穩定版本的、已配置完善的mysql,固化在一個鏡像中,假如有新的環境要用到mysql數據庫,便不需要重新安裝、配置,而只需要啟動一個容器瞬間完成。tomcat應用場景更多,可以將不同版本的jvm和tomcat打包分發,應用于多tomcat集群,或在測試服務器上隔離多個不同運行環境要求的測試應用(例如舊系統采用的是jdk6,新系統在jdk7上開發,但共用同一套測試環境)。
docker不足
LXC是基于cgroup等linux kernel功能的,因此container的guest系統只能是linux base的
隔離性相比KVM之類的虛擬化方案還是有些欠缺,所有container公用一部分的運行庫
網絡管理相對簡單,主要是基于namespace隔離
cgroup的cpu和cpuset提供的cpu功能相比KVM的等虛擬化方案相比難以度量(所以dotcloud主要是安內存收費)
container隨著用戶進程的停止而銷毀,container中的log等用戶數據不便收集
另外,Docker是面向應用的,其終極目標是構建PAAS平臺,而現有虛擬機主要目的是提供一個靈活的計算資源池,是面向架構的,其終極目標是構建一個IAAS平臺,所以它不能替代傳統虛擬化解決方案。目前在容器可管理性方面,對于方便運維,提供UI來管理監控各個containers的功能還不足,還都是第三方實現如DockerUI、Dockland、Shipyard等。
4. docker組成部分Docker使用客戶端-服務器(client-server)架構模式。Docker客戶端會與Docker守護進程進行通信。Docker守護進程會處理復雜繁重的任務,例如建立、運行、發布你的Docker容器。Docker客戶端和守護進程可以運行在同一個系統上,當然你也可以使用Docker客戶端去連接一個遠程的Docker守護進程。Docker客戶端和守護進程之間通過socket或者RESTful API進行通信。
更多內容請參考:Docker核心技術預覽 及docker常用管理命令。
4.1 images(鏡像)Docker 鏡像就是一個只讀的模板。例如,一個鏡像可以包含一個完整的 ubuntu 操作系統環境,里面僅安裝了 Apache 或用戶需要的其它應用程序。
鏡像可以用來創建 Docker 容器。
Docker 提供了一個很簡單的機制來創建鏡像或者更新現有的鏡像,用戶甚至可以直接從其他人那里下載一個已經做好的鏡像來直接使用。
Docker 利用容器來運行應用。容器是從鏡像創建的運行實例。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平臺??梢园讶萜骺醋鍪且粋€簡易版的 Linux 環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。
鏡像是只讀的,容器在啟動的時候創建一層可寫層作為最上層。
倉庫是集中存放鏡像文件的場所。有時候會把倉庫和倉庫注冊服務器(Registry)混為一談,并不嚴格區分。實際上,倉庫注冊服務器上往往存放著多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標簽(tag)。
4.3.1 公開倉庫docker團隊控制的top-level的頂級repository,即Docker Hub,存放了數量龐大的鏡像供用戶下載,任何人都能讀取,里面包含了許多常用的鏡像,如ubuntu, mysql ,redis, python等。
4.3.2 個人公共庫個人公共庫也是被托管在Docker Hub上,網絡上的其它用戶也可以pull你的倉庫(如docker pull seanloook/centos6)你可以在修改完自己的container之后,通過commit命令把它變成本地的一個image,push到自己的個人公共庫。(在此之前你需要docker login登錄,或者vi ~/.dockercfg。)
從鏡像運行出一個容器 docker run -t -i 68edf809afe7 /bin/bash 記錄下CONTAINER ID docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1528136ff541 172.29.88.222:5000/centos6:latest /bin/bash 40 minutes ago Exited (0) .. sad_mestorf 從將容器提交成一個新的image (format is "sudo docker commit/ ") # docker commit -m " new images /docker.sean " -a "docker New" fcbd0a5348ca seanloook/centos6:test_tag_sean fe022762070b09866eaab47bc943ccb796e53f3f416abf3f2327481b446a9503 docker images可以看到這個新的鏡像 # docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE seanloook/centos6 test_tag_sean fe022762070b About an hour ago 212.7 MB sean:5000/library/centos6 latest 68edf809afe7 3 weeks ago 212.7 MB
在你commit為一個image后,通過push可以推送到個人公共registry中。此時需要login后才能push(當然沒有設定login的Username,在第一次push時也會提示輸入),接下來比較有意思。
# docker login https://index.docker.io/v1/ Username: seanloook Password: Email: seanlook7@gmail.com Login Succeeded
如果你已經有docker官網的賬號,則只需要輸入正確的用戶名和密碼就可以登錄,郵箱不做驗證;
如果所輸入的Username不存在,則這一步便是自動從官網創建一個賬號,并發送一封確認郵件,以后也可以從https://hub.docker.com/repos/ 登錄。(是不是太簡單了?)
login的同時,也會在~/.dockercfg中加入認證信息
# cat ~/.dockercfg {"https://index.docker.io/v1/":{"auth":"c2Vhbmxvb29rOk15UGFzc3dvcmQ=","email":"seanlook7@gmail.com"}}
其中auth=base64(username:password),base64編碼與解碼。
保存到個人公共庫上,push可以是repos,格式docker push
# docker push seanloook/centos6:test_tag_sean The push refers to a repository [seanloook/centos6] (len: 1) Sending image list Pushing repository seanloook/centos6 (1 tags) 511136ea3c5a: Image already pushed, skipping 5b12ef8fd570: Image already pushed, skipping 68edf809afe7: Image already pushed, skipping fe022762070b: Image successfully pushed Pushing tag for rev [fe022762070b] on {https://cdn-registry-1.docker.io/v1/repositories/seanloook/centos6/tags/test_tag_sean}
上面的push操作也可以是docker push seanloook/centos6(但不能是docker push fe022762070b)。
這些鏡像其他人也可以搜索得到docker search seanloo。
4.3.3 私有倉庫首先與另外一種倉庫區分——Docker Hub Private Repository,它簡單理解為公網上的個人私有庫,與上面的個人公共庫相對應,在Docker Hub上Create Repository時選擇Private便是,只有你自己才可以讀寫。
這里所說的私有倉庫是指自己在本地服務器上搭建的專屬自己的內部倉庫docker-registry,俗稱“私服”,供無法訪問互聯網的內部網絡使用,或者鏡像到本地一份以加快pull、push的速度。
它與公共倉庫最明顯的區分就是repository的命名,如必須使用帶.的主機名或域名,后面必須接:port,如sean.tp-link.net:5000/centos6:your_tag_name,而公共倉庫第一個斜杠前表示的是登錄用戶名。命名關系到推送到哪個服務器的哪個位置,更過內容可以關注搭建docker內網私服(docker-registry with nginx&ssl on centos)。
4.4 運行一個容器的內部過程docker client告訴docker daemon運行一個容器,例如:docker run -i -t ubuntu /bin/bash
讓我們分解一下這個命令,docker client啟動使用一個二進制的docker命令,最小的docker client需要你告訴docker daemon你的容器是從哪個docker鏡像構建的,你希望在容器內部運行哪個命令。所以啟動過程如下:
Pulling the ubuntu image
docker檢查是否存在ubuntu鏡像,如果本地不存在ubuntu鏡像,則docker會到docker index下載。
Creates a new container
利用鏡像創建容器
Allocates a filesystem and mounts a read-write layer
為鏡像創建文件系統層和read-write層
Allocates a network / bridge interface
為容器創建網絡接口,使容器和本地機器可以通訊
Sets up an IP address
在地址池中為容器分配一個可用的IP地址
Executes a process that you specify
運行你的應用
Captures and provides application output
連接log的標準輸入、輸出、錯誤,以使你直到你的應用是否正常運行
深入淺出Docker(一):Docker核心技術預覽
Docker源碼分析(一):Docker架構
Docker Architecture based on v1.3
Docker簡介與入門
原文鏈接地址:http://seanlook.com/2014/12/18/docker-introduction/
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26370.html
摘要:容器鏡像運行后,此時就實例化了一個容器。側重的是應用級別,而虛擬機是徹底隔離整個運行環境。方便交付將應用以及運行環境打包成一個鏡像,交付更簡單高效。下載地址點擊運行即可一如既往的下一步下一步完成安裝。 Docker是什么 Docker是一款由DotCloud公司(現改名為Docker)基于Go語言開發的開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發...
摘要:概述是一個用來定義和運行復雜應用的工具。使用,用戶通過來進行構建。使用,不再需要使用腳本來啟動容器。在配置文件中,所有的容器通過來定義,然后通過腳本來啟動,停止和重啟應用,和應用中的服務以及所有依賴服務的容器。 概述 Docker Compose是一個用來定義和運行復雜應用的Docker工具。使用Compose,你可以在一個文件中定義一個多容器應用,然后使用一條命令來啟動你的應用,完成...
摘要:概述是一個用來定義和運行復雜應用的工具。使用,用戶通過來進行構建。使用,不再需要使用腳本來啟動容器。在配置文件中,所有的容器通過來定義,然后通過腳本來啟動,停止和重啟應用,和應用中的服務以及所有依賴服務的容器。 概述 Docker Compose是一個用來定義和運行復雜應用的Docker工具。使用Compose,你可以在一個文件中定義一個多容器應用,然后使用一條命令來啟動你的應用,完成...
摘要:本系列教程翻譯自,系列共有九篇,本文譯自第一篇。,一種新的容器化技術,因為輕量級和便攜化而受到廣泛關注。本篇文章是系列教程的第一篇。鏡像只讀的容器模板,簡言之就是系統鏡像文件。首先,向發出請求創建一個鏡像并且指定容器內要運行的命令。 本系列教程翻譯自 Flux7 Docker Tutorial Series,系列共有九篇,本文譯自第一篇 Part 1: An Introduction。...
摘要:本系列教程翻譯自,系列共有九篇,本文譯自第一篇。,一種新的容器化技術,因為輕量級和便攜化而受到廣泛關注。本篇文章是系列教程的第一篇。鏡像只讀的容器模板,簡言之就是系統鏡像文件。首先,向發出請求創建一個鏡像并且指定容器內要運行的命令。 本系列教程翻譯自 Flux7 Docker Tutorial Series,系列共有九篇,本文譯自第一篇 Part 1: An Introduction。...
摘要:前置條件這不是一個入門課程。此課程為至少有六個月網站開發經驗的高級入門者設置。主題資源目標這部分結束,具備以下能力。。。第一部分完整代碼依賴第一部分依賴耗時一章需要幾個小時到一整天??沼啻髩K時間來完成一章,特別是,,這些較難的部分。 在第一部分, 你學到如何使用 Docker 來創建一個基于python, postgres, 和 flask web 框架的 RESTful API 可重...
閱讀 3315·2021-11-25 09:43
閱讀 1303·2021-11-23 09:51
閱讀 3608·2021-10-11 11:06
閱讀 3697·2021-08-31 09:41
閱讀 3597·2019-08-30 15:53
閱讀 3509·2019-08-30 15:53
閱讀 965·2019-08-30 15:43
閱讀 3306·2019-08-29 14:02