溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Docker原理、架構與應用是什么

發(fā)布時間:2021-12-13 11:26:06 來源:億速云 閱讀:124 作者:iii 欄目:大數(shù)據(jù)

本篇內容主要講解“Docker原理、架構與應用是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Docker原理、架構與應用是什么”吧!

一、云計算簡介

1.Docker,通過將運行環(huán)境和應用程序打包到一起,來解決部署的環(huán)境依賴問題,真正做到跨平臺的分發(fā)和使用

2.容器由于省去了操作系統(tǒng),整個層級更簡化,可以在單臺服務器上運行更多的應用

3.ubuntu的存儲部分可以使用AUFS,而CentOS只能使用Devicemapper,前者的性能更好

二、Docker的安裝

三、使用Docker

1.容器其實就是運行在操作系統(tǒng)上的一個進程,只不過加入了對資源的隔離和限制,Docker三大核心功能:

  • CGroups:用來限定一個進程的資源使用,在一個操作系統(tǒng)之上,用戶ID、機器名等資源是全局的,運行的進程間都是訪問同一份資源

  • Namespace:用來劃分不同的命名空間

  • UnionFS:用來處理分層鏡像

2.鏡像就是容器中的文件系統(tǒng),還集成了一部分容器運行的參數(shù),可以將鏡像看作容器的模板

3.一些命令:

  • docker info:查看運行狀態(tài)及版本信息,是整個Docker Daemon守護進程運行狀況的縮影,包括容器個數(shù)、鏡像個數(shù)、Daemon版本、使用的存儲驅動等信息

  • docker pull:拉取鏡像

  • docker run -i -t ubuntu /bin/bash:-i表示啟動一個可交互的容器,-t表示使用pseudo-TTY,關聯(lián)到容器的stdin和stdout,ubuntu是運行的鏡像,/bin/bash表示啟動容器時要運行的命令,如果要退出交互模式且不影響容器運行,使用【Ctrl+PQ】

  • 運行長時間容器:-d讓容器在后臺運行,docker logs <容器id>查看容器的日志(其實就是查看容器的標準輸出日志)

  • docker ps:查看容器,-a查看所有容器

四、Docker深入解析

A.Docker的架構

1.Docker Daemon:運行在一個主機上,用戶并不是直接同Docker Daemon進行交互,而是通過Docker Client

2.Docker Client:是主要的用戶訪問Docker的渠道,用戶通過它對Docker Daemon進行訪問控制

3.Docker Image:是一個只讀的模板

4.Docker Registry:是存放Image的倉庫,可以使用公有的和私有的Registry來進行上載和下載

5.Docker Containers:Docker容器就像一個文件夾,一個容器包含了應用程序所需的所有環(huán)境,每個容器都源于一個Image,容器可以運行、開始、停止、移動并刪除,每個容器都是隔離的、安全的應用

B.Docker如何工作

1.Docker Image是只讀模板,隨容器一起啟動,每個鏡像包含多個層,使用的是Union File System來將這些層組合成一個鏡像,Union FS可以將文件和目錄進行透明的層疊組裝,形成一個單獨的文件系統(tǒng),每個鏡像都來源于一個基礎鏡像

2.一個容器由操作系統(tǒng)、用戶文件和元數(shù)據(jù)構成,運行時,容器會在Union FS的頂層增加文件層

3.Docker使用的Namespace:PID Namespace、NET Namesapce、IPC Namesapce、MNT Namespace、UTS Namespace;使用的Union FS包括AUFS、Btrfs、VFS、DevicemapperFS等

4.-p 主機端口:容器端口

5.進入鏡像:docker exec -it 容器id /bin/bash

6.docker commit 容器id 新名字,保存鏡像以及一切改動

C.鏡像制作

1.獲取鏡像的三種方式:

  • 拉取鏡像:docker pull

  • 把容器轉換成鏡像:docker commit

  • 制作鏡像:通過Dockerfile生成鏡像

2.查找DockerHub鏡像:docker search

3.push鏡像,首先先tag鏡像,docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME]NAME[:TAG]

4.根據(jù)Dockerfile編譯鏡像:在Dockerfile文件所在目錄docker build .

5.刪除鏡像:docker rmi

D.docker run 命令

1.語法格式:docker run [OPTIONS] IMAGE[:TAG!@DIGEST][COMMAND][ARG…]

2.前后臺運行:后臺-d,前臺-i -t,后臺運行后再次進入容器,可以使用docker attach <cid>,退出時使用【ctrl+pq】

