1 Docker
1.1 簡介
Docker
最初是 dotCloud
公司創(chuàng)始人 Solomon Hykes 在法國期間發(fā)起的一個(gè)公司內(nèi)部項(xiàng)目淫茵,于 2013 年 3 月以 Apache 2.0
授權(quán)協(xié)議開源爪瓜,主要項(xiàng)目代碼在 GitHub
上進(jìn)行維護(hù)。Docker 使用 Google 公司推出的 Go 語言 進(jìn)行開發(fā)實(shí)現(xiàn)匙瘪。docker
是linux容器的一種封裝铆铆,提供簡單易用的容器使用接口。它是最流行的Linux容器
解決方案丹喻。
docker
的接口相當(dāng)簡單薄货,用戶可以方便的創(chuàng)建、銷毀容器碍论。docker
將應(yīng)用程序與程序的依賴谅猾,打包在一個(gè)文件里面。運(yùn)行這個(gè)文件就會(huì)生成一個(gè)虛擬容器鳍悠。程序運(yùn)行在虛擬容器里税娜,如同在真實(shí)物理機(jī)上運(yùn)行一樣,有了docker藏研,就不用擔(dān)心環(huán)境問題了
1.2 Docker架構(gòu)
Docker
包括三個(gè)基本概念:
- 鏡像(
Image
):Docker
鏡像(Image
)敬矩,就相當(dāng)于是一個(gè)root
文件系統(tǒng)。比如官方鏡像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系統(tǒng)的 root 文件系統(tǒng)蠢挡。- 通過鏡像啟動(dòng)一個(gè)容器弧岳,一個(gè)鏡像是一個(gè)可執(zhí)行的包,其中包括運(yùn)行應(yīng)用程序所需要的所有內(nèi)容包含代碼业踏,運(yùn)行時(shí)間禽炬,庫、環(huán)境變量勤家、和配置文件腹尖。
-
Docker
鏡像也是一個(gè)壓縮包,只是這個(gè)壓縮包不只是可執(zhí)行文件伐脖,環(huán)境部署腳本桐臊,它還包含了完整的操作系統(tǒng)。因?yàn)榇蟛糠值溺R像都是基于某個(gè)操作系統(tǒng)來構(gòu)建晓殊,所以很輕松的就可以構(gòu)建本地和遠(yuǎn)端一樣的環(huán)境断凶,這也是Docker
鏡像的精髓。
- 容器(
Container
):鏡像(Image
)和容器(Container
)的關(guān)系巫俺,就像是面向?qū)ο蟪绦蛟O(shè)計(jì)中的類
和實(shí)例
一樣认烁,鏡像是靜態(tài)的定義,容器是鏡像運(yùn)行時(shí)的實(shí)體介汹。容器可以被創(chuàng)建
却嗡、啟動(dòng)
、停止
嘹承、刪除
窗价、暫停
等。
所創(chuàng)建的每一個(gè)容器都是相互隔離
叹卷、互不可見
撼港,以保證平臺(tái)的安全性坪它。可以把容器看做是一個(gè)簡易版的linux
環(huán)境(包括root用戶權(quán)限、鏡像空間、用戶空間和網(wǎng)絡(luò)空間等)和運(yùn)行在其中的應(yīng)用程序 - 倉庫(
Repository
):倉庫可看成一個(gè)代碼控制中心踏揣,用來保存鏡像。- 倉庫注冊服務(wù)器上往往存放著多個(gè)倉庫开瞭,每個(gè)倉庫中包含了多個(gè)鏡像,每個(gè)鏡像有不同標(biāo)簽(
tag
) - 倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式罩息。
- 最大的公開倉庫是
Docker Hub:https://hub.docker.com
嗤详,存放了數(shù)量龐大的鏡像供用戶下載。
國內(nèi)的公開倉庫包括阿里云 瓷炮、網(wǎng)易云等
- 倉庫注冊服務(wù)器上往往存放著多個(gè)倉庫开瞭,每個(gè)倉庫中包含了多個(gè)鏡像,每個(gè)鏡像有不同標(biāo)簽(
Docker
使用客戶端-服務(wù)器 (C/S
) 架構(gòu)模式葱色,使用遠(yuǎn)程API來管理和創(chuàng)建Docker容器,Docker
容器通過 Docker
鏡像來創(chuàng)建
概念 | 說明 |
---|---|
Docker 鏡像(Images) | Docker 鏡像是用于創(chuàng)建 Docker 容器的模板崭别,比如 Ubuntu 系統(tǒng)冬筒。 |
Docker 容器(Container) | 容器是獨(dú)立運(yùn)行的一個(gè)或一組應(yīng)用,是鏡像運(yùn)行時(shí)的實(shí)體 |
Docker 客戶端(Client) | Docker 客戶端通過命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 與 Docker 的守護(hù)進(jìn)程通信茅主。 |
Docker 主機(jī)(Host) | 一個(gè)物理或者虛擬的機(jī)器用于執(zhí)行 Docker 守護(hù)進(jìn)程和容器舞痰。 |
Docker Registry | Docker 倉庫用來保存鏡像,可以理解為代碼控制中的代碼倉庫诀姚。Docker Hub(https://hub.docker.com) 提供了龐大的鏡像集合供使用响牛。一個(gè) Docker Registry 中可以包含多個(gè)倉庫(Repository);每個(gè)倉庫可以包含多個(gè)標(biāo)簽(Tag)赫段;每個(gè)標(biāo)簽對(duì)應(yīng)一個(gè)鏡像呀打。通常,一個(gè)倉庫會(huì)包含同一個(gè)軟件不同版本的鏡像糯笙,而標(biāo)簽就常用于對(duì)應(yīng)該軟件的各個(gè)版本贬丛。我們可以通過 <倉庫名>:<標(biāo)簽> 的格式來指定具體是這個(gè)軟件哪個(gè)版本的鏡像。如果不給出標(biāo)簽给涕,將以 latest 作為默認(rèn)標(biāo)簽
|
Docker Machine | Docker Machine是一個(gè)簡化Docker安裝的命令行工具豺憔,通過一個(gè)簡單的命令行即可在相應(yīng)的平臺(tái)上安裝Docker,比如VirtualBox够庙、 Digital Ocean恭应、Microsoft Azure |
1.3 Docker與虛擬機(jī)的區(qū)別
虛擬機(jī)通過添加Hypervisor
層(虛擬化中間層),虛擬出網(wǎng)卡耘眨、內(nèi)存昼榛、CPU
等虛擬硬件,再在其上建立虛擬機(jī)剔难,每個(gè)虛擬機(jī)都有自己的系統(tǒng)內(nèi)核胆屿。而Docker
容器則是通過隔離(namesapce
)的方式奥喻,將文件系統(tǒng)、進(jìn)程莺掠、設(shè)備衫嵌、網(wǎng)絡(luò)等資源進(jìn)行隔離读宙,再對(duì)權(quán)限彻秆、CPU
資源等進(jìn)行控制(cgroup
),最終讓容器之間互不影響结闸,容器無法影響宿主機(jī)唇兑。
與虛擬機(jī)相比,容器資源損耗要少桦锄。同樣的宿主機(jī)下扎附,能夠建立容器的數(shù)量要比虛擬機(jī)多
但是,虛擬機(jī)的安全性要比容器稍好结耀,而docker
容器與宿主機(jī)共享內(nèi)核留夜、文件系統(tǒng)等資源,更有可能對(duì)其他容器图甜、宿主機(jī)產(chǎn)生影響
特性 | 容器 | 虛擬機(jī) |
---|---|---|
啟動(dòng) | 秒級(jí) | 分鐘級(jí) |
硬盤使用 | 一般為MB | 一般為GB |
性能 | 接近原生 | 弱于 |
系統(tǒng)支持量 | 單機(jī)支持上千個(gè)容器 | 一般是幾十個(gè) |
1.4 Docker 如何工作
Docker
技術(shù)使用 Linux
內(nèi)核和內(nèi)核功能(例如 Cgroups 和 namespaces)來分隔進(jìn)程碍粥,以便各進(jìn)程相互獨(dú)立運(yùn)行。這種獨(dú)立性正是采用容器的目的所在黑毅;它可以獨(dú)立運(yùn)行多種進(jìn)程嚼摩、多個(gè)應(yīng)用程序,更加充分地發(fā)揮基礎(chǔ)設(shè)施的作用矿瘦,同時(shí)保持各個(gè)獨(dú)立系統(tǒng)的安全性枕面。
容器工具(包括 Docker)可提供基于鏡像的部署模式。這使得它能夠輕松跨多種環(huán)境缚去,與其依賴程序共享應(yīng)用或服務(wù)組潮秘。Docker
還可在這一容器環(huán)境中自動(dòng)部署應(yīng)用程序(或者合并多種流程,以構(gòu)建單個(gè)應(yīng)用程序)易结。
此外枕荞,由于這些工具基于 Linux
容器構(gòu)建,使得 Docker
既易于使用衬衬,又別具一格 —— 它可為用戶提供前所未有的高度應(yīng)用程訪問權(quán)限买猖、快速部署以及版本控制和分發(fā)能力。
1.5 Docker技術(shù)是否與傳統(tǒng)的Linux容器相同
答案:否
Docker
技術(shù)最初是基于 LXC
技術(shù)構(gòu)建(大多數(shù)人都會(huì)將這一技術(shù)與傳統(tǒng)的 Linux
容器聯(lián)系在一起)滋尉,但后來它逐漸擺脫了對(duì)這種技術(shù)的依賴玉控。
就輕量級(jí)虛擬化這一功能來看高诺,LXC
非常有用,但它無法提供出色的開發(fā)人員或用戶體驗(yàn)虱而。除了運(yùn)行容器之外,Docker
技術(shù)還具備其他多項(xiàng)功能魁瞪,包括簡化用于構(gòu)建容器惠呼、傳輸鏡像以及控制鏡像版本的流程。
傳統(tǒng)的 Linux
容器使用 init
系統(tǒng)來管理多種進(jìn)程旅薄。這意味著,所有應(yīng)用程序都作為一個(gè)整體運(yùn)行少梁。與此相反,Docker
技術(shù)鼓勵(lì)應(yīng)用程序各自獨(dú)立運(yùn)行其進(jìn)程矫付,并提供相應(yīng)工具以實(shí)現(xiàn)這一功能凯沪。這種精細(xì)化運(yùn)作模式自有其優(yōu)勢。
1.5.1 什么是 Linux 容器
Linux
容器是與系統(tǒng)其他部分隔離開的一系列進(jìn)程技即,從另一個(gè)鏡像運(yùn)行著洼,并由該鏡像提供支持進(jìn)程所需的全部文件。容器提供的鏡像包含了應(yīng)用的所有依賴項(xiàng)而叼,因而在從開發(fā)到測試再到生產(chǎn)的整個(gè)過程中身笤,它都具有可移植性和一致性。
更加詳細(xì)地來說葵陵,假定在開發(fā)一個(gè)應(yīng)用液荸。使用的是一臺(tái)筆記本電腦,而開發(fā)環(huán)境具有特定的配置脱篙。其他開發(fā)人員身處的環(huán)境配置可能稍有不同娇钱。正在開發(fā)的應(yīng)用依賴于當(dāng)前的配置,還要依賴于某些特定文件绊困。與此同時(shí)文搂,企業(yè)還擁有標(biāo)準(zhǔn)化的測試和生產(chǎn)環(huán)境,且具有自身的配置和一系列支持文件秤朗。你希望盡可能多在本地模擬這些環(huán)境煤蹭,而不產(chǎn)生重新創(chuàng)建服務(wù)器環(huán)境的開銷。
因此,你要如何確保應(yīng)用能夠在這些環(huán)境中運(yùn)行和通過質(zhì)量檢測硝皂,并且在部署過程中不出現(xiàn)令人頭疼的問題常挚,也無需重新編寫代碼和進(jìn)行故障修復(fù)奄毡?
答案就是使用
容器
吼过。容器
可以確保你的應(yīng)用擁有必需的配置和文件那先,使得這些應(yīng)用能夠在從開發(fā)到測試、再到生產(chǎn)的整個(gè)流程中順利運(yùn)行慷垮,而不出現(xiàn)任何不良問題料身。雖然這只是簡化的示例芹血,但在需要很高的可移植性、可配置性和隔離的情況下饿悬,我們可以利用
Linux
容器通過很多方式解決難題狡恬。無論基礎(chǔ)架構(gòu)是在企業(yè)內(nèi)部還是在云端弟劲,或者混合使用兩者兔乞,容器都能滿足你的需求虱咧。
1.5.2 容器是虛擬化嗎
是,但也不竟然绘沉。我們用一種簡單方式來思考一下:
虛擬化
使得許多操作系統(tǒng)可同時(shí)在單個(gè)系統(tǒng)上運(yùn)行车伞。容器則可共享同一個(gè)操作系統(tǒng)內(nèi)核另玖,將應(yīng)用進(jìn)程與系統(tǒng)其他部分隔離開。
這意味著什么鳄哭?首先妆丘,讓多個(gè)操作系統(tǒng)在單個(gè)虛擬機(jī)監(jiān)控程序上運(yùn)行以實(shí)現(xiàn)虛擬化,并不能達(dá)成和使用容器同等的輕量級(jí)效果宣脉。事實(shí)上塑猖,在僅擁有容量有限的有限資源時(shí)羊苟,需要能夠可以進(jìn)行密集部署的輕量級(jí)應(yīng)用蜡励。
Linux
容器可從單個(gè)操作系統(tǒng)運(yùn)行兼都,在所有容器中共享該操作系統(tǒng),因此應(yīng)用和服務(wù)能夠保持輕量級(jí)慎王,并行快速運(yùn)行
1.6 Docker中的鏡像分層
參考文檔:http://www.maiziedu.com/wiki/cloud/dockerimage
Docker
支持通過擴(kuò)展現(xiàn)有鏡像赖淤,創(chuàng)建新的鏡像咱旱。實(shí)際上,Docker Hub
中 99% 的鏡像都是通過在 base 鏡像中安裝和配置需要的軟件構(gòu)建出來的。
從上圖可以看到病袄,新鏡像是從 base 鏡像一層一層疊加生成的益缠。每安裝一個(gè)軟件幅慌,就在現(xiàn)有鏡像的基礎(chǔ)上增加一層。
1.6.1 Docker鏡像為什么分層
鏡像分層最大的一個(gè)好處就是共享資源
比如說有多個(gè)鏡像都從相同的 base 鏡像構(gòu)建而來骂租,那么 Docker Host 只需在磁盤上保存一份 base 鏡像渗饮;同時(shí)內(nèi)存中也只需加載一份 base 鏡像私蕾,就可以為所有容器服務(wù)了是目。而且鏡像的每一層都可以被共享。
如果多個(gè)容器共享一份基礎(chǔ)鏡像嗤疯,當(dāng)某個(gè)容器修改了基礎(chǔ)鏡像的內(nèi)容茂缚,比如 /etc 下的文件脚囊,這時(shí)其他容器的 /etc 是不會(huì)被修改的,修改只會(huì)被限制在單個(gè)容器內(nèi)我擂。這就是容器 Copy-on-Write
特性看峻。
1.6.2 可寫的容器層
當(dāng)容器啟動(dòng)時(shí)互妓,一個(gè)新的可寫層被加載到鏡像的頂部。這一層通常被稱作容器層
珠闰,容器層
之下的都叫鏡像層
伏嗜。
所有對(duì)容器的改動(dòng) - 無論添加裸影、刪除轩猩、還是修改文件都只會(huì)發(fā)生在容器層中均践。只有容器層是可寫的,容器層下面的所有鏡像層都是只讀的或衡。
1.6.3 容器層的細(xì)節(jié)說明
鏡像層數(shù)量可能會(huì)很多斯辰,所有鏡像層會(huì)聯(lián)合在一起組成一個(gè)統(tǒng)一的文件系統(tǒng)彬呻。如果不同層中有一個(gè)相同路徑的文件废岂,比如 /a拯欧,上層的 /a 會(huì)覆蓋下層的 /a藏姐,也就是說用戶只能訪問到上層中的文件 /a羔杨。在容器層中兜材,用戶看到的是一個(gè)疊加之后的文件系統(tǒng)糠爬。
文件操作說明
文件操作 | 說明 |
---|---|
添加文件 | 在容器中創(chuàng)建文件時(shí)执隧,新文件被添加到容器層 中 |
讀取文件 | 在容器中讀取某個(gè)文件時(shí)镀琉,Docker 會(huì)從上往下依次在各鏡像層中查找 此文件。一旦找到凡壤,立即將其復(fù)制到容器層亚侠,然后打開并讀入內(nèi)存
|
修改文件 | 在容器中修改已存在的文件時(shí)硝烂,Docker 會(huì)從上往下依次在各鏡像層中查找此 文件。一旦找到狮杨,立即將其復(fù)制到容器層橄教,然后修改之 |
刪除文件 | 在容器中刪除文件時(shí)护蝶,Docker 也是從上往下依次在鏡像層中查找 此文件。找到后负饲,會(huì)在容器層中 記錄下此刪除操作 。(只是記錄刪除操作) |
只有當(dāng)需要修改時(shí)才復(fù)制一份數(shù)據(jù)衩藤,這種特性被稱作 Copy-on-Write
⌒僬蹋可見悠轩,容器層保存的是鏡像變化的部分鉴象,不會(huì)對(duì)鏡像本身進(jìn)行任何修改纺弊。
這樣就解釋了我們前面提出的問題:容器層記錄對(duì)鏡像的修改淆游,所有鏡像層都是只讀的犹菱,不會(huì)被容器修改,所以鏡像可以被多個(gè)容器共享虑椎。
1.7 Docker網(wǎng)絡(luò)類型
1.7.1 docker的網(wǎng)絡(luò)類型
類型 | 說明 |
---|---|
None | 不為容器配置任何網(wǎng)絡(luò)功能,沒有網(wǎng)絡(luò) --net=none
|
Container | 與另一個(gè)運(yùn)行中的容器共享Network Namespace迎膜,--net=container:containerID
|
Host | 與主機(jī)共享Network Namespace珊豹,--net=host
|
Bridge | Docker設(shè)計(jì)的NAT網(wǎng)絡(luò)模型(默認(rèn)類型) |
Bridge
默認(rèn)docker
網(wǎng)絡(luò)隔離基于網(wǎng)絡(luò)命名空間店茶,在物理機(jī)上創(chuàng)建docker
容器時(shí)會(huì)為每一個(gè)docker
容器分配網(wǎng)絡(luò)命名空間贩幻,并且把容器IP
橋接到物理機(jī)的虛擬網(wǎng)橋上丛楚。
1.7.1.1 host模式
host
模式 :使用 --net=host
指定
相當(dāng)于VMware
中的橋接模式
,與宿主機(jī)在同一個(gè)網(wǎng)絡(luò)中坏平,但是沒有獨(dú)立IP地址
Docker
使用了Linux
的Namespace
技術(shù)來進(jìn)行資源隔離,如PID Namespace
隔離進(jìn)程孽亲,Mount Namespace
隔離文件系統(tǒng)玲昧,Network Namespace
隔離網(wǎng)絡(luò)等孵延。
一個(gè)Network Namespace
提供了一份獨(dú)立的網(wǎng)絡(luò)環(huán)境尘应,包括網(wǎng)卡犬钢,路由玷犹,iptable
規(guī)則等都與其他Network Namespace
隔離歹颓。
一個(gè)Docker
容器一般會(huì)分配一個(gè)獨(dú)立的Network Namespace
但是如果啟動(dòng)容器的時(shí)候使用host
模式领跛,那么這個(gè)容器將不會(huì)獲得一個(gè)獨(dú)立的Network Namespace
吠昭,而是和宿主機(jī)共用一個(gè)Network Namespace
。容器將不會(huì)虛擬出自己的網(wǎng)卡幻妓,配置自己的IP
等肉津,而是使用宿主機(jī)的IP
和端口。此時(shí)容器不再擁有隔離的熟吏、獨(dú)立的網(wǎng)絡(luò)棧悍引。不擁有所有端口資源
1.7.1.2 container模式
container
模式:使用--net=container:contatiner:NAME_or_ID
指定
這個(gè)模式指定新創(chuàng)建的容器和已經(jīng)存在的一個(gè)容器共享一個(gè)Network Namespace
,而不是和宿主機(jī)共享浓领。新創(chuàng)建的容器不會(huì)創(chuàng)建自己的網(wǎng)卡,配置自己的IP捎拯,而是和一個(gè)指定的容器共享IP,端口范圍等藤树。 可以在一定程度上節(jié)省網(wǎng)絡(luò)資源岁钓,容器內(nèi)部依然不會(huì)擁有所有端口品嚣。
同樣,兩個(gè)容器除了網(wǎng)絡(luò)方面啊央,其他的如文件系統(tǒng)逝撬,進(jìn)程列表等還是隔離的。
兩個(gè)容器的進(jìn)程可以通過lo網(wǎng)卡設(shè)備通信
1.7.1.3 none 模式
none
模式:使用 --net=none
指定
使用none
模式趣苏,docker
容器有自己的network Namespace
狡相,但是并不為Docker
容器進(jìn)行任何網(wǎng)絡(luò)配置。也就是說拦键,這個(gè)Docker
容器沒有網(wǎng)卡谣光,ip
, 路由等信息芬为。
這種網(wǎng)絡(luò)模式下萄金,容器只有lo
回環(huán)網(wǎng)絡(luò),沒有其他網(wǎng)卡。
這種類型沒有辦法聯(lián)網(wǎng),但是封閉的網(wǎng)絡(luò)能很好的保證容器的安全性
該容器將完全獨(dú)立于網(wǎng)絡(luò),用戶可以根據(jù)需要為容器添加網(wǎng)卡。此模式擁有所有端口。(none
網(wǎng)絡(luò)模式配置網(wǎng)絡(luò))特殊情況下才會(huì)用到,一般不用
1.7.1.4 bridge模式
相當(dāng)于Vmware
中的 nat
模式,容器使用獨(dú)立network Namespace
展氓,并連接到docker0
虛擬網(wǎng)卡络它。通過docker0
網(wǎng)橋以及iptables nat
表配置與宿主機(jī)通信,此模式會(huì)為每一個(gè)容器分配Network Namespace
、設(shè)置IP
等沉颂,并將一個(gè)主機(jī)上的 Docker
容器連接到一個(gè)虛擬網(wǎng)橋上。
當(dāng)Docker
進(jìn)程啟動(dòng)時(shí)椰于,會(huì)在主機(jī)上創(chuàng)建一個(gè)名為docker0
的虛擬網(wǎng)橋偏陪,此主機(jī)上啟動(dòng)的Docker
容器會(huì)連接到這個(gè)虛擬網(wǎng)橋上饥脑。虛擬網(wǎng)橋的工作方式和物理交換機(jī)類似,這樣主機(jī)上的所有容器就通過交換機(jī)連在了一個(gè)二層網(wǎng)絡(luò)中。
從docker0
子網(wǎng)中分配一個(gè)IP
給容器使用茬祷,并設(shè)置docker0
的IP
地址為容器的默認(rèn)網(wǎng)關(guān)键畴。在主機(jī)上創(chuàng)建一對(duì)虛擬網(wǎng)卡veth pair
設(shè)備。veth
設(shè)備總是成對(duì)出現(xiàn)的,它們組成了一個(gè)數(shù)據(jù)的通道娃磺,數(shù)據(jù)從一個(gè)設(shè)備進(jìn)入段标,就會(huì)從另一個(gè)設(shè)備出來。因此掌逛,veth
設(shè)備常用來連接兩個(gè)網(wǎng)絡(luò)設(shè)備奠滑。
Docker
將veth pair
設(shè)備的一端放在新創(chuàng)建的容器中,并命名為eth0
(容器的網(wǎng)卡),另一端放在主機(jī)中召川, 以veth*
這樣類似的名字命名,并將這個(gè)網(wǎng)絡(luò)設(shè)備加入到docker0
網(wǎng)橋中咐蚯∧俪眨可以通過 brctl show
命令查看。
容器之間通過veth pair
進(jìn)行訪問
使用docker run -p
時(shí)谬擦,docker
實(shí)際是在iptables
做了DNAT
規(guī)則,實(shí)現(xiàn)端口轉(zhuǎn)發(fā)功能肤粱。
可以使用iptables -t nat -vnL
查看
轉(zhuǎn)載于:https://mp.weixin.qq.com/s/VkRQyvXfo-dLem5Bv0094w
1.7.2 不為容器配置網(wǎng)絡(luò)功能
此模式下創(chuàng)建容器是不會(huì)為容器配置任何網(wǎng)絡(luò)參數(shù)的,如:容器網(wǎng)卡、IP、通信路由等准验,全部需要自己去配置。
[root@docker01 ~]# docker run -it --network none busybox:latest /bin/sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
1.7.3 與其他容器共享網(wǎng)絡(luò)配置(Container)
此模式和host模式很類似,只是此模式創(chuàng)建容器共享的是其他容器的IP和端口而不是物理機(jī),此模式容器自身是不會(huì)配置網(wǎng)絡(luò)和端口,創(chuàng)建此模式容器進(jìn)去后,你會(huì)發(fā)現(xiàn)里邊的IP是你所指定的那個(gè)容器IP并且端口也是共享的,而且其它還是互相隔離的,如進(jìn)程等警检。
[root@docker01 ~]# docker run -it --network container:mywordpress_db_1 busybox:latest /bin/sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
105: eth0@if106: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
1.7.4 使用宿主機(jī)網(wǎng)絡(luò)
此模式創(chuàng)建的容器沒有自己獨(dú)立的網(wǎng)絡(luò)命名空間决摧,是和物理機(jī)共享一個(gè)Network Namespace,并且共享物理機(jī)的所有端口與IP矢门,并且這個(gè)模式認(rèn)為是不安全的物延。
[root@docker01 ~]# docker run -it --network host busybox:latest /bin/sh
1.7.5 查看網(wǎng)絡(luò)列表
[root@docker01 ~]# docker network list
NETWORK ID NAME DRIVER SCOPE
b15e8a720d3b bridge bridge local
345d65b4c2a0 host host local
bc5e2a32bb55 mywordpress_default bridge local
ebf76eea91bb none null local
1.7.6 用PIPEWORK為docker容器配置獨(dú)立IP
參考文檔:http://blog.csdn.net/design321/article/details/48264825
官方網(wǎng)站:https://github.com/jpetazzo/pipework
宿主環(huán)境:centos7.2
1腥椒、安裝pipework
wget https://github.com/jpetazzo/pipework/archive/master.zip
unzip master.zip
cp pipework-master/pipework /usr/local/bin/
chmod +x /usr/local/bin/pipework
2日川、配置橋接網(wǎng)卡
安裝橋接工具
yum install bridge-utils.x86\_64 -y
修改網(wǎng)卡配置欧漱,實(shí)現(xiàn)橋接
# 修改eth0配置职抡,讓br0實(shí)現(xiàn)橋接
[root@docker01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0
[root@docker01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0
TYPE=Bridge
BOOTPROTO=static
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=10.0.0.100
NETMASK=255.255.255.0
GATEWAY=10.0.0.254
DNS1=223.5.5.5
# 重啟網(wǎng)絡(luò)
[root@docker01 ~]# /etc/init.d/network restart
3、運(yùn)行一個(gè)容器鏡像測試:
pipework br0 \$\(docker run -d -it -p 6880:80 --name httpd\_pw httpd\) 10.0.0.220/24\@10.0.0.254
在其他主機(jī)上測試端口及連通性
[root@docker01 ~]# curl 10.0.0.220
<html><body><h1>It works!</h1></body></html>
[root@docker01 ~]# ping 10.0.0.220 -c 1
PING 10.0.0.220 (10.0.0.220) 56(84) bytes of data.
64 bytes from 10.0.0.220: icmp_seq=1 ttl=64 time=0.043 ms
4误甚、再運(yùn)行一個(gè)容器缚甩,設(shè)置網(wǎng)路類型為none:
pipework br0 $(docker run -d -it --net=none --name test httpd:2.4) 10.0.0.221/24@10.0.0.254
進(jìn)行訪問測試
[root@docker01 ~]# curl 10.0.0.221
<html><body><h1>It works!</h1></body></html>
5、重啟容器后需要再次指定:
pipework br0 testduliip 172.16.146.113/24\@172.16.146.1 pipework br0 testduliip01 172.16.146.112/24\@172.16.146.1
Docker跨主機(jī)通信之overlay可以參考:
http://www.cnblogs.com/CloudMan6/p/7270551.html
1.7.7 Docker跨主機(jī)通信之macvlan
創(chuàng)建網(wǎng)絡(luò)
[root@docker01 ~]# docker network create --driver macvlan --subnet 10.1.0.0/24 --gateway 10.1.0.254 -o parent=eth0 macvlan_1
33a1f41dcc074f91b5bd45e7dfedabfb2b8ec82db16542f05213839a119b62ca
設(shè)置網(wǎng)卡為混雜模式
ip link set eth0 promisc on
創(chuàng)建使用macvlan網(wǎng)絡(luò)容器
[root@docker02 ~]# docker run -it --network macvlan_1 --ip=10.1.0.222 busybox /bin/sh
1.8 數(shù)據(jù)卷掛載&卷映射
1.8.1 定義
數(shù)據(jù)卷
是一個(gè)供容器使用的特殊目錄窑邦,位于容器中擅威。可將宿主機(jī)的目錄掛載到數(shù)據(jù)卷上冈钦,對(duì)數(shù)據(jù)卷的修改操作立刻可見郊丛,并且更新數(shù)據(jù)不會(huì)影響鏡像,從而實(shí)現(xiàn)數(shù)據(jù)在宿主機(jī)
與容器
之間的遷移。數(shù)據(jù)卷的使用類似于Linux
下對(duì)目錄進(jìn)行的mount
操作厉熟。
如果需要在容器之間共享一些數(shù)據(jù)导盅,最簡單的方法就是使用數(shù)據(jù)卷容器。數(shù)據(jù)卷容器是一個(gè)普通的容器庆猫,專門提供數(shù)據(jù)卷給其他容器掛載使用认轨。
容器互聯(lián)是通過容器的名稱在容器間建立一條專門的網(wǎng)絡(luò)通信隧道
。簡單點(diǎn)說月培,就是會(huì)在源容器和接收容器之間建立一條隧道嘁字,接收容器可以看到源容器指定的信息
1.8.2 掛載時(shí)創(chuàng)建
掛載目錄 -v
[root@docker01 ~]# docker run -d -p 80:80 -v /data:/usr/share/nginx/html nginx:latest
079786c1e297b5c5031e7a841160c74e91d4ad06516505043c60dbb78a259d09
容器內(nèi)站點(diǎn)目錄: /usr/share/nginx/html
在宿主機(jī)寫入數(shù)據(jù),查看
[root@docker01 ~]# echo "http://www.nmtui.com" >/data/index.html
[root@docker01 ~]# curl 10.0.0.100
http://www.nmtui.com
設(shè)置共享目錄杉畜,使用同一個(gè)卷啟動(dòng)一個(gè)新的容器
[root@docker01 ~]# docker run -d -p 8080:80 -v /data:/usr/share/nginx/html nginx:latest
351f0bd78d273604bd0971b186979aa0f3cbf45247274493d2490527babb4e42
[root@docker01 ~]# curl 10.0.0.100:8080
http://www.nmtui.com
查看卷列表 docker volume ls
[root@docker01 ~]# docker volume ls
DRIVER VOLUME NAME
1.8.3 創(chuàng)建卷后掛載
創(chuàng)建一個(gè)卷:docker volume create xxx
[root@docker01 ~]# docker volume create
f3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521
[root@docker01 ~]# docker volume ls
DRIVER VOLUME NAME
local f3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521
指定卷名
[root@docker01 ~]# docker volume ls
DRIVER VOLUME NAME
local clsn
local f3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521
查看卷路徑:docker volume inspect clsn
[root@docker01 ~]# docker volume inspect clsn
[
{
"CreatedAt": "2018-02-01T00:39:25+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/clsn/_data",
"Name": "clsn",
"Options": {},
"Scope": "local"
}
]
使用卷創(chuàng)建
[root@docker01 ~]# docker run -d -p 9000:80 -v clsn:/usr/share/nginx/html nginx:latest
1434559cff996162da7ce71820ed8f5937fb7c02113bbc84e965845c219d3503
# 宿主機(jī)測試
[root@docker01 ~]# echo 'blog.nmtui.com' >/var/lib/docker/volumes/clsn/_data/index.html
[root@docker01 ~]# curl 10.0.0.100:9000
blog.nmtui.com
設(shè)置卷
[root@docker01 ~]# docker run -d -P --volumes-from 079786c1e297 nginx:latest
b54b9c9930b417ab3257c6e4a8280b54fae57043c0b76b9dc60b4788e92369fb
1.8.4 卷映射
1.8.4.1 簡介
與目錄掛載區(qū)別:
- 目錄掛載(
Bind Mounts
):由用戶管理纪蜒,需要指定宿主機(jī)
上的具體目錄。它們直接映射到宿主機(jī)的文件系統(tǒng)此叠,允許宿主機(jī)上的用戶或程序直接訪問和修改容器內(nèi)的數(shù)據(jù)纯续。因此,目錄掛載完全依賴于宿主機(jī)的文件系統(tǒng)和目錄結(jié)構(gòu)灭袁。 - 卷映射(
Volumes
):由Docker
自動(dòng)管理和維護(hù)猬错。它們存儲(chǔ)在Docker
主機(jī)的一個(gè)特定目錄中(通常是/var/lib/docker/volumes/
),與宿主機(jī)的文件系統(tǒng)相隔離茸歧,提供了更好的安全性和隔離性倦炒。Docker
卷的生命周期可以獨(dú)立于容器,即使容器被刪除软瞎,卷中的數(shù)據(jù)也會(huì)保留逢唤。
與目錄掛載最大區(qū)別是-v
后不以/
開始,在啟動(dòng)時(shí)即使沒有文件也會(huì)以容器內(nèi)文件為主涤浇,而目錄掛載沒有文件就是空的
示例命令:
卷映射:docker run -v volume_name:/path/in/container my_image
目錄掛載:docker run -v /path/on/host:/path/in/container my_image
如何確定是具名掛載還是匿名掛載鳖藕,還是指定路徑掛載:
-
-v
:容器路徑 匿名掛載 -
-v
:卷名:容器內(nèi)路徑 具名掛載 -
-v
:/宿主機(jī)路徑:容器內(nèi)路徑 指定路徑掛載
1.8.4.2 映射沒有冒號(hào)
沒有冒號(hào)時(shí),比如:docker run -v /app/shared_data my_image
的路徑含義
如果只提供一個(gè)路徑只锭,即 -v /app/shared_data
著恩,這里的路徑是容器內(nèi)
的掛載路徑。Docker
會(huì)自動(dòng)為該路徑創(chuàng)建一個(gè)匿名卷
(宿主機(jī)由 Docker
管理的目錄)蜻展。
匿名卷存儲(chǔ)在宿主機(jī)的默認(rèn)卷存儲(chǔ)路徑中(例如 /var/lib/docker/volumes
)喉誊,但這個(gè)宿主機(jī)路徑是由 Docker
自動(dòng)管理的,并不是用戶直接指定的宿主路徑铺呵。
容器路徑的作用:
-
-v /app/shared_data
表示要在容器內(nèi)部的/app/shared_data
掛載一個(gè)存儲(chǔ)。
如果不指定宿主路徑隧熙,則 Docker 會(huì)在宿主機(jī)創(chuàng)建一個(gè)匿名卷片挂,并將其掛載到容器內(nèi)部的 /app/shared_data。 - 匿名卷的存儲(chǔ)位置
宿主機(jī)的匿名卷位置是Docker
默認(rèn)管理的路徑,如/var/lib/docker/volumes/{volume_id}/_data
音念。