您好,登錄后才能下訂單哦!
本篇內容主要講解“Docker原理、架構與應用是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Docker原理、架構與應用是什么”吧!
一、云計算簡介
1.Docker,通過將運行環境和應用程序打包到一起,來解決部署的環境依賴問題,真正做到跨平臺的分發和使用
2.容器由于省去了操作系統,整個層級更簡化,可以在單臺服務器上運行更多的應用
3.ubuntu的存儲部分可以使用AUFS,而CentOS只能使用Devicemapper,前者的性能更好
二、Docker的安裝
三、使用Docker
1.容器其實就是運行在操作系統上的一個進程,只不過加入了對資源的隔離和限制,Docker三大核心功能:
CGroups:用來限定一個進程的資源使用,在一個操作系統之上,用戶ID、機器名等資源是全局的,運行的進程間都是訪問同一份資源
Namespace:用來劃分不同的命名空間
UnionFS:用來處理分層鏡像
2.鏡像就是容器中的文件系統,還集成了一部分容器運行的參數,可以將鏡像看作容器的模板
3.一些命令:
docker info:查看運行狀態及版本信息,是整個Docker Daemon守護進程運行狀況的縮影,包括容器個數、鏡像個數、Daemon版本、使用的存儲驅動等信息
docker pull:拉取鏡像
docker run -i -t ubuntu /bin/bash:-i表示啟動一個可交互的容器,-t表示使用pseudo-TTY,關聯到容器的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容器就像一個文件夾,一個容器包含了應用程序所需的所有環境,每個容器都源于一個Image,容器可以運行、開始、停止、移動并刪除,每個容器都是隔離的、安全的應用
B.Docker如何工作
1.Docker Image是只讀模板,隨容器一起啟動,每個鏡像包含多個層,使用的是Union File System來將這些層組合成一個鏡像,Union FS可以將文件和目錄進行透明的層疊組裝,形成一個單獨的文件系統,每個鏡像都來源于一個基礎鏡像
2.一個容器由操作系統、用戶文件和元數據構成,運行時,容器會在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.根據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是進程間通信的支持,可以和主機共享
五、容器的網絡
A.容器自帶網絡
1.通過docker network ls來查看,包括bridge、host 、none
B.網絡詳情
1.通過docker network inspect <net>來查看本機的網絡信息
2.當啟動一個容器時,都會在全局注冊相關的網絡信息
C.用戶自定義網絡
1.包括三種:橋接網絡、Overlay網絡、插件網絡
2.橋接網絡:
系統默認的橋接是docker0
使用docker network create —driver bridge mynet創建mynet橋接網絡
通過—net屬性將容器掛接到mynet中
在同一個橋接下,形成了一個私網,相互間是可以通信的,但這僅限于在同一臺主機上
2.Overlay網絡:
Overlay是一種虛擬交接技術,主要是解決不同IP地址段之間的網絡通信問題,Docker使用的Overlay技術是VXLAN,是借助于libnetwork實現的
Overlay需要一個K-V服務來存儲相關的主機信息,可以使用Consul、Etcd和ZooKeeper,Consul是默認的
Overlay主機還必須 開放UDP/4789和TCP/UDP/7946,分別用作數據通道和控制通道
六、容器的數據
A.數據卷
1.數據卷提供了一種主機和容器共享數據的方式,有些時候需要用它來做持久化和數據共享。當做持久化時,通常數據卷都會比較大,可以將其放在單獨的磁盤、卷或者陣列上,這個時候容器只是一個執行環境。當做數據共享時,可以用于開發和測試分布式系統,如需要用到共享盤、處理fencing等
2.創建數據卷:主要通過-v屬性來指定,-v [主機目錄]:[容器目錄]
3.任何時候都不要將宿主機的根目錄映射到容器內部
B.使用數據型容器
1.把容器的卷分享給另一個容器用
2.創建一個包含外部卷的容器,只需要create即可
3.在另一個容器中通過—volumes-from來映射
C.備份、還原和遷移數據卷
1.-v $(pwd):xxxx,$(pwd)表示當前路徑
D.容器和代碼進行關聯
1.數據卷的幾個特點:
數據卷在容器創建時進行初始化
數據卷既可以共享,也可以在容器之間重用
對于數據卷的讀寫是直接下發的
Commit命令不會將改動保存到鏡像中
即使容器被刪除了,數據卷仍然存在,因此這一塊需要特別注意,避免產生垃圾數據卷
七、鏡像倉庫
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.每個鏡像都由多個鏡像層組成,這些鏡像層是只讀的,從下往上,以棧的方式組合在一起,組成容器的根文件系統
2.容器運行時,所有文件變化 的數據都保存在容器層中,如新建文件、修改文件、刪除文件
3.Docker在管理鏡像和容器時,使用寫時復制技術,寫時復制采用了共享和復制,針對相同的數據,系統只保留一份數據,所有操作都訪問這一份數據。當有操作需要修改或添加數據時,操作系統會把這部分數據復制到新的地方,這個操作會在新的數據區修改或添加數據,其他操作仍然在舊的數據區讀取原始數據
4.docker history命令,列出鏡像的層信息
5.定時復制技術節約存儲空間,加速容器的啟動時間,
6.數據卷是宿主機上的一個文件或者目錄,啟動容器時,會把這個文件或目錄掛載到容器中。數據卷不受存儲驅動程序管理,數據卷中的數據讀寫操作會練過存儲驅動程序,直接工作在宿主機的文件系統中。容器中掛載 的數據卷數量沒有限制 ,多個容器也可以掛載同一個數據卷
B.如何選擇存儲驅動
1.使用哪種存儲驅動取決于用戶在宿主機上使用何種文件系統,一些存儲驅動可以工作在不同的后端文件系統上,另一些存儲驅動必須使用相同的后端文件系統
2.—storage-driver=<name>,設置存儲驅動
3.考慮因素:沒有哪種存儲驅動能夠適用于所有場景;每種存儲驅動都在不斷升級;
4.選擇方向:穩定性;熟悉性;成熟性;Overlay和Overlay2
C.AUFS存儲驅動
1.AUFS是一種Union FS,將不同的目錄合并成一個目錄,做成一個虛擬文件系統。AUFS為每個目錄設置不同權限 ,并且可以實時的添加、刪除、修改已經掛載好的目錄
D.Devicemapper存儲驅動
1.Devicemapper把鏡像和容器存儲在虛擬設備上,使用按需分配、寫時復制快照技術管理鏡像和容器,對塊設備進行操作,而不是整個文件
2.在生產環境中應該使用Devicemapper的direct-lvm模式,該模式下,Devicemapper使用真實的塊設備為存儲介質,在塊設備上建立thin pool
E.Btrfs存儲驅動
1.Btrfs是下一代存儲技術,使用了按需分配、寫時復制和快照技術管理鏡像和容器,目前還處于開發階段,生產環境慎用
2.Btrfs把鏡像層和容器層保存在獨立的子卷或快照中,鏡像中的基礎層作為一個子卷保存,其他鏡像卷和容器卷都作為快照保存
F.ZFS存儲驅動
1.ZFS是下一代文件系統,提供卷管理、快照、校驗、壓縮、消重和多地復制等功能,如果開發者沒有使用過ZFS,建議不要在生產環境使用
G.Overlay存儲驅動
1.OverlayFS是一種聯合文件系統,Linux內核4.0及以上版本支持Overlay2存儲驅動
2.Overlay/Overlay2存儲驅動很快,比AFUS和Devicemapper都要快,在某些場景下甚至快于Btrfs
九、定制Docker Daemon
A.修改Docker Daemon的三種方式
1.三種方式:命令行修改、修改啟動項和修改配置文件,命令行時Docker Daemon運行在前端,適合調試,在生產環境中應使用另外兩種方式
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監聽的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選項:配置存儲驅動的參數
F.網橋相關配置
1.—big選項:設置docker0的IP和子網掩碼
2.—fixed-cidr,—fixed-cidr-v6選項:配置容器的IP范圍
3.—mtu選項:配置docker0的最大會轉單元長度
4.-b,—bridge選項:配置網橋
G.容器與外部通信
1.—ip-forward選項:會自動修改宿主機的ip_forward,默認true
2.—iptables選項:會在iptables中追加轉發規則,默認true
3.—ip,—ipv6選項:設置IP地址
H.其他網絡配置
1.—default-gateway、—default-gateway-v6選項:設置網關
I.excdriver配置
1—exec-opt選項:設置如何管理容器的CGroups,默認值為cgroupfs,可選systemd
2.—exec-root選項:設置execdriver使用的狀態文件的根目錄,默認為/var/run/docker
J.其他配置
1.—default-ulimit,設置一個用戶能夠使用的最大進程數,啟動容器時為—ullimit參數
十、如何編寫Dockerfile
A.本地編譯鏡像
1.加入.dockerignore,過濾不需要的文件
2.使用指定Dockerfile文件,-f
3.-t用于打標簽
4.—no-cache,編譯時不使用緩存
2.dockerignore文件
1.和git類似
C.Dockerfile格式
1.每條指令由指令+參數組成,中間以空格隔離,#為注釋
2.一般指令大寫,參數小寫,第一條指令必須是FROM,設置基礎鏡像
D.Dockerfile指令詳解
1.FROM指令:設置基礎鏡像,可以設置多個基礎鏡像,兩條FROM指令之間的內容放在一個鏡像中,tag和digest是可選項,忽略tag會使用latest鏡像
2.MAINTAINER指令:設置鏡像作者
3.RUN指令:生成一個新的容器,在容器中執行腳本,腳本正常執行完后,Docker daemon會把該容器提交為一個中間鏡像,供后面的指令使用
4.CMD指令:設置容器的啟動集合,只能有一條CMD指令,如果寫了多條,只有最后一條生效
5.LABEL指令:設置鏡像的標簽,可以通過docker inspect查看標簽,每個標簽采用Key=Value的格式,不同標簽之前通過空格隔離。每條指令會生成一個鏡像層,一個鏡像只能有127層,因此最好使用一條LABEL指令設置完成
6.EXPOSE指令:設置鏡像暴露端口,記錄容器啟動時監聽在哪些端口
7.ENV指令:設置鏡像中的環境變量,支持讀取環境變量的指令:ADD、COPY、ENV、EXPOSE、LABEL、USER、WORKDIR、VOLUME、STOPSIGNAL、ONBUILD
8.ADD指令:把文件復制到鏡像中,ADD <src>..<dest>,src必須在編譯目錄中,src為URL時,如果dest結尾沒有/則dest作為文件名保存在/tmp,如果有/,則dest作為存儲目錄,如果src為目錄,復制目錄內所有內容,包括文件系統的元數據,如果scr是壓縮文件(identity,gzip,bzip2,xz)會解壓成目錄,如果src是文件則復制文件和元數據,如果src使用了通配符或是一個文件列表,則dest必須以/結尾,如果dest不以/結尾則為文件名,如果dest不存在,則ADD會自動創建dest及缺失的上級目錄
9.COPY指令:把文件或目錄復制到鏡像中
10.ENTRYPOINT指令:設置容器的入口程序,計算器程序是容器啟動時執行的程序,docker run命令中最后的命令將作為參數傳遞給入口程序,只有最后的ENTRYPOINT生效
11.VOLUMN指令:設置容器的掛載點
12.USER指令:設置執行RUN、CMD和ENTRYPOINT的用戶名或UID
13.WORKDIR指令:設置RUN、CMD、ENTRYPOINT、ADD和COPY指令的工作目錄
14.ARG指令:設置編譯變量
15.ONBUILD指令:設置子鏡像的編譯鉤子指令,當從父鏡像生成子鏡像時,子鏡像編譯過程中,首先會執行父鏡像中的ONBUILD指令
16.STOPSIGNAL指令:設置容器退出時,Docker Daemon向容器發送的信號量
E、CMD、ENTRYPOINT和RUN的區別
1.RUN指令是設置編譯鏡像時執行的腳本和程序,鏡像編譯完成,RUN指令的生命周期結束
2.CMD叫作容器默認啟動命令,在docker run末尾添加Command即可替換掉CMD設置的啟動程序
3.ENTRYPOINT叫做入口程序,不能被docker run末尾的Command替換,末尾的Command會被當做字符串,傳遞給ENTRYPOINT作為參數,可以在docker run中加入—entrypoint替換鏡像中的入口程序
4.一些規則 :
在Dockerfile中,應至少有一條CMD或ENTRYPOINT指令
當使用容器作為一個程序容器時,應使用ENTRYPOINT定義入口程序
在Dockerfile中,如果同時定義了ENTRYPOINT和CMD,CMD會作為參數傳遞給ENTRYPOINT
十一、Dockerfile最佳實踐
A.基本原則
1.容器的生命期是短暫的
2.使用.dockerignore
3.只安裝需要的包
4.每個容器只運行一個進程
5.減少鏡像層
6.把多個參數排在不同的行中
7.編譯緩存:Docker Daemon從基礎鏡像編譯出新的鏡像;針對ADD和COPY指令,Docker Daemon會檢查鏡像層中所有源文件的元數據和文件內容;除了ADD和COPY指令外,Docker Daemon在鏡像緩存中尋找鏡像層時,不會檢查文件
B.Dockerfile指令最佳實踐
1.RUN指令:具有可讀性,apt-get的install和update必須在一行執行,盡量在一條指令中安裝需要的包
2.CMD指令:應盡量使用JSON格式,不要使用CMD設置ENTRYPOINT的參數
3.EVN指令:使用容器對外提供服務時,最好通過環境變量設置服務相關配置
4.ADD和COPY指令:推薦使用COPY指令,因為功能更單一,僅把編譯目錄中的文件復制到鏡像中,而ADD還會解壓文件并支持遠端復制
5.ENTRYPOINT指令:當需要把容器當作一個命令行工具使用時,最好通過ENTRYPOINT指令設置鏡像的入口程序
6.VOLUME指令:如果需要在容器中,對數據庫、配置文件、用戶上傳文件夾等文件目錄做數據持久化,可以使用VOLUME指令導出這些文件和目錄;容器會在主機的/var/lib/docker/volumes目錄中創建對應的目錄掛載到容器中;
7.WORKDIR指令:設置Dockerfile中其他指令的工作目錄,就使用絕對路徑
8.USER指令:如果容器中的應用程序不需要特殊權限,則可以通過USER指令把應用程序的所有者設置為非root用戶
9.ONBUILD指令:在基礎鏡像中設置鉤子指令,子鏡像會先執行基礎鏡像的ONBUILD設置的指令
C.如何減小鏡像體積
1.避免apt/yum update
2.每條指令都會生成一個鏡像層,每個鏡像層都會占用一些磁盤空間
3.應該在一條RUN指令中,更新安裝源、安裝程序、清理緩存,這樣可以減少鏡像體積
十二、使用容器提供服務
A.使用容器提供數據庫服務
1.查看啟動mysql容器時可以添加的選項:docker run -it —rm mysql —verbose —help
2.-e EVNIRONMENT,可以配置環境變量
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.虛擬化就是在一臺主機上運行多個相互隔離的實例,這包含兩層意思,一是相互隔離,即彼此之間沒有影響;二是實例,既可以是一個完整的操作系統
到此,相信大家對“Docker原理、架構與應用是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。