3.容器的標識:—name,Image[:tag],Image[@digest]

4.PID設置:—pid=host,可以在容器里面共享主機的PID Namespace

5.IPC設置:—pic是進程間通信的支持,可以和主機共享

五、容器的網(wǎng)絡

A.容器自帶網(wǎng)絡

1.通過docker network ls來查看,包括bridge、host 、none

B.網(wǎng)絡詳情

1.通過docker network inspect <net>來查看本機的網(wǎng)絡信息

2.當啟動一個容器時,都會在全局注冊相關的網(wǎng)絡信息

C.用戶自定義網(wǎng)絡

1.包括三種:橋接網(wǎng)絡、Overlay網(wǎng)絡、插件網(wǎng)絡

2.橋接網(wǎng)絡:

  • 系統(tǒng)默認的橋接是docker0

  • 使用docker network create —driver bridge mynet創(chuàng)建mynet橋接網(wǎng)絡

  • 通過—net屬性將容器掛接到mynet中

  • 在同一個橋接下,形成了一個私網(wǎng),相互間是可以通信的,但這僅限于在同一臺主機上

2.Overlay網(wǎng)絡:

  • Overlay是一種虛擬交接技術,主要是解決不同IP地址段之間的網(wǎng)絡通信問題,Docker使用的Overlay技術是VXLAN,是借助于libnetwork實現(xiàn)的

  • Overlay需要一個K-V服務來存儲相關的主機信息,可以使用Consul、Etcd和ZooKeeper,Consul是默認的

  • Overlay主機還必須 開放UDP/4789和TCP/UDP/7946,分別用作數(shù)據(jù)通道和控制通道

六、容器的數(shù)據(jù)

A.數(shù)據(jù)卷

1.數(shù)據(jù)卷提供了一種主機和容器共享數(shù)據(jù)的方式,有些時候需要用它來做持久化和數(shù)據(jù)共享。當做持久化時,通常數(shù)據(jù)卷都會比較大,可以將其放在單獨的磁盤、卷或者陣列上,這個時候容器只是一個執(zhí)行環(huán)境。當做數(shù)據(jù)共享時,可以用于開發(fā)和測試分布式系統(tǒng),如需要用到共享盤、處理fencing等

2.創(chuàng)建數(shù)據(jù)卷:主要通過-v屬性來指定,-v [主機目錄]:[容器目錄]

3.任何時候都不要將宿主機的根目錄映射到容器內部

B.使用數(shù)據(jù)型容器

1.把容器的卷分享給另一個容器用

2.創(chuàng)建一個包含外部卷的容器,只需要create即可

3.在另一個容器中通過—volumes-from來映射

C.備份、還原和遷移數(shù)據(jù)卷

1.-v $(pwd):xxxx,$(pwd)表示當前路徑

D.容器和代碼進行關聯(lián)

1.數(shù)據(jù)卷的幾個特點:

  • 數(shù)據(jù)卷在容器創(chuàng)建時進行初始化

  • 數(shù)據(jù)卷既可以共享,也可以在容器之間重用

  • 對于數(shù)據(jù)卷的讀寫是直接下發(fā)的

  • Commit命令不會將改動保存到鏡像中

  • 即使容器被刪除了,數(shù)據(jù)卷仍然存在,因此這一塊需要特別注意,避免產生垃圾數(shù)據(jù)卷

七、鏡像倉庫

A.倉庫相關的Docker命令

1.docker login -u username -p password,登錄docker hub或第三方庫

2.docker search mysql,查找mysql相關的庫

3.docker pull mysql,拉取mysql鏡像

4.docker push [OPTIONS] [server/][user/] image name[:TAG],提交鏡像

八、鏡像和容器的存儲結構

A.鏡像、容器和存儲驅動的關系

1.每個鏡像都由多個鏡像層組成,這些鏡像層是只讀的,從下往上,以棧的方式組合在一起,組成容器的根文件系統(tǒng)

2.容器運行時,所有文件變化 的數(shù)據(jù)都保存在容器層中,如新建文件、修改文件、刪除文件

3.Docker在管理鏡像和容器時,使用寫時復制技術,寫時復制采用了共享和復制,針對相同的數(shù)據(jù),系統(tǒng)只保留一份數(shù)據(jù),所有操作都訪問這一份數(shù)據(jù)。當有操作需要修改或添加數(shù)據(jù)時,操作系統(tǒng)會把這部分數(shù)據(jù)復制到新的地方,這個操作會在新的數(shù)據(jù)區(qū)修改或添加數(shù)據(jù),其他操作仍然在舊的數(shù)據(jù)區(qū)讀取原始數(shù)據(jù)

