在面試的時候,面試官常常會問一些問題:
- docker是什么,能做什么?
- docker和虛擬機(jī)的區(qū)別是什么呢?
- docker是用什么做隔離的?
- docke的網(wǎng)絡(luò)類型?docker數(shù)據(jù)之間是如何通信的?
- docker的數(shù)據(jù)保存問題?
- 常用的docker命令?
- docker制作鏡像相關(guān)?
下面,就讓我來詳細(xì)說明一些這些問題
1. docker是什么?能做什么?
是什么??
??????就是一個軟件
? ? ? 跑容器的軟件
將軟件打包到標(biāo)準(zhǔn)化單元中,以便進(jìn)行開發(fā)、運(yùn)輸和部署
容器是打包代碼及其所有依賴項的軟件標(biāo)準(zhǔn)單元,以便應(yīng)用程序從一個計算環(huán)境快速可靠地運(yùn)行到另一個計算環(huán)境。Docker 容器映像是一個輕量級、獨(dú)立的可執(zhí)行軟件包,其中包含運(yùn)行應(yīng)用程序所需的一切:代碼、運(yùn)行時、系統(tǒng)工具、系統(tǒng)庫和設(shè)置。
有什么作用,解決了什么問題?
? ? ?將任何軟件都可以放到容器里去運(yùn)行
? ? ?更加節(jié)約企業(yè)的服務(wù)器資源,降低基礎(chǔ)設(shè)施成本
? ? ?軟件的快速部署和縮放---》改變了軟件部署和安裝的方式
2. docker和虛擬機(jī)的區(qū)別
與虛擬機(jī)相比,dockers的優(yōu)缺點(diǎn):
優(yōu)點(diǎn) | 缺點(diǎn) |
Docker啟動快速屬于秒級別,虛擬機(jī)通常需要幾分鐘去啟動 | 與虛擬機(jī)相比,Docker隔離性更弱,Docker屬于進(jìn)程之間的隔離,虛擬機(jī)可實(shí)現(xiàn)系統(tǒng)級別隔離。 |
快速創(chuàng)建、刪除:虛擬化創(chuàng)建是分鐘級別的,Docker容器創(chuàng)建是秒級別的,Docker的快速迭代性,決定了無論是開發(fā)、測試、部署都可以節(jié)約大量時間。 | 可管理性:Docker的集中化管理工具還不算成熟。各種虛擬化技術(shù)都有成熟的管理工具,例如VMware vCenter提供完備的虛擬機(jī)管理能力。 |
Docker更輕量,Docker的架構(gòu)可以共用一個內(nèi)核與共享應(yīng)用程序庫,所占內(nèi)存極小。同樣的硬件環(huán)境,Docker運(yùn)行的鏡像數(shù)遠(yuǎn)多于虛擬機(jī)數(shù)量。對系統(tǒng)的利用率非常高。 | 高可用和可恢復(fù)性:Docker對業(yè)務(wù)的高可用支持是通過快速重新部署實(shí)現(xiàn)的。虛擬化具備負(fù)載均衡、高可用、容錯、遷移和數(shù)據(jù)保護(hù)等經(jīng)過生產(chǎn)實(shí)踐檢驗(yàn)的成熟保障機(jī)制,VMware可承諾虛擬機(jī)99.999%高可用,保證業(yè)務(wù)連續(xù)性。 |
Docker需要的資源更少,Docker可以在操作系統(tǒng)級別進(jìn)行虛擬化,Docker容器和內(nèi)核交互,基本沒有性能損耗,性能優(yōu)于通過Hypervisor層與內(nèi)核層的虛擬化 | 安全性:Docker的安全性也更弱。Docker的租戶root和宿主機(jī)root等同,一旦容器內(nèi)的用戶從普通用戶權(quán)限提升為root權(quán)限,它就直接具備了宿主機(jī)的root權(quán)限,進(jìn)而可進(jìn)行無限制的操作。 |
交付、部署:虛擬機(jī)可以通過鏡像實(shí)現(xiàn)環(huán)境交付的一致性,但鏡像分發(fā)無法體系化;Docker在Dockerfile中記錄了容器構(gòu)建過程,可在集群中實(shí)現(xiàn)快速分發(fā)和快速部署。 |
簡單來說:
docker的啟動速度更快,資源消耗更小,拓展更方便
但docker的隔離沒有虛擬機(jī)徹底,虛擬機(jī)的安全性更高,
3. docker是用什么做隔離的?
docker底層是用命名空間做隔離的
docker的命名空間包括:
PID命名空間:進(jìn)程隔離,每個容器都有自己的進(jìn)程ID空間,互不影響。
NET命名空間:網(wǎng)絡(luò)隔離,每個容器都有自己的網(wǎng)絡(luò)接口、IP地址、路由表等,互不影響。
IPC命名空間:進(jìn)程間通信隔離,每個容器都有自己的System V IPC和POSIX消息隊列,互不影響。
MNT命名空間:文件系統(tǒng)隔離,每個容器都有自己的文件系統(tǒng)掛載點(diǎn),互不影響。
UTS命名空間:主機(jī)名隔離,每個容器都有自己的主機(jī)名和域名,互不影響。
User命名空間:用戶隔離,每個容器都有自己的用戶和組ID,互不影響。
命名空間是Linux內(nèi)核提供的一種隔離機(jī)制,它可以將一個進(jìn)程的視圖限制在一個特定的范圍內(nèi),讓進(jìn)程看到的資源受到隔離和限制,從而實(shí)現(xiàn)容器之間的隔離。
不同的命名空間有不同的資源
容器由不同的命名空間組合而成
一個pod里的容器共享很多namespace,例如network,這樣他們就使用同一個ip地址
CGroup?對資源進(jìn)行限制,例如:cpu,內(nèi)存、磁盤、網(wǎng)絡(luò)等?
容器理解為一個人,命名空間理解為吃喝玩樂的地方,cgroups理解為能使用的金錢和體力
4.?docke的網(wǎng)絡(luò)類型?docker數(shù)據(jù)之間是如何通信的?
四類網(wǎng)絡(luò)模式
這幾個模式只考慮宿主機(jī)和容器之間的通信,在同一臺機(jī)器里
同一臺機(jī)器里通信:
橋接網(wǎng)絡(luò)模式
當(dāng)Docker進(jìn)程啟動時,會在主機(jī)上創(chuàng)建一個名為docker0的虛擬網(wǎng)橋,此主機(jī)上啟動的Docker容器會連接到這個虛擬網(wǎng)橋上。從docker0子網(wǎng)中分配一個IP給容器使用,并設(shè)置docker0的IP地址為容器的默認(rèn)網(wǎng)關(guān)。在主機(jī)上創(chuàng)建一對虛擬網(wǎng)卡veth pair設(shè)備,Docker將veth pair設(shè)備的一端放在新創(chuàng)建的容器中,并命名為eth0(容器的網(wǎng)卡),另一端放在主機(jī)中,以vethxxx這樣類似的名字命名,并將這個網(wǎng)絡(luò)設(shè)備加入到docker0網(wǎng)橋中
docker0–>相當(dāng)于路由器的LAN口+DHCP服務(wù)器
容器網(wǎng)卡–>相當(dāng)于虛擬機(jī)里的ens33網(wǎng)卡
主機(jī)網(wǎng)卡–>在虛擬機(jī)里,相當(dāng)于真實(shí)機(jī)器里模擬出來的vmnet8網(wǎng)卡,用于和虛擬機(jī)進(jìn)行通信的
host網(wǎng)絡(luò)模式
如果啟動容器的時候使用host模式,那么這個容器將不會獲得一個獨(dú)立的Network Namespace,而是和宿主機(jī)共用一個Network Namespace。容器將不會虛擬出自己的網(wǎng)卡,配置自己的IP等,而是使用宿主機(jī)的IP和端口。但是,容器的其他方面,如文件系統(tǒng)、進(jìn)程列表等還是和宿主機(jī)隔離的。
使用host模式的容器可以直接使用宿主機(jī)的IP地址與外界通信,容器內(nèi)部的服務(wù)端口也可以使用宿主機(jī)的端口,不需要進(jìn)行NAT,host最大的優(yōu)勢就是網(wǎng)絡(luò)性能比較好,但是docker host上已經(jīng)使用的端口就不能再用了,網(wǎng)絡(luò)的隔離性不好。
container網(wǎng)絡(luò)模式
這個模式指定新創(chuàng)建的容器和已經(jīng)存在的一個容器共享一個 Network Namespace,而不是和宿主機(jī)共享。新創(chuàng)建的容器不會創(chuàng)建自己的網(wǎng)卡,配置自己的 IP,而是和一個指定的容器共享 IP、端口范圍等。同樣,兩個容器除了網(wǎng)絡(luò)方面,其他的如文件系統(tǒng)、進(jìn)程列表等還是隔離的。兩個容器的進(jìn)程可以通過 lo 網(wǎng)卡設(shè)備通信。
none網(wǎng)絡(luò)模式
使用none模式,Docker容器擁有自己的Network Namespace,但是,并不為Docker容器進(jìn)行任何網(wǎng)絡(luò)配置。也就是說,這個Docker容器沒有網(wǎng)卡、IP、路由等信息。需要我們自己為Docker容器添加網(wǎng)卡、配置IP等。
這種網(wǎng)絡(luò)模式下容器只有l(wèi)o回環(huán)網(wǎng)絡(luò),沒有其他網(wǎng)卡。none模式可以在容器創(chuàng)建時通過–network=none來指定。這種類型的網(wǎng)絡(luò)沒有辦法聯(lián)網(wǎng),封閉的網(wǎng)絡(luò)能很好的保證容器的安全性。
不同宿主機(jī)容器之間通信
overlay
Overlay網(wǎng)絡(luò)實(shí)際上市目前最主流的容器跨節(jié)點(diǎn)數(shù)據(jù)傳輸和路由方案
overlay用于不同宿主機(jī)的容器間的通信,同時支持對消息進(jìn)行加密
安裝docker的容器編排工具swarm會有overlay網(wǎng)絡(luò)模式
發(fā)送數(shù)據(jù)包流程
容器Container1 發(fā)送數(shù)據(jù)包 到容器 Container2。
- 1、容器Container1會通過Container eth0 將這個數(shù)據(jù)包發(fā)送到 10.0.0.1 的網(wǎng)關(guān)。
- 2、網(wǎng)關(guān)將數(shù)據(jù)包發(fā)送出去后到達(dá)b20網(wǎng)橋。
- 3、b20網(wǎng)橋針對VXLAN設(shè)備,主要用于捕獲對外的數(shù)據(jù)包通過VETP進(jìn)行數(shù)據(jù)包封裝。
- 4、封裝好將VXLAN格式數(shù)據(jù)包交給eth0,通過UDP方式交給Container2的eth0。
- 5、Container2收到數(shù)據(jù)包后通過VETP將數(shù)據(jù)包解封裝。
- 6、網(wǎng)橋通過網(wǎng)關(guān)將解封裝的數(shù)據(jù)包轉(zhuǎn)發(fā)給Container eth0,完畢通信。
overlay的底層原理VXLAN
VXLAN是一種隧道技術(shù)。通過將虛擬網(wǎng)絡(luò)中的數(shù)據(jù)幀封裝在實(shí)際物理網(wǎng)絡(luò)中的報文中進(jìn)行傳輸。具體實(shí)現(xiàn)方式為:將虛擬網(wǎng)絡(luò)的數(shù)據(jù)幀添加VXLAN首部后,封裝在物理網(wǎng)絡(luò)中的UDP報文中,然后以傳統(tǒng)網(wǎng)路絡(luò)的通信方式傳送該UDP報文,到達(dá)目的主機(jī)后,去掉物理網(wǎng)絡(luò)報文的頭部信息以及VXLAN首部,將報文交付給目的終端。整個通信過程目的終端不會感知到物理網(wǎng)絡(luò)的存在。
VTEP(VXLAN Tunnel Endpoints,VXLAN隧道端 點(diǎn))是VXLAN網(wǎng)絡(luò)的邊緣設(shè)備,是VXLAN隧道的起點(diǎn)和終點(diǎn),源服務(wù)器發(fā)出的原始數(shù)據(jù)幀,在VTEP上被封裝成VXLAN格式的報文,并在IP網(wǎng)絡(luò)中傳遞到另外一個VTEP上,并經(jīng)過解封轉(zhuǎn)還原出原始的數(shù)據(jù)幀,最后轉(zhuǎn)發(fā)給目的服務(wù)器。
監(jiān)聽端口4789
封裝格式
macvlan
在 Docker 中,macvlan 是眾多 Docker 網(wǎng)絡(luò)模型中的一種,并且是一種跨主機(jī)的網(wǎng)絡(luò)模型,作為一種驅(qū)動(driver)啟用(-d 參數(shù)指定),Docker macvlan 只支持 bridge 模式。
參考:https://docs.docker.com/network/drivers/macvlan/
ipvlan
IPvlan 驅(qū)動程序讓用戶可以完全控制 IPv4 和 IPv6 尋址。VLAN 驅(qū)動程序建立在此之上,為對底層網(wǎng)絡(luò)集成感興趣的用戶提供了對第 2 層 VLAN 標(biāo)記甚至 IPvlan L3 路由的完全控制。
?直接和eth0組成了一個局域網(wǎng)--》相當(dāng)于一個vlan
?IPVLAN和overlay都可以實(shí)現(xiàn)不同主機(jī)上的容器之間的通信,但是ipvlan是所有的容器都是相同網(wǎng)段,相當(dāng)于在一個vlan里,然后可以通過不同的子接口對應(yīng)不同的網(wǎng)段,實(shí)現(xiàn)不同的類型的容器之間的通信
5. docker的數(shù)據(jù)保存問題?
使用數(shù)據(jù)卷?
作用:方便備份恢復(fù),實(shí)現(xiàn)數(shù)據(jù)共享
容器和宿主機(jī)的之間的數(shù)據(jù)共享
多宿主機(jī)之間的數(shù)據(jù)共享 參考另一篇博客:https://blog.csdn.net/ZhouXin1111112/article/details/132560687?spm=1001.2014.3001.5501
6. 常用的docker命令?
docker version | 查看docker的版本 |
docker ps | 查看目前正在啟動的容器,-a 查看所有容器 |
docker rm | 刪除容器 |
docker rmi | 刪除鏡像 |
docker image | 查看鏡像 |
docker pull | 拉取鏡像 |
docker run | 創(chuàng)建容器,然后啟動容器 = docker pull ?+docker ?create +docker start |
docker create | 創(chuàng)建容器 |
docker build | 使用 Dockerfile 創(chuàng)建鏡像 |
docker start | 啟動容器 |
docker stop | 停止容器 |
docker exec -it? | 進(jìn)入容器 |
7.?docker制作鏡像相關(guān)?
鏡像原理
參考:https://blog.51cto.com/liuleis/2070461
分層結(jié)構(gòu)
所有的容器都是共享宿主機(jī)的內(nèi)核kernel
上圖 Debian 和 BusyBox上層提供各自的 rootfs,底層共用 Docker Host 的 kernel。
容器只能使用 Host 的 kernel,并且不能修改。所有容器都共用 host 的 kernel,在容器中沒辦法對 kernel 升級。
所有的容器運(yùn)行時間都是一樣的,使用宿主機(jī)的時間
① 新鏡像不再是從 scratch 開始,而是直接在 Debian base 鏡像上構(gòu)建。
② 安裝 emacs 編輯器。
③ 安裝 apache2。
④ 容器啟動時運(yùn)行 bash。
構(gòu)建過程如下圖所示:
可以看到,新鏡像是從 base 鏡像一層一層疊加生成的。每安裝一個軟件,就在現(xiàn)有鏡像的基礎(chǔ)上增加一層。
問什么 Docker 鏡像要采用這種分層結(jié)構(gòu)呢?
最大的一個好處就是 - 共享資源。
比如:有多個鏡像都從相同的 base 鏡像構(gòu)建而來,那么 Docker Host 只需在磁盤上保存一份 base 鏡像;同時內(nèi)存中也只需加載一份 base 鏡像,就可以為所有容器服務(wù)了。而且鏡像的每一層都可以被共享。
這時可能就有人會問了:如果多個容器共享一份基礎(chǔ)鏡像,當(dāng)某個容器修改了基礎(chǔ)鏡像的內(nèi)容,比如 /etc 下的文件,這時其他容器的 /etc 是否也會被修改?
答案:不會!因?yàn)樾薷臅幌拗圃趩蝹€容器內(nèi)。
?
容器 Copy-on-Write 特性
當(dāng)容器啟動時,一個新的可寫層被加載到鏡像的頂部。
這一層通常被稱作“容器層”,“容器層”之下的都叫“鏡像層”。
所有對容器的改動 - 無論添加、刪除、還是修改文件都只會發(fā)生在容器層中。
只有容器層是可寫的,容器層下面的所有鏡像層都是只讀的。
下面我們深入討論容器層的細(xì)節(jié)。
鏡像層數(shù)量可能會很多,所有鏡像層會聯(lián)合在一起組成一個統(tǒng)一的文件系統(tǒng)。如果不同層中有一個相同路徑的文件,比如 /a,上層的 /a 會覆蓋下層的 /a,也就是說用戶只能訪問到上層中的文件 /a。在容器層中,用戶看到的是一個疊加之后的文件系統(tǒng)。
1.添加文件
在容器中創(chuàng)建文件時,新文件被添加到容器層中。
2. 讀取文件
在容器中讀取某個文件時,Docker 會從上往下依次在各鏡像層中查找此文件。一旦找到,打開并讀入內(nèi)存。
3. 修改文件
在容器中修改已存在的文件時,Docker 會從上往下依次在各鏡像層中查找此文件。一旦找到,立即將其復(fù)制到容器層,然后修改之。
4. 刪除文件
在容器中刪除文件時,Docker 也是從上往下依次在鏡像層中查找此文件。找到后,會在容器層中記錄下此刪除操作。
只有當(dāng)需要修改時才復(fù)制一份數(shù)據(jù),這種特性被稱作 Copy-on-Write。可見,容器層保存的是鏡像變化的部分,不會對鏡像本身進(jìn)行任何修改。
這樣就解釋了我們前面提出的問題:容器層記錄對鏡像的修改,所有鏡像層都是只讀的,不會被容器修改,所以鏡像可以被多個容器共享。
鏡像里有什么?
Docker 容器鏡像是一個輕量級、獨(dú)立的可執(zhí)行軟件包,其中包含運(yùn)行應(yīng)用進(jìn)程所需的一切:代碼、運(yùn)行時、系統(tǒng)工具、系統(tǒng)庫和設(shè)置。
Dockerfile文件
指令
如何讓你制作的鏡像比較小?
- 1.使用基礎(chǔ)鏡像要小
- 2.少使用RUN和COPY,ADD
- 3.使用鏡像啟動容器后,再在里面安裝軟件,使用卷掛載數(shù)據(jù)
RUN和CMD/ENTRYPOINT的區(qū)別
運(yùn)行的時間點(diǎn)不一樣:
- RUN 指令在制作鏡像的時候運(yùn)行的
- CMD 和ENTRYPOINT 指令是在容器啟動的時候運(yùn)行的
ENTRYPOINT和CMD的區(qū)別
當(dāng)2者都存在的時候,CMD里的內(nèi)容會成為ENTRYPOINT里的參數(shù)(位置參數(shù))
ENTRYPOINT ["docker-entrypoint.sh"]
EXPOSE 3306 33060
CMD ["mysqld"]
相當(dāng)于docker-entrypoint.sh mysqld
set命令
set指令能設(shè)置所使用shell的執(zhí)行方式,可依照不同的需求來做設(shè)置。文章來源:http://www.zghlxwxcb.cn/news/detail-682701.html
語法
set [+-abCdefhHklmnpPtuvx]
參數(shù)說明:
-e 若指令傳回值不等于0,則立即退出shell。
-u 當(dāng)執(zhí)行時使用到未定義過的變量,則顯示錯誤信息。
-x 執(zhí)行指令后,會先顯示該指令的執(zhí)行過程及所下的參數(shù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-682701.html
RUN set -eux; \
savedAptMark="$(apt-mark showmanual)"; \
apt-get update; \
apt-get install -y --no-install-recommends ca-certificates wget; \
rm -rf /var/lib/apt/lists/*; \
到了這里,關(guān)于docker常見面試問題詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!