前言第一趴---Docker容器圈簡(jiǎn)介第二趴---Docker基本操作容器圈容器這個(gè)新生事物,現(xiàn)在還可以說(shuō)是新生事物嗎?對(duì)于我們學(xué)生而言,我覺(jué)得沒(méi)毛病,你說(shuō)呢? 容器技術(shù)可說(shuō)重塑了整個(gè)云計(jì)算市場(chǎng)的形態(tài),帶動(dòng)了一批年輕有為的容器技術(shù)兒,不過(guò)「容器」這個(gè)概念是 Docker 公司發(fā)明的么,不是,它只是眾多 Pass 項(xiàng)目中的最底層,沒(méi)人關(guān)注的那一部分而已。
Pass 項(xiàng)目之所會(huì)被很多公司所接受,自然是因?yàn)榻夥帕瞬糠珠_(kāi)發(fā)人員的勞動(dòng)力,盡快干玩活兒早點(diǎn)下班。其依賴的就是「應(yīng)用托管」的能力,在電腦上斗過(guò)地主的應(yīng)該知道,托管了以后就會(huì)自動(dòng)出牌,同樣的道理,為了盡量的彌補(bǔ)本地和云上的環(huán)境差異,就出現(xiàn)了 Pass 開(kāi)源項(xiàng)目。 舉個(gè)例子來(lái)說(shuō),運(yùn)維人員小仙云上部署一個(gè) Cloud Foundry 項(xiàng)目,開(kāi)發(fā)人員只需要簡(jiǎn)單的一行代碼就可以實(shí)現(xiàn)將本地的應(yīng)用部署到云上 就這樣一行代碼就實(shí)現(xiàn)了將本地應(yīng)用上傳到云上,屬實(shí)很輕松。
實(shí)際上,我們可以將其最核心的組件理解為一套應(yīng)用的打包和分發(fā)機(jī)制。云上部署的 Cloud Foundry 會(huì)為大部分編程語(yǔ)言定義一種打包的格式,當(dāng)開(kāi)發(fā)人員執(zhí)行命令的時(shí)候,實(shí)際上是將可執(zhí)行文件和啟動(dòng)腳本打包上傳到云上的Coulud Foudry 中,然后 Cloud Foundry 通過(guò)相應(yīng)的調(diào)度器選擇一個(gè)虛擬機(jī)的 Agent 將壓縮包下載后啟動(dòng)
虛擬機(jī)一般不可能只跑一個(gè)應(yīng)用,因?yàn)檫@樣確實(shí)也太浪費(fèi)資源了,我們可以想想,現(xiàn)在手上的電腦,可以用 Vmvare 導(dǎo)入幾個(gè)虛擬機(jī),所以諸如 Cloud Foundry 通過(guò)引入操作系統(tǒng)的 Cgroups 和 Namespace 等機(jī)制,從而來(lái)為每個(gè)應(yīng)用單獨(dú)創(chuàng)建一個(gè)叫做「沙盒」的隔離環(huán)境,然后在這些「沙盒」中啟動(dòng)應(yīng)用,通過(guò)這樣的方法就讓虛擬機(jī)中應(yīng)用各自互不干擾,讓其自由翱翔,至于 Cgroups 和 **Namespace **的實(shí)現(xiàn)原理,后續(xù)我們?cè)俟餐奶接?/p> 這里所謂的隔離環(huán)境就是「容器」。
自然不一樣,不然現(xiàn)在我們一旦提到容器,想到的不會(huì)是 Docker,而是 Cloud Foundry 了吧。Cloud Foundry 的首席產(chǎn)品經(jīng)理就覺(jué)得沒(méi)什么,畢竟自己放的屁都是香的! 不一樣,而且當(dāng)時(shí)還發(fā)了一份報(bào)告,報(bào)告中還寫到:“ Docker 不就是使用了 Cgroups 和 Namespace 實(shí)現(xiàn)的「沙盒」而已,不用過(guò)于關(guān)注”。 沒(méi)想到的是,隨后短短的幾個(gè)月,Docker 項(xiàng)目迅速起飛以至于其他所有 Paas 社區(qū)都還沒(méi)來(lái)及反應(yīng)過(guò)來(lái),就已經(jīng)宣告出局
就是提出了鏡像的概念。上面我們說(shuō)過(guò),Paas 提供的一套應(yīng)用打包的功能,看起很輕松省事,但是一旦使用了Paas,你就要終身服務(wù)于它,畢竟他是提供商,是「爸爸」,用戶需要為每個(gè)版本,每種語(yǔ)言去維護(hù)一個(gè)包,這個(gè)打包的過(guò)程是需要多次的嘗試,多次試錯(cuò)后,才能摸清本地應(yīng)用和遠(yuǎn)端 Paas 的脾氣,從而順利部署。 而 Docker 鏡像恰恰就是解決了打包這一根本問(wèn)題。
Docker 鏡像也是一個(gè)壓縮包,只是這個(gè)壓縮包不只是可執(zhí)行文件,環(huán)境部署腳本,它還包含了完整的操作系統(tǒng)。因?yàn)榇蟛糠值溺R像都是基于某個(gè)操作系統(tǒng)來(lái)構(gòu)建,所以很輕松的就可以構(gòu)建本地和遠(yuǎn)端一樣的環(huán)境。 這就很牛皮了,如果我們的應(yīng)用是在 Centos7 上部署,我們只需要將項(xiàng)目環(huán)境部署在基于 Centos7 的環(huán)境中,然后無(wú)論在哪里去解壓這個(gè)壓縮包,都可以保證環(huán)境的一致性。在整個(gè)過(guò)程中,我們根本不需要進(jìn)行任何的配置,因?yàn)檫@個(gè)壓縮包可以保證:本地的環(huán)境和云端是一致的,這也是 Docker 鏡像的精髓 開(kāi)發(fā)者體驗(yàn)到了 Docker 的便利,從而很快宣布 Paas 時(shí)代的結(jié)束,不過(guò)對(duì)于大規(guī)模應(yīng)用的部署,Docker 能否實(shí)現(xiàn)在當(dāng)時(shí)還是個(gè)問(wèn)號(hào) 就在 2014 年的 DockerCon 上,緊接著發(fā)布了自研的「Docker swarm」,Docker 就這樣 一度奔向高潮,即將就到達(dá)了自己夢(mèng)想之巔。
雖然 Docker 通過(guò)「容器」完成了對(duì) Paas 的「降維打擊」,但是 Docker 的目的是:如何讓更多的開(kāi)發(fā)者將項(xiàng)目部署在自己的項(xiàng)目上,從技術(shù),商業(yè),市場(chǎng)多方位的爭(zhēng)取開(kāi)發(fā)者的群體,為此形成自家的 Paas 平臺(tái)做鋪墊 Docker 項(xiàng)目雖然很受歡迎,就目前看來(lái)只是一個(gè)創(chuàng)建和啟動(dòng)容器的小工具。需要應(yīng)該清楚的一點(diǎn)是,用戶最終部署的還是他們的網(wǎng)站,服務(wù)甚至云計(jì)算業(yè)務(wù)。所以推出一個(gè)完整的整體對(duì)外提供集群管理功能的 Swarm 勢(shì)在必行,這個(gè)項(xiàng)目中的最大亮點(diǎn)即直接使用了 Docker 原生的 API 來(lái)完成對(duì)集群的管理。 對(duì)于單機(jī)項(xiàng)目,只需要執(zhí)行下面一條語(yǔ)句即可實(shí)現(xiàn)容器 對(duì)于多機(jī)的項(xiàng)目,只需要執(zhí)行 你看,從單機(jī)切換到多機(jī),使用的方法也就參數(shù)不同而已,所以這樣一個(gè)原生的「Docker容器集群管理」一發(fā)布就受到大家的青睞。隨著自身生態(tài)的逐漸完善,借助這一波浪潮并通過(guò)各種并購(gòu)來(lái)強(qiáng)大自己的平層能力 要說(shuō)最成功的案例,非 Fig 項(xiàng)目莫屬。之所以這么屌,是因?yàn)樽髡咛岢隽恕?strong>容器編排」的概念。
其實(shí)這也不是什么新鮮內(nèi)容,比如在 Linux 中的 Makefile和常見(jiàn)的 SHELL 腳本,它是一種通過(guò)工具或者配置來(lái)完成一組虛擬機(jī)或者關(guān)聯(lián)資源的定義、配置、創(chuàng)建等工具。
我們先以 Fig 為例,假設(shè)開(kāi)發(fā)人員小黑,現(xiàn)在要部署一個(gè)項(xiàng)目,其中包含了應(yīng)用容器 A,數(shù)據(jù)庫(kù)容器 B,負(fù)載容器 C,這個(gè)時(shí)候 Fig 只需要將三個(gè)容器定義在一個(gè)配置文件,然后指定他們的關(guān)聯(lián)關(guān)系,執(zhí)行下面的命令即可 當(dāng)然也可以在 Fig 的配置文件中配置各種容器的副本,然后加上 Swarm 的集群管理功能,這樣不就是 Paas 了么。只是這個(gè)項(xiàng)目被收購(gòu)以后,修改名字為 compose 了,后續(xù)也會(huì)的 compose 進(jìn)行詳細(xì)的闡述 就這樣一個(gè)以「鯨魚」為商標(biāo)的 Docker,火遍全球,因?yàn)樗謱ⅰ?strong>開(kāi)發(fā)者」群體放在食物鏈的頂端。一分鐘實(shí)現(xiàn)網(wǎng)站的部署,三分鐘搭建集群,這么多年以來(lái),很多后端開(kāi)發(fā)者很少將眼光放在 Linux 技術(shù)上,開(kāi)發(fā)者們?yōu)榱松钊氲牧私?Docker 的技術(shù)原理,終于將眼光放入諸如 Cgroups 和 Namespace 技術(shù)中。 就在這一時(shí)之間,后端及云計(jì)算領(lǐng)域的大佬都匯聚于這個(gè)「小鯨魚」的身邊。隨后到了考慮集群的方案,論集群的管理調(diào)度能力,還不得不提 Berkeley 的 Mesos,專注于大數(shù)據(jù)領(lǐng)域,更加關(guān)注的是計(jì)算密集型的業(yè)務(wù)。憑借著它天生的兩層調(diào)度機(jī)制,讓它很快發(fā)布了一個(gè)叫做 Marathon 的項(xiàng)目,這個(gè)項(xiàng)目隨即成為了 Swarm 的有力競(jìng)爭(zhēng)對(duì)手。 這還沒(méi)完,說(shuō)了這么久,還沒(méi)有提到在基礎(chǔ)設(shè)施領(lǐng)域翹楚的 Google 公司,是的,同在這一年,宣告了一個(gè)叫做 Kubernetes 項(xiàng)目的誕生。 隨著 Docker 生態(tài)的建立,Docker swarm,Docker compose,Machine 形成了三件套,此時(shí)大量圍繞Docker 項(xiàng)目的網(wǎng)絡(luò),存儲(chǔ),監(jiān)控都涌現(xiàn)。在令人興奮的背后,是對(duì)它更多的擔(dān)憂,這主要來(lái)源于對(duì) Docker 商業(yè)化戰(zhàn)略的顧慮,Docker 公司對(duì)于 Docker 著絕對(duì)的權(quán)威并在多個(gè)場(chǎng)合直接和谷歌,微軟對(duì)干 其實(shí)在 Docker 興起的時(shí)候,谷歌也開(kāi)源了一個(gè) Linux 容器:Imctfy,在當(dāng)時(shí)這個(gè)項(xiàng)目在 Docker 面前真是弟弟,所以向 Docker 公司表示想合作的意愿,Docker 顯然不同意,且在之后的不久自己發(fā)布了一個(gè)容器運(yùn)行時(shí)的庫(kù) Libcontainer,可能由于太急躁,其代碼可讀性極差,不穩(wěn)定和頻繁的變更,讓社區(qū)叫苦不迭 為了切割 Docker 項(xiàng)目的話語(yǔ)權(quán),決定成立一個(gè)中立的基金會(huì)。所以于 2015 年將這個(gè) Libcontainer 捐出,并修改名稱為 Runc,然后依據(jù) RunC 項(xiàng)目,制定了一套容器和鏡像的標(biāo)準(zhǔn)和規(guī)范----OCI
為了讓 Docker 不能太囂張,其他玩家構(gòu)建自身平臺(tái)的時(shí)候不依賴于 Docker 項(xiàng)目,提出一個(gè)標(biāo)準(zhǔn)和規(guī)范----OCI。這一標(biāo)準(zhǔn)并沒(méi)有改變 Docker 在容器領(lǐng)域一家獨(dú)大的現(xiàn)狀。Google 坐不住了,必須得搞點(diǎn)大招 **Google **給 RedHat 等伙伴打了電話,說(shuō)咱們共同牽頭發(fā)起一個(gè)基金會(huì)-----CNCF。目的很簡(jiǎn)單,以 kubernetes 為基礎(chǔ),建立一個(gè)以由開(kāi)源基礎(chǔ)設(shè)置主導(dǎo),按照獨(dú)立基金會(huì)方式運(yùn)營(yíng)的平臺(tái)級(jí)社區(qū),來(lái)對(duì)抗 Docker 公司為核心的容器商業(yè)生態(tài) 為了做好這個(gè)事兒,CNCF 必須完成兩件事兒
Swarm 的無(wú)縫集成以及 Mesos 的大規(guī)模集群的調(diào)度管理能力,很明顯,如果繼續(xù)往這兩個(gè)方向發(fā)展,后面的路不一定好走。所以,kubernetes 選擇的方式是 Borg,其基礎(chǔ)特性是 Google 在容器化基礎(chǔ)設(shè)施多年來(lái)實(shí)踐的經(jīng)驗(yàn),這也正是項(xiàng)目從一開(kāi)始就避免了和 Swarm ,mesos 社區(qū)同質(zhì)化的重要手段
RedHat 正好擅長(zhǎng)這玩意呀,它能真正的理解開(kāi)源社區(qū)運(yùn)作和項(xiàng)目研發(fā)真諦的合作伙伴。作為 Docker 一方,主要不管的強(qiáng)調(diào)「Docker native」,但是由于 kubernetes 沒(méi)有跟 Swarm 展開(kāi)同質(zhì)化的競(jìng)爭(zhēng),所以這個(gè)「Docker Native」的說(shuō)法并沒(méi)有什么殺傷力。反而其獨(dú)特的設(shè)計(jì)理念和號(hào)召力,讓其構(gòu)建了一個(gè)完全與眾不同的容器編排管理生態(tài)。 就這樣很快就把 Swarm 甩在了身后。隨機(jī)開(kāi)始探討第二個(gè)問(wèn)題,CNCF 添加了一系列容器工具和項(xiàng)目,面對(duì)這樣的壓迫,Docker 在2016年決定放棄現(xiàn)有的 Swarm項(xiàng)目,而是將容器編排等全部?jī)?nèi)置到 Docker 項(xiàng)目中。 而 kubunetes 的應(yīng)對(duì)方案也蠻有意思,開(kāi)啟「民主化架構(gòu)」,kubernetes 為開(kāi)發(fā)者暴露可以擴(kuò)展的插件機(jī)制,讓用戶可以隨意的通過(guò)植入代碼的方式介入到 kubernetes 的每一個(gè)階段,很快,整個(gè)容器圈出現(xiàn)了優(yōu)秀的作品:火熱的微服務(wù)治理項(xiàng)目 lstio 等 面對(duì) kubernetes 的 強(qiáng)力攻擊,Docker 公司不得不面對(duì)失敗的事實(shí),只好放棄開(kāi)源社區(qū)專注于商業(yè)化轉(zhuǎn)型,所以于2017年將容器運(yùn)行時(shí)部分 containerd 捐贈(zèng)給了 CNCF,從而將 Docker 項(xiàng)目改名為 Moby,然后交給社區(qū)維護(hù),于 2017 年,**Docker **公司宣布將在企業(yè)版內(nèi)置 kubernetes 項(xiàng)目,這也標(biāo)志了 kubernetes「編排之爭(zhēng)」的結(jié)束 Docker能做什么Docker 是一個(gè)用于開(kāi)發(fā),發(fā)布,運(yùn)行應(yīng)用的程序于一體的開(kāi)放平臺(tái)。如果我們需要將貨物整齊的擺放在船上且互不影響,那么一種可行的方案即通過(guò)集裝箱進(jìn)行標(biāo)準(zhǔn)化,我們將各種貨品通過(guò)集裝箱打包,然后統(tǒng)一的放在船上進(jìn)行運(yùn)輸,Docker其實(shí)就是這樣一個(gè)將各種軟件進(jìn)行打包成集裝箱,然后分發(fā)。 Docker的安裝Docker 是一個(gè)跨平臺(tái)的解決方案,支持各大平臺(tái)比如 Centos,Ubuntu等 Linux 發(fā)行版。下面講述的是在Centos 中的使用,安裝
運(yùn)行上述命令,Docker 首先會(huì)檢查本地是否有 hello-world 這個(gè)鏡像,如果發(fā)現(xiàn)本地沒(méi)有這個(gè)鏡像,Docker 就會(huì)去 Docker Hub 官方倉(cāng)庫(kù)下載此鏡像,然后運(yùn)行它。最后我們看到該鏡像輸出 'Hello from Docker!' 并退出。 Docker核心概念Docker 的操作主要圍繞鏡像,容器,倉(cāng)庫(kù)三大核心概念
一句話說(shuō)即鏡像是 Docker 容器啟動(dòng)的先決條件,因?yàn)殓R像會(huì)提供容器運(yùn)行的一些基礎(chǔ)文件和配置文件,是容器啟動(dòng)的基礎(chǔ)。說(shuō)白了,要啟動(dòng)容器,需要鏡像來(lái)提供一些基礎(chǔ)環(huán)境。
容器是鏡像的運(yùn)行實(shí)體。鏡像是靜態(tài)的只讀文件,可是容器是要運(yùn)行的,需要可寫文件層。所以容器運(yùn)行著真正的應(yīng)用進(jìn)程,所以自然會(huì)有創(chuàng)建,運(yùn)行,停止,暫停和刪除五種狀態(tài) 既然容器是直接運(yùn)行的運(yùn)行程序,那它是有自己的命名空間嘛? 容器有自己獨(dú)立的命名空間和資源限制,意味著在容器內(nèi)部,你無(wú)法看到主機(jī)上面的進(jìn)程,環(huán)境變量等信息,這就是容器和物理機(jī)上的進(jìn)程本質(zhì)區(qū)別
鏡像倉(cāng)庫(kù)類似于代碼倉(cāng)庫(kù),用來(lái)分發(fā)和存儲(chǔ)鏡像,分為公共鏡像和私有鏡像。Docker hub 是 Docker 的官方公開(kāi)鏡像倉(cāng)庫(kù),很多的官方鏡像都可以在上面找到,但是訪問(wèn)很慢,所以可以找國(guó)內(nèi)的鏡像源,當(dāng)然后面我們也會(huì)自己搭建一個(gè)私有鏡像倉(cāng)庫(kù)
上圖清晰的展現(xiàn)了鏡像是容器的基石,容器是在鏡像的基礎(chǔ)上創(chuàng)建的。一個(gè)鏡像可以創(chuàng)建多個(gè)容器,倉(cāng)庫(kù)用來(lái)存放和分發(fā)鏡像 Docker架構(gòu)容器技術(shù)的發(fā)展可說(shuō)突飛猛進(jìn)了,市面上除了 Docker 容器還有 coreos 的 rkt,lxc 等,這么多種容器,是不是需要一個(gè)標(biāo)準(zhǔn)呢,不然就太容易亂套了 你可能會(huì)說(shuō)直接把 Docker 作為標(biāo)準(zhǔn)不就好了,但是有這么多相關(guān)的容器技術(shù),誰(shuí)不想吃個(gè)好瓜,除此之外,當(dāng)時(shí)的編排的技術(shù)也競(jìng)爭(zhēng)火爆,當(dāng)時(shí)的三主力分別是 Docker Swarm,kubernetes 以及 mesos。作為原生的 Docker Swarm 自然優(yōu)勢(shì)明顯,但是 kubernetes 不同意啊,它們覺(jué)得調(diào)度形式太單一了 因此爆發(fā)了容器大戰(zhàn),OCI 也就在此出現(xiàn)。 OCI 是開(kāi)放的容器標(biāo)準(zhǔn),輕量級(jí)開(kāi)放的治理結(jié)構(gòu),目前主要有兩個(gè)標(biāo)準(zhǔn),分別是容器運(yùn)行時(shí)標(biāo)準(zhǔn)和容器鏡像標(biāo)準(zhǔn) 在如此競(jìng)爭(zhēng)激烈下面,Docker 的架構(gòu)成為了下面這個(gè)樣子 Docker 的整體架構(gòu)為 CS 架構(gòu),客戶端和服務(wù)端兩部分組成,客戶端發(fā)送命令,服務(wù)端接受處理指令,其通信的方式有多種,即可以通過(guò) Unix 套接字通信,也可以網(wǎng)絡(luò)鏈接遠(yuǎn)程通信 Docker客戶端 我們平時(shí)通常使用 Docker 命令行的方式和服務(wù)端打交道,其實(shí)還可以通過(guò) **REST API **的方式和 Docker 服務(wù)端交互,甚至使用各種預(yù)言的 sdk 和 Docker 的服務(wù)端交互,美滋滋 Docker服務(wù)端 Docker 服務(wù)端是 Docker 后臺(tái)服務(wù)的總稱。其中 Dockerd 是一個(gè)非常重要的后臺(tái)進(jìn)程,它負(fù)責(zé)響應(yīng)并處理Docker 客戶端的請(qǐng)求,然后轉(zhuǎn)化為 Docker 的具體操作 Docker 重要的組件 我們?nèi)?Docker 默認(rèn)安裝路徑先看看有哪些組件 這里主要說(shuō)明下 runc 和 contained 組件
通過(guò)上圖,可以看到,dockerd 通過(guò) gRPC 與 containerd 通信,由于 dockerd 與真正的容器運(yùn)行時(shí),runC 中間有了 containerd 這一 OCI 標(biāo)準(zhǔn)層,使得 dockerd 可以確保接口向下兼容。 gRPC 是一種遠(yuǎn)程服務(wù)調(diào)用。containerd-shim 的意思是墊片,類似于擰螺絲時(shí)夾在螺絲和螺母之間的墊片。containerd-shim 的主要作用是將 containerd 和真正的容器進(jìn)程解耦,使用 containerd-shim 作為容器進(jìn)程的父進(jìn)程,從而實(shí)現(xiàn)重啟 dockerd 不影響已經(jīng)啟動(dòng)的容器進(jìn)程。
此時(shí)發(fā)現(xiàn)其 pid 為 4428,隨后我們查看進(jìn)程之間的關(guān)系
注意,docker19 就看不到兩者是父子關(guān)系了 可以先使用 ps aux | grep contained ,然后使用 pstree 查看 contained 的 pid ,實(shí)際上,Docker 啟動(dòng)的時(shí)候,contained 就啟動(dòng)了,dockerd 和 contained 一直就存在。當(dāng)執(zhí)行了docker run以后,contained 就會(huì)創(chuàng)建 contained-shim 充當(dāng)墊片進(jìn)程,然后啟動(dòng)容器的真正進(jìn)程 sleep 3600,這和架構(gòu)圖一致 075528566666 Docker相關(guān)組件
對(duì)于我們最直觀的即 Docker 命令,作為 Docker 客戶端的完整實(shí)現(xiàn),通過(guò) Docker 命令來(lái)實(shí)現(xiàn)所有的 Docker 客戶與服務(wù)端的通信
Docker 組件向服務(wù)端發(fā)送請(qǐng)求后,服務(wù)端根據(jù)請(qǐng)求執(zhí)行具體的動(dòng)作并將結(jié)果返回給 Docker,Docker 解析服務(wù)端的返回結(jié)果,并將結(jié)果通過(guò)命令行標(biāo)準(zhǔn)輸出展示給用戶。這樣一次完整的客戶端服務(wù)端請(qǐng)求就完成了
dockerd 為 Docker 服務(wù)端后臺(tái)的常駐進(jìn)程,負(fù)責(zé)接收客戶端的請(qǐng)求,處理具體的任務(wù)并將結(jié)果返回客戶端
第一種方式:通過(guò) unix 套接字與服務(wù)端通信,配置的格式為: 第二種方式:采用 TCP 的方式與服務(wù)端通信,配置格式為: 第三種方式:通過(guò) fd 文件描述符的方式,配置格式為:fd://這種格式一般用于 systemd 管理的系統(tǒng)中。
在 Linux 中,有一個(gè)叫做 init 的進(jìn)程,是所有進(jìn)程的父進(jìn)程,用來(lái)回收那些沒(méi)有回收的進(jìn)程,同樣的道理,在容器內(nèi)部,可以通過(guò)加上參數(shù)
此時(shí)的 1 號(hào)進(jìn)程為為 sh 進(jìn)程,如果加上 --init 你會(huì)發(fā)現(xiàn),此時(shí)的 1 號(hào)進(jìn)程為 docker-init,而不是 sh 了
docker-proxy 用來(lái)將容器啟動(dòng)的端口映射到主機(jī),方便主機(jī)的訪問(wèn)。 假設(shè)目前啟動(dòng)一個(gè) nginx 容器并將容器的 80 端口映射到主機(jī)的 8080 端口 查看容器 IP 此時(shí)使用 ps 查看主機(jī)是否有 docker-proxy 進(jìn)程 可以發(fā)現(xiàn)當(dāng)進(jìn)行端口映射的時(shí)候,docker 為我們創(chuàng)建了一個(gè) docker-proxy 進(jìn)程,并且通過(guò)參數(shù)將容器的 IP 和端口傳遞給 docker-proxy,然后 proxy 通過(guò) iptables 完成 nat 的轉(zhuǎn)發(fā) 從最后一句可以看出,當(dāng)我們主機(jī)訪問(wèn) 8080 端口的時(shí)候,iptable 將流量會(huì)轉(zhuǎn)發(fā)給 使用 curl 訪問(wèn)一下 nginx 容器 contained組件
contained主要負(fù)責(zé)容器的生命周期管理,同時(shí)還會(huì)負(fù)責(zé)一些其他的功能
鏡像的管理 接收dockerd的請(qǐng)求 管理存儲(chǔ)相關(guān)資源 管理網(wǎng)絡(luò)資源
Docker鏡像使用來(lái),繼續(xù),我們看看鏡像是什么。鏡像是一個(gè)只讀的鏡像模版且包含了啟動(dòng)容器所需要的文件結(jié)構(gòu)內(nèi)容。鏡像不包含動(dòng)態(tài)數(shù)據(jù),構(gòu)建完成將不會(huì)改變
對(duì)于鏡像的操作分為:
拉取鏡像直接使用 docker pull 命令即可,命令的格式如下
現(xiàn)在舉個(gè)例子,這里有個(gè)鏡像叫做 busybox,這個(gè)鏡像集成了上百個(gè)常用的 Linux 命令,可以通過(guò)這個(gè)鏡像方便快捷的查找生產(chǎn)環(huán)境中的問(wèn)題,下面我們一起操作一波
首先會(huì)在本地鏡像庫(kù)查找,如果不存在本地庫(kù)則直接去官網(wǎng)拉取鏡像。拉取完鏡像后隨即查看鏡像
如果要查看指定的鏡像,則使用docker image ls命令進(jìn)一步查詢
我們仔細(xì)觀察這兩個(gè)鏡像,就會(huì)發(fā)現(xiàn)這兩個(gè)鏡像的 IMAGE ID其實(shí)是一樣的,這是什么原因呢 實(shí)際上他們都是指向的同一個(gè)鏡像文件,只不過(guò)其別名不一樣而已,如果此時(shí)不想要mybox鏡像,想刪除這個(gè)鏡像
此時(shí)再次使用 docker images 查看確實(shí)刪除了
之前說(shuō)過(guò),有兩種方式,一種是通過(guò) docker commit 的方式,一種是 docker build 的方式。首先看看使用容器提交鏡像的方式 此時(shí)啟動(dòng)了一個(gè)busybox容器并進(jìn)入到容器,并在容器中創(chuàng)建一個(gè)文件,并寫入內(nèi)容 此時(shí)就在當(dāng)前目錄下創(chuàng)建了一個(gè)hello.txt文件并寫入了內(nèi)容?,F(xiàn)在新建另外一個(gè)窗口,然后提交為一個(gè)鏡像 然后使用 docker image ls 查看發(fā)現(xiàn)確實(shí)生成了鏡像 然后我們?cè)倏纯词褂?dockerfile 的方式
先看看都有哪些命令 這么多,不存在的,我們先看一個(gè)dockerfile就知道如何用了
為了清楚的看見(jiàn)鏡像的存儲(chǔ)結(jié)構(gòu),通過(guò) 因?yàn)槲业? 可以清楚的看到, Docker容器操作我們通過(guò)一個(gè)鏡像可以輕松的創(chuàng)建一個(gè)容器,一個(gè)鏡像可以有多個(gè)容器,在運(yùn)行容器的時(shí)候,實(shí)際上是在容器內(nèi)部創(chuàng)建了這個(gè)文件系統(tǒng)的讀寫副本,如下圖所示
容器的生命周期一共有五個(gè)狀態(tài)分別為
通過(guò) docker cretate 進(jìn)入容器的初建狀態(tài),然后通過(guò) docker start 進(jìn)入運(yùn)行狀態(tài),通過(guò) docker stop 進(jìn)入停止?fàn)顟B(tài),運(yùn)行狀態(tài)的容器可以通過(guò) docker pause 讓其變?yōu)闀和顟B(tài),為了詳細(xì)的查看這些過(guò)程,我們實(shí)操一下
通過(guò) docker create 創(chuàng)建的容器處于停止的狀態(tài),使用 docker start busybox 進(jìn)入啟動(dòng)狀態(tài) 當(dāng)使用 docker run 創(chuàng)建并啟動(dòng)容器的時(shí)候,docker 后臺(tái)的執(zhí)行邏輯為
同時(shí)使用 通過(guò) docker stop 停止容器,其原理是給運(yùn)行中的容器給
想要進(jìn)入容器,有三種方案,分別是
通過(guò) 可是當(dāng)我們?cè)谶M(jìn)行窗口進(jìn)行 docker attach 的時(shí)候,這個(gè)命令就不好用了,所以使用 docker exec 的方式
奇怪的發(fā)現(xiàn)居然是兩個(gè)
現(xiàn)在基本上知道了如何創(chuàng)建,啟動(dòng)容器,那么怎么刪除容器呢
如果此時(shí),容器正在運(yùn)行,那么需要添加
這簡(jiǎn)單,不過(guò)在導(dǎo)出之前先進(jìn)入容器創(chuàng)建一個(gè)文件 然后導(dǎo)出為文件 此時(shí)會(huì)在當(dāng)前目錄生成一個(gè)
通過(guò) 此時(shí)容器名稱為 此時(shí)發(fā)現(xiàn)之前在 倉(cāng)庫(kù)容器的基本操作應(yīng)該都會(huì)了,那么我們應(yīng)該如何去存儲(chǔ)和分發(fā)這些鏡像,這就需要介紹下倉(cāng)庫(kù); 我們可以使用共有鏡像倉(cāng)庫(kù)分發(fā),也可以搭建私有的倉(cāng)庫(kù)
錢錢倉(cāng)庫(kù)放錢,這個(gè)倉(cāng)庫(kù)放鏡像。 在學(xué)習(xí)的過(guò)程中,不太能區(qū)分注冊(cè)服務(wù)器和倉(cāng)庫(kù)的關(guān)系。注冊(cè)服務(wù)器其實(shí)是用來(lái)存放倉(cāng)庫(kù)的實(shí)際機(jī)器,而倉(cāng)庫(kù)我們可以將其理解為具體的項(xiàng)目或者目錄。一個(gè)注冊(cè)服務(wù)器可以存放多個(gè)倉(cāng)庫(kù),每個(gè)倉(cāng)庫(kù)可以存放多個(gè)鏡像
Docker hub 是當(dāng)前全球最大的鏡像市場(chǎng),差不多超過(guò) 10w 個(gè)容器鏡像,大部分操作系統(tǒng)鏡像都來(lái)自于此。
此時(shí)假設(shè)我的賬戶是 xiaolantest,創(chuàng)建一個(gè) busybox 的倉(cāng)庫(kù),隨后將鏡像推送到倉(cāng)庫(kù)中。 第一步:拉取 busybox 鏡像 第二步:推送鏡像之前先登錄鏡像服務(wù)器(注意用戶名密碼哦),出現(xiàn) login Succeeded表示登錄成功 第三步:推送之前還要做一件事,重新對(duì)鏡像命名,這樣測(cè)能正確的推動(dòng)到自己創(chuàng)建的倉(cāng)庫(kù)中 第四步:docker push 到倉(cāng)庫(kù)中
Docker 官方提供了開(kāi)源的鏡像倉(cāng)庫(kù) Distribution,鏡像存放于 Docker hub 的 Registry中
此時(shí) Docker 為
此時(shí),我們驗(yàn)證一下從本地鏡像倉(cāng)庫(kù)拉取鏡像。首先,我們刪除本地的
可以看到此時(shí)本地已經(jīng)沒(méi)有 隨后再使用
|
|