4.docker history命令,列出鏡像的層信息

5.定時復制技術節(jié)約存儲空間,加速容器的啟動時間,

6.數(shù)據(jù)卷是宿主機上的一個文件或者目錄,啟動容器時,會把這個文件或目錄掛載到容器中。數(shù)據(jù)卷不受存儲驅動程序管理,數(shù)據(jù)卷中的數(shù)據(jù)讀寫操作會練過存儲驅動程序,直接工作在宿主機的文件系統(tǒng)中。容器中掛載 的數(shù)據(jù)卷數(shù)量沒有限制 ,多個容器也可以掛載同一個數(shù)據(jù)卷

B.如何選擇存儲驅動

1.使用哪種存儲驅動取決于用戶在宿主機上使用何種文件系統(tǒng),一些存儲驅動可以工作在不同的后端文件系統(tǒng)上,另一些存儲驅動必須使用相同的后端文件系統(tǒng)

2.—storage-driver=<name>,設置存儲驅動

3.考慮因素:沒有哪種存儲驅動能夠適用于所有場景;每種存儲驅動都在不斷升級;

4.選擇方向:穩(wěn)定性;熟悉性;成熟性;Overlay和Overlay2

C.AUFS存儲驅動

1.AUFS是一種Union FS,將不同的目錄合并成一個目錄,做成一個虛擬文件系統(tǒng)。AUFS為每個目錄設置不同權限 ,并且可以實時的添加、刪除、修改已經掛載好的目錄

D.Devicemapper存儲驅動

1.Devicemapper把鏡像和容器存儲在虛擬設備上,使用按需分配、寫時復制快照技術管理鏡像和容器,對塊設備進行操作,而不是整個文件

2.在生產環(huán)境中應該使用Devicemapper的direct-lvm模式,該模式下,Devicemapper使用真實的塊設備為存儲介質,在塊設備上建立thin pool

E.Btrfs存儲驅動

1.Btrfs是下一代存儲技術,使用了按需分配、寫時復制和快照技術管理鏡像和容器,目前還處于開發(fā)階段,生產環(huán)境慎用

2.Btrfs把鏡像層和容器層保存在獨立的子卷或快照中,鏡像中的基礎層作為一個子卷保存,其他鏡像卷和容器卷都作為快照保存

F.ZFS存儲驅動

1.ZFS是下一代文件系統(tǒng),提供卷管理、快照、校驗、壓縮、消重和多地復制等功能,如果開發(fā)者沒有使用過ZFS,建議不要在生產環(huán)境使用

G.Overlay存儲驅動

1.OverlayFS是一種聯(lián)合文件系統(tǒng),Linux內核4.0及以上版本支持Overlay2存儲驅動

2.Overlay/Overlay2存儲驅動很快,比AFUS和Devicemapper都要快,在某些場景下甚至快于Btrfs

九、定制Docker Daemon

A.修改Docker Daemon的三種方式

1.三種方式:命令行修改、修改啟動項和修改配置文件,命令行時Docker Daemon運行在前端,適合調試,在生產環(huán)境中應使用另外兩種方式

B.倉庫相關配置

1.—disable-legacy-registry選項:設置不從舊版本的鏡像倉庫下載鏡像

2.—registry-mirror選項:指定鏡像倉庫,可以設置多個鏡像倉庫

3.—insecure-registry選項:設置可以從不安全的鏡像倉庫下載鏡像

C.安全相關配置

1.-p,—pidfile選項:設置Docker Daemon使用的pid文件,默認為/var/run/docker.pid

2.-H,—host選項:配置Docker Daemon監(jiān)聽的IP和端口

3.—tls,—tlscacert,—tlscert,—tlskey,—tlsverify選項:配置遠程通信的TLS通信及相關證書

D.日志相關

1.-D,—debug選項:開房調試模式

2.—log-level,—log-driver,—log-opt選項:設置日志等級、日志格式等信息

E.存儲相關配置

1.-g,—graph選項:設置Docker運行時的根目錄

2.—storage-driver選項:配置Docker Daemon的存儲驅動

3.—ostorage-opt選項:配置存儲驅動的參數(shù)

F.網(wǎng)橋相關配置

1.—big選項:設置docker0的IP和子網(wǎng)掩碼

