最初的2小時(shí),你會(huì)愛上Docker,,對(duì)原理和使用流程有個(gè)最基本的理解,,避免滿世界無頭蒼蠅式找資料。本人反對(duì)暴風(fēng)驟雨式多管齊下狂轟濫炸的學(xué)習(xí)方式,,提倡迭代學(xué)習(xí)法,,就是先知道怎么玩,有個(gè)感性認(rèn)識(shí),,再深入學(xué)習(xí)高級(jí)用法,,深層原理,一輪輪迭代,。堅(jiān)決反對(duì)一上來就搞幾百頁厚的東西把人腦子弄亂,。 Docker是什么? KVM、Virtualbox,、Vmware是虛擬出機(jī)器,,讓每個(gè)實(shí)例看到一個(gè)單獨(dú)的機(jī)器,;而Docker是虛擬出操作系統(tǒng),,實(shí)現(xiàn)應(yīng)用之間的隔離,讓各個(gè)應(yīng)用覺得自己有一個(gè)自己的操作系統(tǒng),,而且彼此之間隔離,。假設(shè)沒有Docker,然后有進(jìn)程1和進(jìn)程2,,它們的運(yùn)行將類似下圖,,進(jìn)程1和進(jìn)程2共享kernel,它們是同一OS下2個(gè)進(jìn)程,,因此必須擁有不同PID,,但是又共享網(wǎng)卡,共享IP地址,,看到一樣的根文件系統(tǒng)(不chroot的情況下)等,,可以用Linux IPC手段進(jìn)程間通信。 有Docker的情況下,,假設(shè)進(jìn)程1和進(jìn)程2運(yùn)行于不同的容器,,那么進(jìn)程1和進(jìn)程2都覺得自己和對(duì)方?jīng)]有半毛錢關(guān)系,都覺得自己擁有自己的根文件系統(tǒng),,自己的網(wǎng)卡等,,然后進(jìn)程1和進(jìn)程2的PID還可以一樣,比如假設(shè)2個(gè)都是100,。但是,,此100非彼100。 Virtualbox等虛擬機(jī)的思路則完全不一樣,,如果進(jìn)程1和進(jìn)程2運(yùn)行于不同的虛擬機(jī),,則操作系統(tǒng)都是雙份的,它們感覺自己在不同的虛擬電腦上面跑,。 由于可見,,Docker達(dá)到了類似虛擬機(jī)的效果,但是又沒有虛擬機(jī)的開銷,,它虛擬的層次更加高,。Docker不虛擬機(jī)器,僅僅虛擬應(yīng)用的運(yùn)行環(huán)境,。 為什么Docker也可以“虛擬化”,? 虛擬化,本質(zhì)上一種虛幻,,給你一種幻覺,,讓你覺得擁有的很多甚至擁有全世界,,哪怕你實(shí)際是一只螻蟻。 經(jīng)過本人多年研究,,虛擬化的技術(shù)分為2種,,一種是虛擬一個(gè)世界,第二個(gè)是虛擬一個(gè)氛圍,。 比如我們?cè)诂F(xiàn)實(shí)生活里面是個(gè)屌絲,,但是在虛擬人生的游戲里面,我們可以是王思聰 ,,集美貌智慧財(cái)富正義于一生,。虛擬人生的游戲,構(gòu)建一個(gè)整個(gè)的新世界,,這個(gè)世界,,人人有房住,天下沒有賊,。那么這個(gè)就是硬件都變了,,你的內(nèi)核都變了。這個(gè)是Virtualbox,,KVM這種虛擬出一個(gè)新世界的思路,。 虛擬一個(gè)氛圍,是Docker的做法,。例如貴公司的Linux部門以前只有3,4個(gè)工程師,,然后有一個(gè)Manager,后來有30個(gè)人了,,你就可以分什么內(nèi)核組,、驅(qū)動(dòng)組、應(yīng)用組等更多的組,,然后又多出幾個(gè)Manager,。這種組,類似于名稱空間,,在每一個(gè)單獨(dú)名稱空間的Manager,,都覺得自己是個(gè)Manager,于是他會(huì)爽那么一點(diǎn)點(diǎn),。 最開始是這樣的: 后來是這樣的: 如果這樣還不夠,,還可以搞聲卡驅(qū)動(dòng)組Manager,網(wǎng)卡驅(qū)動(dòng)組Manager,,反正可以不停地搞,。大家在各自的Container里面占山為王。 Docker就是這樣的名稱空間讓各自在同樣的Linux平臺(tái)上面各自暗爽,裝到你自己的容器里面爽,。 安裝Docker 如果是Windows主機(jī),,可以下載docker-toolbox一路安裝,安裝過程中如果提示什么錯(cuò),,可以把360等類似軟件關(guān)閉,。Windows安裝好Docker后,使用Docker Quickstart Terminal運(yùn)行,。 如果是Ubuntu,,可以按照https://docs./engine/installation/linux/ubuntu/網(wǎng)頁進(jìn)行安裝,。最簡(jiǎn)單的Ubuntu 16.04就是命令: Ubuntu安裝Docker后,可以把當(dāng)前用戶加到Docker用戶組以便當(dāng)前用戶也有權(quán)限操作Docker client和host之間的通信socket(之后請(qǐng)重啟Docker相關(guān)服務(wù)): sudo usermod -aG docker $USER 為了裝逼需要,,我們?cè)贒ocker Hub網(wǎng)頁注冊(cè)一個(gè)用戶名,,我注冊(cè)的用戶名是21cnbao。這樣以后,,就可以自己提交自己的image了,。 Docker的架構(gòu) Docker中可能涉及到3個(gè)機(jī)器或者更多機(jī)器,一個(gè)運(yùn)行Docker命令的client,, 一個(gè)包含images并以容器(Container)形式運(yùn)行image的主機(jī),,一個(gè)Docker的images倉庫。client與docker host上面的docker daemon通信,。當(dāng)然docker client和host可以運(yùn)行于一臺(tái)機(jī)器(我們做實(shí)驗(yàn)的時(shí)候是一臺(tái)),,默認(rèn)的Docker倉庫是Docker Hub。 一般的流程中,,client發(fā)pull命令從倉庫把image拉到docker host,,然后通過run命令指揮image到host上面弄一個(gè)Container來跑這個(gè)image。 當(dāng)然也可以是相反的流程,,client 通過build命令在host上面創(chuàng)建一個(gè)自己的image,,然后通過push命令把image推到倉庫。之后這個(gè)image可以被別的人或者自己pull,。 image到底是個(gè)什么鬼,? Docker鏡像是一個(gè)特殊的文件系統(tǒng),提供容器運(yùn)行時(shí)所需的程序,、庫,、資源、配置等文件外,,還包含了一些為運(yùn)行時(shí)準(zhǔn)備的一些配置參數(shù)(如匿名卷,、環(huán)境變量、用戶等)。image為特定目的而生,,比如弄了個(gè)Nginx的image后,,這個(gè)image就把Nginx的東西包羅萬象了,無論是張三,、王五,、六麻子還是七癩子,無論它是什么電腦,,什么操作系統(tǒng),,只要支持Docker,它把這個(gè)Nginx的image下載下來后,,拿docker run命令就可以弄容器跑Nginx了,。這樣,用戶就不用裝Nginx以及它依賴的一切包了(通常裝一個(gè)軟件弄依賴也能把你弄地?zé)┰晁懒耍?。這樣看起來,,Docker實(shí)在是居家旅行,殺人越貨之必備良器也,! 鏡像構(gòu)建時(shí),,會(huì)一層層疊加,前一層是后一層的基礎(chǔ),。 每一層構(gòu)建完就不會(huì)再發(fā)生改變,,后一層上的任何改變只發(fā)生在自己這一層。比如,,刪除前一層文件的操作,,實(shí)際不是真的刪除前一層的文件,而是僅在當(dāng)前層標(biāo)記為該文件已刪除,。所以這個(gè)很類似Git(http://lib.csdn.net/base/git)里面這一次提交相對(duì)于上一次提交的diff: $git diff
layout/book_index_template.html | 8 -
text/05_Installing_Git/0_Source.markdown | 14
text/05_Installing_Git/1_Linux.markdown | 17
text/05_Installing_Git/2_Mac_104.markdown | 11
text/05_Installing_Git/3_Mac_105.markdown | 8
text/05_Installing_Git/4_Windows.markdown | 7
.../1_Getting_a_Git_Repo.markdown | 7 -
.../0_Comparing_Commits_Git_Diff.markdown | 45 -
.../0_Hosting_Git_gitweb_repoorcz_github.markdown | 4 -
9files changed, 115 insertions( ), 6 deletions(-) 這些疊加的最后一層就是Container,,所以你在Container里面改了文件,其實(shí)不會(huì)進(jìn)image,。 一次完整的Docker實(shí)作 說了那么多后,,我們必須親自動(dòng)手玩了。下面把pull,,run,,build,push都玩一次,,破除神秘感,。一個(gè)典型的運(yùn)行流程如下: 1. client用pull命令從倉庫把image拉到docker hostdocker pull的格式是: docker pull[選項(xiàng)] [Docker Registry地址] <倉庫名>:<標(biāo)簽名> 默認(rèn)地址是 DockerHub。 倉庫名:這里的倉庫名是兩段式名稱,,既 / ,,“/”前面一般是用戶名,。對(duì)于 Docker Hub,如果不給出用戶名,,則默認(rèn)為 library ,,也就是官方鏡像。 下載 Ubuntu14.04的image(以Ubuntu為例): baohua@ubuntu:~$docker pull ubuntu:14.04
14.04:Pulling from library/ubuntu
c60055a51d74:Downloading [> ] 539.8 kB/65.69 MB
755da0cdb7d2:Download complete
969d017f67e6:Download complete
37c9a9113595:Download complete
a3d9f8479786:Download complete
… 運(yùn)行docker images命令看看下載的images: $docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu ml 14.04 b969ab9f929b 4 weeksago 188 MB 2. 在docker host上面運(yùn)行Ubuntu 14.04于Containers我們現(xiàn)在運(yùn)行Ubuntu14.04中的bash shell,,因?yàn)閐ocker運(yùn)行image于容器時(shí),,需要指定主進(jìn)程(本例的主進(jìn)程為bash)。 在終端1上面運(yùn)行: docker run -it --rm ubuntu:14.04 bash 在終端2上面運(yùn)行: docker run -it --rm ubuntu:14.04 bash 這樣我們就運(yùn)行了Ubuntu 14.04這個(gè)image的2次實(shí)例(得到2個(gè)容器), Linux下面的ps命令是看進(jìn)程的,,Docker下面就是看image的實(shí)例容器了,。 $ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e3a913872698 ubuntu:14.04 'bash' 11seconds ago Up 10 seconds wizardly_elion
db1c25753e97 ubuntu:14.04 'bash' 21seconds ago Up 21 seconds adoring_shannon image和container之間的關(guān)系類似程序與進(jìn)程之間的關(guān)系,一個(gè)靜若處子,,一個(gè)動(dòng)如脫兔,。比如程序QQ,運(yùn)行一次就是1個(gè)QQ進(jìn)程,,再運(yùn)行一個(gè)QQ就是第2個(gè)QQ進(jìn)程,。同樣道理,,一個(gè)image也可以運(yùn)行多份Container,。 3. 構(gòu)建自己的image現(xiàn)在想在Ubuntu 14.04中增加Vim和GCC,構(gòu)建一個(gè)增量image,,因?yàn)槟壳暗腢buntu image里面沒有這樣的命令: root@e3a913872698:/# vim
bash: vim: command not found 于是在Ubuntu 14.04這個(gè)image基礎(chǔ)上面,,疊加一層,然后把它提交到docker hub的21cnbao的倉庫,。 我們需要在客戶端電腦上面創(chuàng)建一個(gè)Dockerfile文件(該文件用于描述image),,以實(shí)現(xiàn)在現(xiàn)有的Ubuntu 14.04上面做增量的目的。 $ mkdir myubuntu
$ cd myubuntu/
$ touch Dockerfile 用Vim編輯Dockerfile,,添加如下內(nèi)容: # ubuntu 14.04 with vim and gcc
FROM ubuntu:14.04
MAINTAINER Barry Song<[email protected]>
RUN apt-get update && apt-getinstall –y vim gcc RUN 指令的含義是在指定在源image內(nèi)執(zhí)行一條命令,,本例更新APT 緩存,并且安裝Vim和 GCC以形成一個(gè)增量image,。 下面build這個(gè)image: $ docker build -t 21cnbao/myubuntu:14.04 .
time='2017-02-21T06:48:07 08:00'level=info msg='Unable to use system certificate pool: crypto/x509: systemroot pool is not available on Windows'
Sending build context to Docker daemon2.048 kB
Step 1/3 : FROM ubuntu:14.04
---> b969ab9f929b
Step 2/3 : MAINTAINER Barry Song<[email protected]>
---> Running in f1449746b58c
---> 5dacd7a6ee5d
Removing intermediate containerf1449746b58c
Step 3/3 : RUN apt-get update &&apt-get install vim gcc
---> Running in b1469caf3509
Ign http://archive. trustyInRelease
Get:1 http://archive.trusty-updates InRelease [65.9 kB]
Get:2 http://archive.trusty-security InRelease [65.9 kB]
Get:3 http://archive. trustyRelease.gpg [933 B]
Get:4 http://archive. trustyRelease [58.5 kB]
Get:5 http://archive.trusty-updates/main Sources [485 kB]
… 下面運(yùn)行21cnbao/myubuntu 14.04這個(gè)鏡像: docker run -it --rm 21cnbao/myubuntu:14.04 bash 發(fā)現(xiàn)GCC和Vim都有了: $ docker run -it --rm 21cnbao/myubuntu:14.04 bash
root@f33ee07caf43:/#gcc
gcc: fatal error: no input files
compilation terminated.
root@f33ee07caf43:/# 4. 通過docker push把image提交到倉庫在Docker Hub上面創(chuàng)建一個(gè)倉庫myubuntu,,該倉庫創(chuàng)建后,全名將為21cnbao/myubuntu,。 下面push這個(gè)image到Docker Hub,,之前我們需要登錄到Docker Hub: $ docker login --username=21cnbao [email protected]
Flag--email has been deprecated, will be removed in 1.14.
Password:
Login Succeeded 下面開始push: $ docker push 21cnbao/myubuntu
time='2017-02-21T07:17:59 08:00'level=info msg='Unable to use system certificate pool: crypto/x509: systemroot pool is not available on Windows'
The pushrefers to a repository [docker.io/21cnbao/myubuntu]
87157b68b121:Pushing [> ] 1.109 MB/134.7 MB
c9fc7024b484:Pushing [==================================================>] 3.072 kB
ca893d4b83a6:Pushing [==================================================>] 4.608 kB
153bd22a8e96:Pushing 7.168 kB
83b575865dd1:Pushing [==================================================>] 209.9 kB
918b1e79e358:Waiting
… 通過Docker Hub進(jìn)哥的倉庫看一眼,發(fā)現(xiàn)大功告成了,。 2小時(shí)結(jié)束,,相信你已經(jīng)愛上Docker。相愛容易相處難,,痛苦才剛剛開始,。人生若只如初見,,何事秋風(fēng)悲畫扇。等閑變卻故人心,,卻道故人心易變,。 后面如果有時(shí)間,再完成一個(gè)《Docker 相處的8小時(shí)》,。
|
|