Docker之Docker概念昂利,網(wǎng)絡(luò),數(shù)據(jù)卷

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)易云等

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 使用了LinuxNamespace 技術(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è)置docker0IP地址為容器的默認(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è)備奠滑。

Dockerveth 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音念。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沪饺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子闷愤,更是在濱河造成了極大的恐慌整葡,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讥脐,死亡現(xiàn)場離奇詭異遭居,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)旬渠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門俱萍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人告丢,你說我怎么就攤上這事枪蘑。” “怎么了岖免?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵岳颇,是天一觀的道長。 經(jīng)常有香客問我颅湘,道長话侧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任栅炒,我火速辦了婚禮掂摔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赢赊。我一直安慰自己乙漓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布释移。 她就那樣靜靜地躺著叭披,像睡著了一般。 火紅的嫁衣襯著肌膚如雪玩讳。 梳的紋絲不亂的頭發(fā)上涩蜘,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音熏纯,去河邊找鬼同诫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛樟澜,可吹牛的內(nèi)容都是我干的误窖。 我是一名探鬼主播叮盘,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼霹俺!你這毒婦竟也來了柔吼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤丙唧,失蹤者是張志新(化名)和其女友劉穎愈魏,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體想际,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡培漏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了沼琉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片北苟。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖打瘪,靈堂內(nèi)的尸體忽然破棺而出友鼻,到底是詐尸還是另有隱情,我是刑警寧澤闺骚,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布彩扔,位于F島的核電站,受9級(jí)特大地震影響僻爽,放射性物質(zhì)發(fā)生泄漏虫碉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一胸梆、第九天 我趴在偏房一處隱蔽的房頂上張望敦捧。 院中可真熱鬧,春花似錦碰镜、人聲如沸兢卵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秽荤。三九已至,卻和暖如春柠横,著一層夾襖步出監(jiān)牢的瞬間窃款,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國打工牍氛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晨继,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓搬俊,卻偏偏與公主長得像紊扬,于是被迫代替她去往敵國和親曲饱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容