2.—fixed-cidr,—fixed-cidr-v6選項:配置容器的IP范圍

3.—mtu選項:配置docker0的最大會轉單元長度

4.-b,—bridge選項:配置網(wǎng)橋

G.容器與外部通信

1.—ip-forward選項:會自動修改宿主機的ip_forward,默認true

2.—iptables選項:會在iptables中追加轉發(fā)規(guī)則,默認true

3.—ip,—ipv6選項:設置IP地址

H.其他網(wǎng)絡配置

1.—default-gateway、—default-gateway-v6選項:設置網(wǎng)關

I.excdriver配置

1—exec-opt選項:設置如何管理容器的CGroups,默認值為cgroupfs,可選systemd

2.—exec-root選項:設置execdriver使用的狀態(tài)文件的根目錄,默認為/var/run/docker

J.其他配置

1.—default-ulimit,設置一個用戶能夠使用的最大進程數(shù),啟動容器時為—ullimit參數(shù)

十、如何編寫Dockerfile

A.本地編譯鏡像

1.加入.dockerignore,過濾不需要的文件

2.使用指定Dockerfile文件,-f

3.-t用于打標簽

4.—no-cache,編譯時不使用緩存 

2.dockerignore文件

1.和git類似

C.Dockerfile格式

1.每條指令由指令+參數(shù)組成,中間以空格隔離,#為注釋

2.一般指令大寫,參數(shù)小寫,第一條指令必須是FROM,設置基礎鏡像

D.Dockerfile指令詳解 

1.FROM指令:設置基礎鏡像,可以設置多個基礎鏡像,兩條FROM指令之間的內容放在一個鏡像中,tag和digest是可選項,忽略tag會使用latest鏡像

2.MAINTAINER指令:設置鏡像作者

3.RUN指令:生成一個新的容器,在容器中執(zhí)行腳本,腳本正常執(zhí)行完后,Docker daemon會把該容器提交為一個中間鏡像,供后面的指令使用

4.CMD指令:設置容器的啟動集合,只能有一條CMD指令,如果寫了多條,只有最后一條生效

5.LABEL指令:設置鏡像的標簽,可以通過docker inspect查看標簽,每個標簽采用Key=Value的格式,不同標簽之前通過空格隔離。每條指令會生成一個鏡像層,一個鏡像只能有127層,因此最好使用一條LABEL指令設置完成

6.EXPOSE指令:設置鏡像暴露端口,記錄容器啟動時監(jiān)聽在哪些端口

7.ENV指令:設置鏡像中的環(huán)境變量,支持讀取環(huán)境變量的指令:ADD、COPY、ENV、EXPOSE、LABEL、USER、WORKDIR、VOLUME、STOPSIGNAL、ONBUILD

8.ADD指令:把文件復制到鏡像中,ADD <src>..<dest>,src必須在編譯目錄中,src為URL時,如果dest結尾沒有/則dest作為文件名保存在/tmp,如果有/,則dest作為存儲目錄,如果src為目錄,復制目錄內所有內容,包括文件系統(tǒng)的元數(shù)據(jù),如果scr是壓縮文件(identity,gzip,bzip2,xz)會解壓成目錄,如果src是文件則復制文件和元數(shù)據(jù),如果src使用了通配符或是一個文件列表,則dest必須以/結尾,如果dest不以/結尾則為文件名,如果dest不存在,則ADD會自動創(chuàng)建dest及缺失的上級目錄

9.COPY指令:把文件或目錄復制到鏡像中

10.ENTRYPOINT指令:設置容器的入口程序,計算器程序是容器啟動時執(zhí)行的程序,docker run命令中最后的命令將作為參數(shù)傳遞給入口程序,只有最后的ENTRYPOINT生效

11.VOLUMN指令:設置容器的掛載點

12.USER指令:設置執(zhí)行RUN、CMD和ENTRYPOINT的用戶名或UID

13.WORKDIR指令:設置RUN、CMD、ENTRYPOINT、ADD和COPY指令的工作目錄

14.ARG指令:設置編譯變量

15.ONBUILD指令:設置子鏡像的編譯鉤子指令,當從父鏡像生成子鏡像時,子鏡像編譯過程中,首先會執(zhí)行父鏡像中的ONBUILD指令

16.STOPSIGNAL指令:設置容器退出時,Docker Daemon向容器發(fā)送的信號量

E、CMD、ENTRYPOINT和RUN的區(qū)別

