瘋狂Java之學(xué)習(xí)筆記(28)-------------static">瘋狂Java之學(xué)習(xí)筆記(28)-------------static
812
2025-03-31
寫在前面
嗯,報(bào)了考試,整理課堂筆記記憶
學(xué)習(xí)的原因:
雖然考了CKA,了解了一些K8s相關(guān)的知識(shí)
但是對(duì)云原生整個(gè)體系一直都很模糊
希望對(duì)云原生有一個(gè)基本的認(rèn)識(shí)
通過學(xué)習(xí)實(shí)現(xiàn)云原生相關(guān)入門
博文主要內(nèi)容涉及:
關(guān)于Docker知識(shí)體系的簡述,適合溫習(xí)
講的很淺,都是理論,沒有實(shí)戰(zhàn)
傍晚時(shí)分,你坐在屋檐下,看著天慢慢地黑下去,心里寂寞而凄涼,感到自己的生命被剝奪了。當(dāng)時(shí)我是個(gè)年輕人,但我害怕這樣生活下去,衰老下去。在我看來,這是比死亡更可怕的事。--------王小波
云原生基礎(chǔ)設(shè)施之容器技術(shù)
容器發(fā)展背景
容器是一種輕量級(jí)、可移植、自包含的軟件打包技術(shù),使應(yīng)用程序可以在幾乎任何地方以相同的方式運(yùn)行。
開發(fā)人員在自己開發(fā)環(huán)境創(chuàng)建并測試好的容器,無需任何修改就能夠在生產(chǎn)系統(tǒng)的虛擬機(jī)、物理服務(wù)器或公有云主機(jī)上運(yùn)行
將集裝箱的思想應(yīng)用到了軟件的打包和部署上,為各類不同的代碼提供了一個(gè)基于容器的標(biāo)準(zhǔn)化運(yùn)輸系統(tǒng)。
容器和虛擬機(jī) 之間的主要區(qū)別在于虛擬化層的位置和操作系統(tǒng)資源的使用方式。
用戶運(yùn)行在容器里的應(yīng)用進(jìn)程,跟宿主機(jī)上的其他進(jìn)程一樣,都由宿主機(jī)操作系統(tǒng)統(tǒng)一管理,只不過這些被隔離的進(jìn)程擁有額外設(shè)置過的Namespace參數(shù)。而Docker項(xiàng)目在這里扮演的角色,更,多的是旁路式的輔助和管理工作
2013年, dotCloud公司將Docker項(xiàng)目開源。
Docker項(xiàng)目:GitHub上開發(fā)的Moby開源項(xiàng)目的一部分,遵循Apache License 2.0許可證協(xié)議,Go語言編寫Docker是一個(gè)開源的引擎,可以輕松的為任何應(yīng)用創(chuàng)建一個(gè)輕量級(jí)的、可移植的、自給自足的容器。
Docker公司目前推出兩個(gè)版本:
Docker CE (社區(qū)版),
Docker EE (企業(yè)版)
容器關(guān)鍵技術(shù)介紹
容器不光是Docker,還有其他容器,比如CoreOS的rkt,紅帽的podman,以及之后的K8s之后的containerd。為了保證容器生態(tài)的健康發(fā)展,保證不同容器之間能夠兼容,包含Docker-CoreOS-Google在內(nèi)的若干公司共同成立了一個(gè)叫Open Container Initiative(OCI)的組織,其目是制定開放的容器規(guī)范。
runtime與操作系統(tǒng)kernel緊密協(xié)作,為容器提供運(yùn)行環(huán)境。常見的容器runtime:
runC是Docker公司2015年發(fā)布的容器runtime工具,符合OCI規(guī)范。 runC Libcontainer演變而來。
rkt,是CoreOS公司開發(fā)的Docker/runc的一個(gè)流行替代方案,符合OCI規(guī)范。
Kata, 2017年整合Clear ContainerNrunV項(xiàng)目,基于虛擬化技術(shù)的容器實(shí)現(xiàn),符合OCI規(guī)范。
gVisor ,2018 年Google公司發(fā)布 gVisor的項(xiàng)目,基于虛擬化技術(shù)的容器實(shí)現(xiàn),符合OCI規(guī)范
Docker主要指容器引擎,即Docker engine。Docker Engine是-個(gè)Client/Server應(yīng)用程序。Docker engine主要組件有3部分:
服務(wù)器:是一個(gè)長期運(yùn)行的程序,稱為daemon進(jìn)程:Docker daemon用于創(chuàng)建和管理docker對(duì)象,如容器鏡像、容器、網(wǎng)絡(luò)、卷。
命令行界面客戶端(docker CLI):CLI使用Docker REST API通過腳本或直接的CLI命令與Docker daemon交互。
一個(gè)REST API:Client可以用它來與daemon進(jìn)程通信交互。
Docker Client: Docker是個(gè)采用的C/S架構(gòu)的應(yīng)用程序。Docker Client一般通過Docker command來發(fā)起請求。在用戶界面,支持用戶與Docker Daemon之間通信
Docker daemon :簡單地說, Docker daemon實(shí)現(xiàn)的功能就是接收客戶端發(fā)來的請求,并實(shí)現(xiàn)請求所要求的功能,同時(shí)針對(duì)請求返回相應(yīng)的結(jié)果。Docker daemon是驅(qū)動(dòng)整個(gè)Docker功能的核心引擎。在功能的實(shí)現(xiàn)上,Docker daemon涉及了容器、鏡像、存儲(chǔ)等多方面的內(nèi)容,涉及多個(gè)模塊的實(shí)現(xiàn)和交互。
Containers :容器以鏡像為基礎(chǔ),同時(shí)又為鏡像提供了一個(gè)標(biāo)準(zhǔn)和隔離的運(yùn)行環(huán)境。Docker的容器就是“軟件界的集裝箱”,可以安裝任意的軟件和庫文件,做任意的運(yùn)行環(huán)境配置。開發(fā)及運(yùn)維人員在轉(zhuǎn)移和部署應(yīng)用的時(shí)候,不需關(guān)心容器里裝了什么軟件,也不需了解它們是如何配置的。
Docker Image :與容器相對(duì)應(yīng),如果說容器提供了一個(gè)完整的、隔離的運(yùn)行環(huán)境,那么鏡像則是這個(gè)運(yùn)行環(huán)境的靜態(tài)體現(xiàn)
Registry : Registry是一個(gè)存放鏡像的倉庫。Registry本身也是一個(gè)單獨(dú)的開源項(xiàng)目企業(yè)可使用Registry鏡像搭建私有倉庫。
Docker容器通過namespace技術(shù)實(shí)現(xiàn)進(jìn)程隔離,通過cgroup技術(shù)實(shí)現(xiàn)容器進(jìn)程可用資源的限制。Docker啟動(dòng)一個(gè)容器時(shí),實(shí)際是創(chuàng)建了包含多個(gè)namespace參數(shù)的進(jìn)程。
Namespace :命名空間作用:資源隔離。 namespace將內(nèi)核的全局資源進(jìn)行封裝,使得每個(gè)namespace都有一份獨(dú)立的資源。因此不同進(jìn)程在各自namespace內(nèi)對(duì)同一種資源的使用不會(huì)相互干擾。
Namespace實(shí)際上是Linux系統(tǒng)上創(chuàng)建新進(jìn)程時(shí)的一個(gè)可選參數(shù)。實(shí)際上在創(chuàng)建Docker容器時(shí),指定了這個(gè)進(jìn)程所需要啟用的一組namespace參數(shù)。通過namespace機(jī)制的隔離,容器只能見到當(dāng)前Namespace中所限定的資源、文件、設(shè)備、狀態(tài)或配置。以此實(shí)現(xiàn)應(yīng)用運(yùn)行環(huán)境的隔離。
以交互模式啟動(dòng)一個(gè)centos容器,并在其中運(yùn)行/bin/bash程序。執(zhí)行ps命令查看到"/bin/bash"是PID=1的進(jìn)程,即Docker將其隔離于宿主機(jī)中的其他進(jìn)程之外。
Cgroups : Linux Control Groups作用:限制一個(gè)進(jìn)程組對(duì)系統(tǒng)資源的使用上限,包括CPU、內(nèi)存、Block I/O等。
┌──[root@vms81.liruilongs.github.io]-[~] └─$cd /sys/fs/cgroup ┌──[root@vms81.liruilongs.github.io]-[/sys/fs/cgroup] └─$ls blkio cpuacct cpuset freezer memory net_cls,net_prio perf_event systemd cpu cpu,cpuacct devices hugetlb net_cls net_prio pids ┌──[root@vms81.liruilongs.github.io]-[/sys/fs/cgroup] └─$
Cgroups還可以設(shè)置進(jìn)程優(yōu)先級(jí),對(duì)進(jìn)程進(jìn)行掛起和恢復(fù)等操作。
原理 :將一組進(jìn)程放在一個(gè)Cgroup中,通過給這個(gè)Cgroup分配指定的可用資源,達(dá)到控制這一組進(jìn)程可用資源的目的
實(shí)現(xiàn) :在Linux中,Cgroups以文件和目錄的方式組織在操作系統(tǒng)的/sys/fs/cgroup路徑下。該路徑中所有的資源種類均可被Cgroup限制。
┌──[root@vms81.liruilongs.github.io]-[/sys/fs/cgroup] └─$mount -t cgroup cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd) cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset) cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu) cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices) cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event) cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids) cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb) cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer) cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory) cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls) cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio) ┌──[root@vms81.liruilongs.github.io]-[/sys/fs/cgroup] └─$
對(duì)軟件開發(fā)而言,容器鏡像打通了“開發(fā) - 測試 - 部署”的流程。
鏡像是容器的模板,容器是鏡像的運(yùn)行實(shí)例,runtime根據(jù)鏡像創(chuàng)建容器
容器鏡像掛載在容器根目錄下,為容器中的應(yīng)用提供執(zhí)行環(huán)境的文件系:容器鏡像打包了整個(gè)操作系統(tǒng)的文件和目錄(rootfs),也包括應(yīng)用本身,即應(yīng)用及其運(yùn)行所需的所有依賴都被封裝在容器鏡像中。
容器鏡像采用分層結(jié)構(gòu):所有容器共享宿主機(jī)Kernel,并且不能修改宿主機(jī)Kernel ·即容器運(yùn)行過程中使用容器鏡像中的文件,使用宿主機(jī)OS上的Kermel
Build any Application:根據(jù)image format spec標(biāo)準(zhǔn),任何應(yīng)用都可以被制作成容器鏡像,
Ship any Anywhere:根據(jù)runtime spec標(biāo)準(zhǔn),容器鏡像可以傳送到任何環(huán)境中運(yùn)行。
容器鏡像只是提供了一套鏡像文件系統(tǒng)中的各種文件,而各種內(nèi)核相關(guān)的模塊或者特性支持,完全依賴于宿主機(jī)。
Docker鏡像分層結(jié)構(gòu)的實(shí)現(xiàn),借助于UnionFS聯(lián)合文件系統(tǒng)的能力.
Union File System聯(lián)合文件系統(tǒng),是實(shí)現(xiàn)Docker鏡像的技術(shù)基礎(chǔ)。它是一種輕量級(jí)的高性能分層文件系統(tǒng),支持將文件系統(tǒng)中的修改進(jìn)行提交和層層疊加。這個(gè)特性使得鏡像可通過分層實(shí)現(xiàn)和繼承。同時(shí)支持將不同目錄掛載到同一個(gè)虛擬文件系統(tǒng)下。
以O(shè)verlay2為例: Overlay2是一種堆疊文件系統(tǒng),它依賴并建立在其它的文件系統(tǒng)之上(如ext4fs、xfs等),并不直接參與磁盤空間結(jié)構(gòu)的劃分,僅將原來底層文件系統(tǒng)中不同的目錄進(jìn)行“合并”,然后向用戶呈現(xiàn),這也就是聯(lián)合掛載技術(shù)。
嗯,這里不太理解,感覺整理類似是linux中的LVM,局部類似寫時(shí)復(fù)制技術(shù),基礎(chǔ)的鏡像文件不會(huì)被修改,只是對(duì)修改進(jìn)行記錄,在寫入的時(shí)候,對(duì)鏡像文件寫入部分進(jìn)行復(fù)制,然后修改后記錄。看到的是基礎(chǔ)鏡像文件 + 寫時(shí)復(fù)制的記錄的疊加。
卷就是目錄或文件,存在于一個(gè)或多個(gè)容器中,由docker掛載到容器,但不屬于聯(lián)合文件系統(tǒng),因此能夠繞過Union File System提供一些用于持續(xù)存儲(chǔ)或共享數(shù)據(jù)的特性。
將運(yùn)用與運(yùn)行的環(huán)境打包形成容器運(yùn)行,對(duì)數(shù)據(jù)的要求希望是持久化的。
容器之間希望有可能共享數(shù)據(jù)。
卷的設(shè)計(jì)目的就是數(shù)據(jù)的持久化,完全獨(dú)立于容器的生存周期,因此Docker不會(huì)在容器刪除時(shí)刪除其掛載的數(shù)據(jù)卷。
啟動(dòng)容器的時(shí)候直接使用-v命令就可以進(jìn)行數(shù)據(jù)卷的掛載。
還可以在Dockerfile中使用VOLUME指令來給鏡像添加一個(gè)或多個(gè)數(shù)據(jù)卷,
對(duì)容器的增刪改查:
創(chuàng)建文件:新文件只能被添加在容器層中。
刪除文件:依據(jù)容器分層結(jié)構(gòu)由上往下依次查找。找到后,在容器層中記錄該刪除操作。具體刪除文件實(shí)現(xiàn)是:UnionFS會(huì)在容器層創(chuàng)建一個(gè)"whiteout"文件,將被刪除的文件“遮擋”起來。
修改文件:依據(jù)容器分層結(jié)構(gòu)由上往下依次查找。找到后,將鏡像層中的數(shù)據(jù)復(fù)制到容器層進(jìn)行修改,修改后的數(shù)據(jù)保存在容器層中(copy-on-write)。
讀取文件:依據(jù)容器分層結(jié)構(gòu)由上往下依次查找,
所有storage driver都支持鏡像分層結(jié)構(gòu)和寫時(shí)復(fù)制(CoW)策略。
Registry是存放容器鏡像的倉庫,用戶可進(jìn)行鏡像下載和訪問,分為公有和私有兩類Registry。
公有鏡像倉庫:
Docker Hub是Docker公司為公眾提供的托管Registry。
Quay.io現(xiàn)為Red Hat下的公共托管Registryo
私有鏡像倉庫:
企業(yè)可以用Docker Registry構(gòu)建私有的Registry。Registry本身是一個(gè)開源項(xiàng)目,可以用于搭建私有Registry
Docker Hub中可查看到Registry鏡像的Dockerfile。
Docker Hub是目前世界上最大的容器鏡像倉庫,由Docker公司維護(hù),并提供官方鏡像及大量用戶上傳的鏡像。
如何使用Dockerfile構(gòu)建鏡像
Dockerfile是一個(gè)文本文件,其內(nèi)包含了一條條的指令,每一條指令構(gòu)建一層,因此每一條指令的內(nèi)容,就是描述該層應(yīng)當(dāng)如何構(gòu)建。所以為了減少存儲(chǔ)占用,一般盡可能把run指令寫到一行。
Docker提供了兩種構(gòu)建鏡像的方法:docker commit命令與dockerfile構(gòu)建文件。
Dockerfile :文件指令集,描述如何自動(dòng)創(chuàng)建Docker鏡像。
Dockerfile是包含若干指令的文本文件,可以通過這些指令創(chuàng)建出docker image。
Dockerfile文件中的指令執(zhí)行后,會(huì)創(chuàng)建一個(gè)個(gè)新的鏡像層。
Dockerfile文件中的注釋以"#"開始。
Dockerfile一般由4部分組成:
基礎(chǔ)鏡像信息.
維護(hù)者信息
鏡像操作指令
容器啟動(dòng)指令
build context :為鏡像構(gòu)建提供所需的文件或目錄。
Dockerfile的指令根據(jù)作用可以分為兩種:
構(gòu)建指令:構(gòu)建指令用于構(gòu)建image,其指定的操作不會(huì)在運(yùn)行image的容器上
執(zhí)行。
設(shè)置指令:設(shè)置指令用于設(shè)置image的屬性,其指定的操作將在運(yùn)行image的容器中執(zhí)行。
Dockerfile指令使用注意事項(xiàng):
RUN等指令后運(yùn)行的必須是基礎(chǔ)image支持的命令。如基礎(chǔ)image選擇了centos,那么軟件管理部分只能使用centos的命令。
ADD指令與COPY指令的不同在于,在ADD指令中,若src是壓縮文件,則會(huì)自動(dòng)解壓到dest。
Dockerfile中若有多條CMD命令,則只執(zhí)行最后一條。
Dockerfile中若有多條ENTRYPOINT命令,則只執(zhí)行最后一條。
CMD與ENTRYPOINT的不同在于:當(dāng)Docker run command的命令匹配到CMD command時(shí),會(huì)替換CMD執(zhí)行的命令。ENTRYPOINT指令提供的命令則不容易在啟動(dòng)容器時(shí)被覆蓋。實(shí)際上,docker run命令行中指定的任何參數(shù)都會(huì)被當(dāng)做參數(shù)再次傳遞給ENTRYPOINT指令中指定的命令。
使用ENTYRPOINT
#ENTRYPOINT [ "/usr/sbin/nginx", "-g" , "daemon off;" ] ENTRYPOINT [ "usr/sbin/nginx" ] sudo docker run -it nginx -g "daemon off;"
同時(shí)使用ENTRYPOINT和CMD
ENTRYPOINT [ "/usr/sbin/nginx" ] CMD [ "-h" ] # /usr/sbin/nginx -h 顯示幫助信息
如果確實(shí)需要,用戶也可以在運(yùn)行時(shí)通過docker run的--entrypoint標(biāo)志覆蓋ENTRYPOINT指令
#基于centos鏡像 FROM centos #維護(hù)人的信息 MAINTAINER docker_user docker_user@email.com #安裝httpd軟件包 RUN yum-y update && RUN yum-y install httpd #開后80端口 EXPOSE 80 #復(fù)制網(wǎng)站首頁文件至鏡像中web站點(diǎn)下 ADD index.html /var/www/html/index.html #復(fù)制該腳本至鏡像中·并修改其權(quán)限 ADD run.sh /run.sh RUN chmod 775 /run.sh #當(dāng)后動(dòng)容器時(shí)執(zhí)行的腳本文件 CMD[/run.sh"]
容器生命周期管理
┌──[root@vms81.liruilongs.github.io]-[/] └─$systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled) Active: active (running) since 日 2022-04-03 18:43:45 CST; 18h ago Docs: https://docs.docker.com Main PID: 1120 (dockerd) Memory: 157.7M CGroup: /system.slice/docker.service └─1120 /usr/bin/dockerd --insecure-registry 192.168.26.56 -H fd:// --containerd=/run/containerd/containerd... 4月 03 18:44:51 vms81.liruilongs.github.io dockerd[1120]: time="2022-04-03T18:44:51.153876648+08:00" level=info ...ete" 4月 04 08:07:05 vms81.liruilongs.github.io dockerd[1120]: time="2022-04-04T08:07:05.336006734+08:00" level=error...ifo" 4月 04 08:07:05 vms81.liruilongs.github.io dockerd[1120]: time="2022-04-04T08:07:05.396998780+08:00" level=error...ifo" 4月 04 08:07:05 vms81.liruilongs.github.io dockerd[1120]: time="2022-04-04T08:07:05.406139699+08:00" level=error...own" 4月 04 08:07:06 vms81.liruilongs.github.io dockerd[1120]: time="2022-04-04T08:07:06.332774038+08:00" level=info ...ete" 4月 04 08:07:06 vms81.liruilongs.github.io dockerd[1120]: time="2022-04-04T08:07:06.336614138+08:00" level=error...ifo" 4月 04 08:07:06 vms81.liruilongs.github.io dockerd[1120]: time="2022-04-04T08:07:06.353399388+08:00" level=error...ifo" 4月 04 08:07:06 vms81.liruilongs.github.io dockerd[1120]: time="2022-04-04T08:07:06.384605677+08:00" level=info ...rce" 4月 04 08:07:06 vms81.liruilongs.github.io dockerd[1120]: time="2022-04-04T08:07:06.600509732+08:00" level=error...own" 4月 04 08:07:07 vms81.liruilongs.github.io dockerd[1120]: time="2022-04-04T08:07:07.067233807+08:00" level=info ...ete" Hint: Some lines were ellipsized, use -l to show in full. ┌──[root@vms81.liruilongs.github.io]-[/] └─$
容器生命周期管理命令:
docker create:創(chuàng)建一個(gè)容器;
docker start:啟動(dòng)一個(gè)容器;
docker run:創(chuàng)建并運(yùn)行一個(gè)容器;
docker pause:暫停一個(gè)容器;
docker unpause:恢復(fù)一個(gè)容器;
docker restart:重啟一個(gè)容器;
docker stop:停止一個(gè)運(yùn)行的容器;
docker rm:刪除一個(gè)處于終止?fàn)顟B(tài)的容器;
docker kill:殺死容器進(jìn)程
docker attach命令:
docker attach命令直接進(jìn)入已啟動(dòng)容器的命令終端,不會(huì)啟動(dòng)新的進(jìn)程。
Usage:docker attach [OPTIONS] CONTAINER
docker exec命令:
docker exec命令是在容器中打開新的終端。
Usage:docker exec [OPTIONS] CONTAINER COMMAND [ARG…]
使用docker inspect獲取容器/鏡像元數(shù)據(jù)。
使用docker tovp命令查看容器中運(yùn)行的進(jìn)程信息。
使用docker events從服務(wù)器獲取實(shí)時(shí)事件。
使用docker port列出指定的容器的端口映射。
docker container ls 查看容器列表
docker image ls 查看鏡像列表
【與云原生的故事】有獎(jiǎng)?wù)魑幕馃徇M(jìn)行中:https://bbs.huaweicloud.com/blogs/345260
云原生 云端實(shí)踐
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。