四、Docker網(wǎng)絡(luò)
當(dāng) Docker 啟動(dòng)時(shí),會自動(dòng)在主機(jī)上創(chuàng)建一個(gè) docker0
虛擬網(wǎng)橋,實(shí)際上是 Linux 的一個(gè) bridge,可以理解為一個(gè)軟件交換機(jī)。它會在掛載到它的網(wǎng)口之間進(jìn)行轉(zhuǎn)發(fā)。
同時(shí),Docker 隨機(jī)分配一個(gè)本地未占用的私有網(wǎng)段中的一個(gè)地址給 docker0
接口。它在內(nèi)核層連通了其他的物理或虛擬網(wǎng)卡,這就將所有容器和本地主機(jī)都放到同一個(gè)物理網(wǎng)絡(luò)。比如典型的 172.17.42.1
,掩碼為 255.255.0.0
。此后啟動(dòng)的容器內(nèi)的網(wǎng)口也會自動(dòng)分配一個(gè)同一網(wǎng)段(172.17.0.0/16
)的地址。這里,我們可以在主機(jī)上執(zhí)行ip addr
查看主機(jī)ip配置:
image-20220617211231789
進(jìn)入某一容器,容器內(nèi)部查看發(fā)現(xiàn)容器IP:發(fā)現(xiàn)其也屬于172.17
網(wǎng)段,因此驗(yàn)證上述的文檔解釋。
image-20220617212110416
dockerhost
除bridge方式,Docker還支持host、container、none三種網(wǎng)絡(luò)通信方式,使用其它通信方式,只要在Docker啟動(dòng)時(shí),指定–net參數(shù)即可。
- host方式可以讓容器無需創(chuàng)建自己的網(wǎng)絡(luò)協(xié)議棧,而直接訪問宿主機(jī)的網(wǎng)絡(luò)接口,在容器中執(zhí)行ip addr會發(fā)現(xiàn)與宿主機(jī)的網(wǎng)絡(luò)配置是一樣的,host方式讓容器直接使用宿主機(jī)的網(wǎng)絡(luò)接口,傳輸數(shù)據(jù)的效率會更加高效,避免bridge方式帶來的額外開銷,但是這種方式也可以讓容器訪問宿主機(jī)的隱私服務(wù),可能會帶來意想不到的安全問題,因此應(yīng)謹(jǐn)慎使用host方式;
- container方式可以讓容器共享一個(gè)已經(jīng)存在容易的網(wǎng)絡(luò)配置;
- none方式不會對容器的網(wǎng)絡(luò)做任務(wù)配置,需要用戶自己去定制。
外部訪問容器
容器允許外部訪問,可以在 docker run
時(shí)候通過 -p
或 -P
參數(shù)來啟用。不管用那種辦法,其實(shí)也是在本地的 iptable
的 nat 表中添加相應(yīng)的規(guī)則。
docker run IMAGE_ID -p 8080:8081 #將container的8081端口開放給宿主機(jī)的8080端口,通過訪問主機(jī)的8080端口就可訪問到container的8081端口
容器訪問外部
容器所有到外部網(wǎng)絡(luò)的連接,源地址都會被 NAT 成本地系統(tǒng)的 IP 地址。這是使用 iptables
的源地址偽裝操作實(shí)現(xiàn)的。
從下圖可以看到,對172.18.0.0/16局域網(wǎng)下所有設(shè)備需要訪問外部網(wǎng)絡(luò)的時(shí)候,會經(jīng)過NAT地址轉(zhuǎn)換
image-20220617213113673
五、Docker鏡像構(gòu)建
1. Commit命令
docker commit
支持?jǐn)U展現(xiàn)有鏡像,創(chuàng)建新的鏡像,通常來說,commit
命令就是提交容器副本使之成為一個(gè)新的鏡像
docker commit -m="提交的描述信息" -a="作者" 容器ID 要?jiǎng)?chuàng)建的目標(biāo)鏡像名:[標(biāo)簽名]
2. Dockerfile構(gòu)建
Dockerfile也是生成Docker鏡像的一種重要手段,也是常用的手段。它是一個(gè)文本文件,其中包含我們需要運(yùn)行以構(gòu)建 Docker 映像的所有命令。
Docker commit是通過增強(qiáng)原有鏡像基礎(chǔ)上,重新安裝新功能。
Dockerfile, 本鏡像需要一次性添加所有所需的依賴鏡像
- 編寫Dockerfile文件
- 執(zhí)行Docker build構(gòu)建鏡像
- docker run啟動(dòng)鏡像
構(gòu)建流程
- docker從基礎(chǔ)鏡像運(yùn)行一個(gè)容器
- 執(zhí)行一條指令并對容器做出修改
- 執(zhí)行類似docker commit的操作提交一個(gè)新的鏡像層
- docker再基于剛提交的鏡像運(yùn)行一個(gè)新容器
- 執(zhí)行dockerfile中的下一條指令直到所有指令都執(zhí)行完成
生動(dòng)概括:dockerfile(中藥單子)–> images(中藥) —> docker container(藥湯)
六、Docker數(shù)據(jù)管理
Docker分層,聯(lián)合文件系統(tǒng)。Docker由于是基于Linux上運(yùn)行的,因此 底層直接使用Host的kernel ,自己需要提供rootfs就可以了。不同的發(fā)行版本由于bootfs
基本上是一致的,但是rootfs
會有差別,因此不同的發(fā)行版可以公用bootfs
。
1. 文件卷的作用
將Docker容器中的數(shù)據(jù)保存進(jìn)宿主機(jī)中磁盤系統(tǒng)。也就是對數(shù)據(jù)的要求是持久化的。如果容器實(shí)例刪除之后,容器內(nèi)的數(shù)據(jù)自然就沒有了。
因此Docker容器內(nèi)部的數(shù)據(jù)可以備份+持久化到本地主機(jī)目錄
docker run -it --privileged=true -v 宿主機(jī)目錄:Docker目錄 鏡像名
- 數(shù)據(jù)卷可以在容器之間或者宿主機(jī)與容器之間共享數(shù)據(jù)
- 可以對容器里面的數(shù)據(jù)進(jìn)行持久化或者備份
- 更好的管理文件
docker inspect 容器名 #查看容器詳情
可以看到Docker Mounts下會計(jì)到自己掛載的路徑規(guī)則
image-20220615200042582
2. 容器卷的繼承
docker run -it --privileged=true --volumes-from 容器父類名 --name 容器名
子容器集成父容器的掛載規(guī)則,如果父容器被kill或者stop,不會影響子容器的規(guī)則。
心中無女人,編碼自然神,忘掉心上人,抬手滅紅塵
-
開源軟件
+關(guān)注
關(guān)注
0文章
210瀏覽量
15900 -
編程
+關(guān)注
關(guān)注
88文章
3614瀏覽量
93686 -
Docker
+關(guān)注
關(guān)注
0文章
457瀏覽量
11846
發(fā)布評論請先 登錄
相關(guān)推薦
評論