1.RUN指令是設置編譯鏡像時執(zhí)行的腳本和程序,鏡像編譯完成,RUN指令的生命周期結束

2.CMD叫作容器默認啟動命令,在docker run末尾添加Command即可替換掉CMD設置的啟動程序 

3.ENTRYPOINT叫做入口程序,不能被docker run末尾的Command替換,末尾的Command會被當做字符串,傳遞給ENTRYPOINT作為參數(shù),可以在docker run中加入—entrypoint替換鏡像中的入口程序

4.一些規(guī)則 :

  • 在Dockerfile中,應至少有一條CMD或ENTRYPOINT指令

  • 當使用容器作為一個程序容器時,應使用ENTRYPOINT定義入口程序

  • 在Dockerfile中,如果同時定義了ENTRYPOINT和CMD,CMD會作為參數(shù)傳遞給ENTRYPOINT

十一、Dockerfile最佳實踐

A.基本原則

1.容器的生命期是短暫的

2.使用.dockerignore

3.只安裝需要的包

4.每個容器只運行一個進程

5.減少鏡像層

6.把多個參數(shù)排在不同的行中

7.編譯緩存:Docker Daemon從基礎鏡像編譯出新的鏡像;針對ADD和COPY指令,Docker Daemon會檢查鏡像層中所有源文件的元數(shù)據(jù)和文件內容;除了ADD和COPY指令外,Docker Daemon在鏡像緩存中尋找鏡像層時,不會檢查文件

B.Dockerfile指令最佳實踐

1.RUN指令:具有可讀性,apt-get的install和update必須在一行執(zhí)行,盡量在一條指令中安裝需要的包

2.CMD指令:應盡量使用JSON格式,不要使用CMD設置ENTRYPOINT的參數(shù)

3.EVN指令:使用容器對外提供服務時,最好通過環(huán)境變量設置服務相關配置

4.ADD和COPY指令:推薦使用COPY指令,因為功能更單一,僅把編譯目錄中的文件復制到鏡像中,而ADD還會解壓文件并支持遠端復制

5.ENTRYPOINT指令:當需要把容器當作一個命令行工具使用時,最好通過ENTRYPOINT指令設置鏡像的入口程序

6.VOLUME指令:如果需要在容器中,對數(shù)據(jù)庫、配置文件、用戶上傳文件夾等文件目錄做數(shù)據(jù)持久化,可以使用VOLUME指令導出這些文件和目錄;容器會在主機的/var/lib/docker/volumes目錄中創(chuàng)建對應的目錄掛載到容器中;

7.WORKDIR指令:設置Dockerfile中其他指令的工作目錄,就使用絕對路徑

8.USER指令:如果容器中的應用程序不需要特殊權限,則可以通過USER指令把應用程序的所有者設置為非root用戶

9.ONBUILD指令:在基礎鏡像中設置鉤子指令,子鏡像會先執(zhí)行基礎鏡像的ONBUILD設置的指令

C.如何減小鏡像體積

1.避免apt/yum update

2.每條指令都會生成一個鏡像層,每個鏡像層都會占用一些磁盤空間

3.應該在一條RUN指令中,更新安裝源、安裝程序、清理緩存,這樣可以減少鏡像體積

十二、使用容器提供服務

A.使用容器提供數(shù)據(jù)庫服務

1.查看啟動mysql容器時可以添加的選項:docker run -it —rm mysql —verbose —help

2.-e EVNIRONMENT,可以配置環(huán)境變量

3.mysql相關目錄:/etc/mysql/my.cnf、/etc/mysql/conf.d/、/var/lib/mysql/

4.mongodb相關目錄:/data/db/

B.使用容器提供Web服務

1.apache相關目錄:/usr/local/apache2/htdocs/、/usr/local/apache2/conf/httpd.conf

2.gitlab/gitlab-ce(git倉庫)相關目錄:/etc/gitlab,配置文件、/var/opt/gitlab,保存git所有版本庫、/var/log/gitlab,日志

十三、建立私有鏡像倉庫

1.registry,鏡像倉庫容器,鏡像存儲目錄:/var/lib/registry,配置文件:/etc/docker/registry/config.yml

十四、Docker常見問題

1.虛擬化就是在一臺主機上運行多個相互隔離的實例,這包含兩層意思,一是相互隔離,即彼此之間沒有影響;二是實例,既可以是一個完整的操作系統(tǒng)

到此,相信大家對“Docker原理、架構與應用是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI