Docker出現(xiàn)
Docker 是一個開源項目,誕生于 2013 年初颅湘,最初是 dotCloud 公司內(nèi)部的一個業(yè)余項目。它基于 Google 公司推出的 Go 語言實現(xiàn)。
Docker 項目的目標是實現(xiàn)輕量級的操作系統(tǒng)虛擬化解決方案察署。 Docker 的基礎是 Linux 容器(LXC)等技術(shù)。在 LXC 的基礎上 Docker 進行了進一步的封裝峻汉,讓用戶不需要去關心容器的管理贴汪,使得操作更為簡便。用戶操作 Docker 的容器就像操作一個快速輕量級的虛擬機一樣簡單休吠。
可見容器DOCKER是在操作系統(tǒng)層面上實現(xiàn)虛擬化扳埂,直接復用本地主機的操作系統(tǒng),而傳統(tǒng)方式則是在硬件層面實現(xiàn)瘤礁。
Docker 的出現(xiàn)是因為目前的后端在開發(fā)和運維階段確實需要一種虛擬化技術(shù)解決開發(fā)環(huán)境和生產(chǎn)環(huán)境環(huán)境一致的問題阳懂,通過 Docker 我們可以將程序運行的環(huán)境也納入到版本控制中,排除因為環(huán)境造成不同運行結(jié)果的可能。
Docker基于Linux四種技術(shù)實現(xiàn):
- Linux容器技術(shù)(LXC)
Docker在LXC基礎上完善了自己的控制策略和共享策略岩调。 - Namespace
命名空間是 Linux 內(nèi)核一個強大的特性巷燥。每個容器都有自己單獨的命名空間,運行在其中的應用都像是在獨立的操作系統(tǒng)中運行一樣号枕。 - Cgroup(控制組)
Linux 內(nèi)核的一個特性缰揪,主要用來對共享資源進行隔離击奶、限制抖格、審計等。只有能控制分配到容器的資源耘成,才能避免當多個容器同時運行時的對系統(tǒng)資源的競爭赞厕。 - UnionFS(聯(lián)合文件系統(tǒng))
Union文件系統(tǒng)(UnionFS)是一種分層拍屑、輕量級并且高性能的文件系統(tǒng),它支持對 文件系統(tǒng)的修改作為一次提交來一層層的疊加坑傅,同時可以將不同目錄掛載到同一個虛擬文件系統(tǒng)下僵驰。Union 文件系統(tǒng)是 Docker 鏡像的基礎。鏡像可以通過分層來進行繼承唁毒,基于基礎鏡像(沒有父鏡像)蒜茴,可以制作各種具體的應用鏡像。另外浆西,不同 Docker 容器就可以共享一些基礎的文件系統(tǒng)層粉私,同時再加上自己獨有的改動層,大大提高了存儲的效率近零。
Docker工作原理 參考
掌握一門技術(shù)并合理使用它的最好辦法就是深入理解這項技術(shù)背后的工作原理
深入理解Docker的命令诺核,還有容器(container)和鏡像(image)之間的區(qū)別,并深入探討容器和運行中的容器之間的區(qū)別,才能更好的運用docker久信。
Image Definition
鏡像(Image)就是一堆只讀層(read-only layer)的統(tǒng)一視角窖杀,也許這個定義有些難以理解,下面的這張圖能夠幫助讀者理解鏡像的定義裙士。
從左邊我們看到了多個只讀層入客,它們重疊在一起。除了最下面一層腿椎,其它層都會有一個指針指向下一層桌硫。這些層是Docker內(nèi)部的實現(xiàn)細節(jié),并且能夠在主機(譯者注:運行Docker的機器)的文件系統(tǒng)上訪問到啃炸。統(tǒng)一文件系統(tǒng)(union file system)技術(shù)能夠?qū)⒉煌膶诱铣梢粋€文件系統(tǒng)铆隘,為這些層提供了一個統(tǒng)一的視角,這樣就隱藏了多層的存在南用,在用戶的角度看來膀钠,只存在一個文件系統(tǒng)掏湾。我們可以在圖片的右邊看到這個視角的形式。
- 從封裝的角度上來看, 鏡像=操作系統(tǒng)+軟件運行環(huán)境+用戶程序
Container Definition
容器(container)的定義和鏡像(image)幾乎一模一樣托修,也是一堆層的統(tǒng)一視角,唯一區(qū)別在于容器的最上面那一層是可讀可寫的恒界。
要點:容器 = 鏡像 + 讀寫層睦刃。
然而, 容器的運行態(tài)又衍生了不同的概念。
Running Container Definition
一個運行態(tài)容器(running container)被定義為一個可讀寫的統(tǒng)一文件系統(tǒng)加上隔離的進程空間和包含其中的進程十酣。下面這張圖片展示了一個運行中的容器涩拙。
正是文件系統(tǒng)隔離技術(shù)使得Docker成為了一個前途無量的技術(shù)。一個容器中的進程(Process)可能會對文件進行修改耸采、刪除兴泥、創(chuàng)建,這些改變都將作用于可讀寫層(read-write layer),對實際主機的文件系統(tǒng)產(chǎn)生影響虾宇。
全局理解(Tying It All Together)
現(xiàn)在搓彻,讓我們結(jié)合上面提到的實現(xiàn)細節(jié)來理解Docker的命令:
docker create <image-id>
docker create 命令為指定的鏡像(image)添加了一個可讀寫層,構(gòu)成了一個新的容器嘱朽。注意旭贬,這個容器并沒有運行。
docker start <container-id>
Docker start命令為容器文件系統(tǒng)創(chuàng)建了一個進程隔離空間搪泳。注意稀轨,每一個容器只能夠有一個進程隔離空間。
docker run <image-id>
docker run就是docker create和docker start兩個命令的組合岸军。
docker ps
docker ps 命令會列出所有運行中的容器奋刽。這隱藏了非運行態(tài)容器的存在,如果想要找出這些容器艰赞,我們需要使用下面這個命令佣谐。
docker ps –a
docker ps 命令會列出所有容器,無關狀態(tài)。
docker images
docker images命令會列出了所有頂層(top-level)鏡像方妖。實際上台谍,在這里我們沒有辦法區(qū)分一個鏡像和一個只讀層,所以我們提出了top-level鏡像吁断。只有創(chuàng)建容器時使用的鏡像或者是直接pull下來的鏡像能被稱為頂層(top-level)鏡像趁蕊,并且每一個頂層鏡像下面都隱藏了多個鏡像層。
docker images –a
docker images命令會列出了所有層次的鏡像
docker stop <container-id>
暫停運行中的容器
docker rm <container-id>
docker rm命令會移除構(gòu)成容器的可讀寫層仔役。注意掷伙,這個命令只能對非運行態(tài)容器執(zhí)行。
docker save <image-id>
docker save命令會創(chuàng)建一個鏡像的壓縮文件又兵,這個文件能夠在另外一個主機的Docker上使用任柜。和export命令不同卒废,這個命令為每一個層都保存了它們的元數(shù)據(jù)。這個命令只能對鏡像生效宙地。
docker tag <image-id> [image name]:[new tag]
為鏡像指定新的標簽
docker鏡像初級共享
docker save <image-id>
命令會在當前目錄下生成導出文件xxx.tar摔认,然后將此文件下載到本地。
docker load [OPTIONS]
從tar歸檔文件讀取鏡像
共享命令的區(qū)別:
docker save images_name:將一個鏡像導出為文件宅粥,再使用docker load命令將文件導入為一個鏡像参袱,會保存該鏡像的的所有歷史記錄。比docker export命令導出的文件大秽梅,很好理解抹蚀,因為會保存鏡像的所有歷史記錄。
docker export container_id:將一個容器導出為文件企垦,再使用docker import命令將容器導入成為一個新的鏡像环壤,但是相比docker save命令,容器文件會丟失所有元數(shù)據(jù)和歷史記錄钞诡,僅保存容器當時的狀態(tài)郑现,相當于虛擬機快照
想要實現(xiàn)更高級的共享策略則需要引入倉庫的概念, 參考我另一篇文章: 參考