最近開始學習docker,發現各個地方介紹都是不一樣的。這裡寫的說明的資料有很多是來自網路搜尋到的資料,有很多是來自個人理解。
一,Docker是什麼,為什麼要用docker。
學習docker,必須永遠記住一句話:“一次封裝,到處運行。”
1,概念理解部分。
Docker 是一個能夠把開發應用程式自動部署到容器的開源引擎。它由Docker公司的團隊編寫,基於Apache 2.0開源協議授權。它提供了一個簡單、輕量的建模方式,使開發生命週期更高效快速,鼓勵了面向服務的架構設計。Docker 項目的目標是實現輕量級的作業系統虛擬化解決方案。 Docker 的基礎是 Linux 容器(LXC)等技術。在 LXC 的基礎上 Docker 進行了進一步的封裝,讓使用者不需要去關心容器的管理,使得操作更為簡便。使用者操作 Docker 的容器就像操作一個快速輕量級的虛擬機器一樣簡單。“一次封裝,到處運行。”
首先,Docker 容器的啟動可以在秒級實現,這相比傳統的虛擬機器方式要快得多。
其次,Docker 對系統資源的利用率很高,一台主機上可以同時運行數千個 Docker 容器。容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的效能很高,同時系統的開銷盡量小。傳統虛擬機器方式運行 10 個不同的應用就要起 10 個虛擬機器,而Docker 只需要啟動 10 個隔離的應用即可。
2,Docker 在如下幾個方面具有較大的優勢。
2.1 更快速的交付和部署
對開發和營運(devop)人員來說,最希望的就是一次建立或配置,可以在任意地方正常運行。
開發人員可以使用一個標準的鏡像來構建一套開發容器,開發完成之後,營運人員可以直接使用這個容器來部署代碼。 Docker 可以快速建立容器,快速迭代應用程式,並讓整個過程全程可見,使團隊中的其他成員更容易理解應用程式是如何建立和工作的。 Docker 容器很輕很快!容器的啟動時間是秒級的,大量地節約開發、測試、部署的時間。
2.2 更高效的虛擬化
Docker 容器的運行不需要額外的 hypervisor 支援,它是核心級的虛擬化,因此可以實現更高的效能和效率。
2.3 更輕鬆的遷移和擴充
Docker 容器幾乎可以在任意的平台上運行,包括物理機、虛擬機器、公用雲端、私人雲端、個人電腦、伺服器等。 這種相容性可以讓使用者把一個應用程式從一個平台隨即轉移到另外一個。
2.4 更簡單的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分發和更新,從而實現自動化並且高效的管理。
和傳統的虛擬機器主機相比如下:
1
3,Docker 中的三個核心概念:鏡像,容器,倉庫
Docker 容器本質上是宿主機上的一個進程。Docker 通過 namespace 實現了資源隔離,通過 cgroups 實現了資源的限制,通過寫時複製機制(copy-on-write)實現了高效的檔案操作。
Docker有五個命名空間:進程、網路、掛載、宿主和共用記憶體,為了隔離有問題的應用,Docker運用Namespace將進程隔離,為進程或進程組建立已隔離的Runspace,為進程提供不同的命名空間視圖。這樣,每一個隔離出來的進程組,對外就表現為一個container(容器)。需要注意的是,Docker讓使用者誤以為自己佔據了全部資源,但這並不是”虛擬機器”。
(1)鏡像(image):Docker 鏡像就是一個唯讀模板,鏡像可以用來建立 Docker 容器。Docker 提供了一個很簡單的機制來建立鏡像或者更新現有的鏡像,使用者甚至可以直接從其他人那裡下載一個已經做好的鏡像來直接使用。
鏡像是一種檔案結構。Dockerfile中的每條命令都會在檔案系統中建立一個新的階層,檔案系統在這些層次上構建起來,鏡像就構建於這些聯合的檔案系統之上。
Docker官方網站專門有一個頁面來儲存所有可用的鏡像,網址是:index.docker.io。
(2)容器( Container):容器是從鏡像建立的運行執行個體。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平台。可以把容器看做是一個簡易版的 Linux 環境,Docker 利用容器來運行應用。鏡像是唯讀,容器在啟動的時候建立一層可寫層作為最上層。
(3)倉庫:倉庫是集中存放鏡像檔案的場所,倉庫註冊伺服器(Registry)上往往存放著多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標籤(tag)。目前,最大的公開倉庫是 Docker Hub,存放了數量龐大的鏡像供使用者下載。
Docker倉庫用來儲存我們的images,當我們建立了自己的image之後我們就可以使用push命令將它上傳到公有或者私人倉庫,這樣下次要在另外一台機器上使用這個image時候,只需要從倉庫上pull下來就可以了。Docker 倉庫的概念跟 Git 類似,註冊伺服器可以理解為 GitHub 這樣的託管服務。
二,Docker安裝。
前提條件:Docker運行對核心要求比較高。其中這裡介紹的以centos系統為例,其他系統不做介紹。centos7(64位) 、centos 6.5(64位)及以後,不支援32位運行。在運行centos 6.5及以後版本時,需要核心版本>=2.6.32-431,因為這些核心包含了運行Docker的一些特定修改。
1,centos 7.x 安裝docker
Docker RPM包已經包含在centos-Extra倉庫中,所以我們可以直接使用yum安裝:
yum -y install docker
2,centos 6.5 安裝docker
首先安裝epel源:
yum -y install epel-release
安裝docker:
yum -y install docker-io
[root@docker1 yum.repos.d]# /etc/init.d/docker start #啟動docker
Starting cgconfig service: [確定]
Starting docker: [確定]
[root@docker1 yum.repos.d]# docker info #說明:docker info #查看 docker 基本資料
Containers: 0
Images: 0
Storage Driver: devicemapper
Pool Name: docker-253:0-139088-pool
Pool Blocksize: 65.54 kB
Backing Filesystem: extfs
Data file: /dev/loop0
Metadata file: /dev/loop1
Data Space Used: 305.7 MB
Data Space Total: 107.4 GB
Data Space Available: 4.474 GB
Metadata Space Used: 729.1 kB
Metadata Space Total: 2.147 GB
Metadata Space Available: 2.147 GB
Udev Sync Supported: true
Deferred Removal Enabled: false
Data loop file: /var/lib/docker/devicemapper/devicemapper/data
Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
Library Version: 1.02.117-RHEL6 (2016-04-01)
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 2.6.32-642.1.1.el6.x86_64
Operating System:
CPUs: 2
Total Memory: 996.1 MiB
Name: docker1
ID: ONJP:43QN:ARVF:E5XQ:BBPM:T6DI:XTHG:76JB:PZEG:ELKT:HZDO:XMTZ