初识docker容器(优势真的巨大,比虚拟机好用多了)
目錄
- 背景:
- 一、名稱空間
- Namespaces
- Docker Engine在Linux.上使用以下名稱空間:
- 二、docker與虛擬化
- 2.1cgroups
- 2.2全虛擬、半虛擬、容器技術
- 2.3那如何區分虛擬機中的不同應用呢?
- 2.4微服務
- 2.5企業中——開發運維整體流程
- 2.6docker數據流向圖
- 2.7docker鏡像流向
- 2.8Container和VM(虛擬機)
- 2.9docker和虛擬化比有什么優勢
- docker 有哪些優勢?
- 三、Docker
- 3.1Docker的使用場景
- 3.2 Docker引擎( Docker Engine )
- 3.3 Docker的架構 ( Docker architecture )
- 3.4docker 三大組件
- 四、安裝 Docker
- 五、Docker 鏡像與容器命令管理
- 5.1 鏡像命令管理
- 5.2 容器命令管理
背景:
以linux而言,linux操作系統會有一個主進程pid=1派生出其他進程來控制不同服務
例如: pid=2 --> python pid=3–>java pid4–>php ,三個服務可能會相互影響
使用者期望將這三個不同的服務,跑在不同的運行時環境中實現相互不影響,同時不會增加服務器成本
延伸出一-》能否將這三種服務分別封裝起來一》KVM虛擬化技術,實現了一-個操作系統模擬多個操作系統/不同的運行時
環境
隨著技術發展—》虛擬化技術開銷較大( 例如:只要運行一個py腳本,想要使用虛擬化方式實現,還需要安裝一個操作系統,并不方便/合理)
延伸出容器技術
虛擬化層的抽象層(用戶層)剝離,使用docker engine
來替代(來賓操作系統去除),只要通過引擎就可以直接連接到宿主機操作系統中,極大減小了開銷
1232
2464
docker與虛擬機區別之一( 資源利用率/損耗)
###那如何實現應用A和應用B隔離
應用和應用的隔離,如何進行判斷
以操作系統維度
應用A.與應用B隔離,在操作系統中,是通過namespaces( 名稱空間、命名空間)實現的,只要實現以下6個空間隔離,才能
認為兩個應用實現了完全/完整隔離
一、名稱空間
容器隔離了6個名稱空間(namespace次元隔離-用容器化技術封裝)* * * * *
mount 文件系統,掛載點 ——》一個文件系統內,不能重復掛在一個指定目錄,例如: /mnt
user 操作進程的用戶和用戶組 .。。。。。。。。。。
pid 進程編號
uts 主機名和主機域
ipc 信號量、消息隊列,共享內存 (理解,不同的應用調用內存資源的時候應該使用不同的內存空間)
net 網絡設備、網絡協議棧、端口等
-
cgroups 管理 3.8版本
-
cgroups linux 內核態中資源管理的模塊
-
cgroups 管理一些系統資源
Namespaces
Docker使用-種稱為namespaces提供容器的隔離工作區的技術。運行容器時,Docker 會為該容器創建- -組名稱空間。這些名稱空間提供了一-層隔離。容器的每個方面都在單獨的名稱空間中運行,并且其訪問僅限于該名稱空間。
Docker Engine在Linux.上使用以下名稱空間:
該pid命名空間:進程隔離(PID:進程ID)
該net命令空間:管理網絡接口(NET:網絡)
該ipc命名空間:管理訪問IPC資源(IPC: 進程間通信)
該mnt命名空間:管理文件系統掛載點(MNT:mount)
該uts命名空間:隔離內核和版本標識符。(UTS:Unix時間共享系統)
docker 引擎 對內核版本是有要求的 (至少是3.8+)
docker 需要cgroups 的資源管理功能
最晚的一個名稱空間是3.8
使用docker有什么意義?
ECS,屬于IAAS、Docker(k8s) 屬于PAAS
IASS : 基礎設施服務
SAAS : 應用即服務
PAAS : 平臺及服務
Docker images :鏡像
Docker container:容器
Docker registry:鏡像倉庫
存儲鏡像的地方,默認在公共的Docker Hub上查找,可以搞個人倉庫
二、docker與虛擬化
2.1cgroups
Linux上的Docker引擎還依賴于另一種稱為控制組( cgroups)的技術。cgroup將應用程序限制為一組特定的資源。控制組允許Docker Engine將可用的硬件資源共享給容器,并有選擇地實施限制和約束。
例如,您可以限制特定容器可用的內存。
2.2全虛擬、半虛擬、容器技術
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-SS6HlBWQ-1641814563053)(C:\Users\趙金華\Desktop\整理復習\docker圖片\1.png)]
2.3那如何區分虛擬機中的不同應用呢?
虛擬機一般不可能只跑一個應用,因為這樣確實也太浪費資源了,我們可以想想,現在手上的電腦,可以用 Vmvare 導入幾個虛擬機,所以諸如 Cloud Foundry通過引入操作系統的 Cgroups 和 Namespace 等機制,從而來為每個應用單獨創建一個叫做「沙盒」的隔離環境,然后在這些「沙盒」中啟動應用,通過這樣的方法就讓虛擬機中應用各自互不干擾,讓其自由翱翔,至于 Cgroups 和 Namespace 的實現原理,后續我們再共同的探討
這里所謂的隔離環境就是「容器」。
2.4微服務
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ynGF9ZOG-1641814563054)(C:\Users\趙金華\Desktop\整理復習\docker圖片\2.png)]
將40G的包拆分成4組10G的包來同時進行運作,化整為零就是微服務的概念,本來需要一臺機器跑40G的包,但是微服務進行細小化,分成多個小塊,同時進行處理,極大的加快了部署的速度。
在更新的時候包的時候一般需要全部更新,這樣極度的消耗時間,而這個時候可以單獨給單拆分的模塊來進行鏡像升級,一般只有10G左右,升級時間就減少了。
2.5企業中——開發運維整體流程
①首先由開發進行代碼研發,研發好之后進行編譯、打包
PS: 打包:一般會使用maven.工具打war包或者jar包.
②打完包之后,放置對應的運行時環境中,進行試運行
PS: 這里的運行時環境指:例如tomcat ( java環境) php (php環境)等1
③中間會加.上一些測試過程,測試代碼的有效性、可用性和可執行性
④以上測試完成,運維會將這個軟件包拉過來,運行在實際生產的運行時
環境中
問題:在以上的第o點中,不同開發語言的運行時環境混淆在一起運行會有很大的隱患,以及不便
傳統中,所謂的運行時環境,例如tomcat (java環境) php ( php環境)等
容器中,所謂的運行時環境,指的試"容器”內部
在此之前,容器一》是一個運行時環境,構成容器的組件是image鏡像(一個運行時環境的模板)
2.6docker數據流向圖
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Q5c6mNTg-1641814563055)(C:\Users\趙金華\Desktop\整理復習\docker圖片\3.png)]
Docker守護程序(dockerd)偵聽Docker API請求并管理Docker對象,例如圖像,容器,網絡卷。守護程序還可以與其他守護程序通信以管理Docker服務。
Docker images:鏡像
Docker container:容器
Docker registry:鏡像倉庫65卻55lo’iuu
2.7docker鏡像流向
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-e9idnL4L-1641814563055)(C:\Users\趙金華\Desktop\整理復習\docker圖片\4.png)]
2.8Container和VM(虛擬機)
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-vQJZNElH-1641814563056)(C:\Users\趙金華\Desktop\整理復習\docker圖片\5.png)]
2.9docker和虛擬化比有什么優勢
| 啟動速度 | 秒級 | 分鐘級 |
| 運行性能 | 接近原生(直接在內核中運行) | 50%左右損失 |
| 磁盤占用 | MB | GB |
| 數量 | 成百上千 | 一般十幾臺 |
| 隔離性 | 進程級別 | 系統級別(更徹底) |
| 操作系統 | 主要支持Linux | 幾乎所有 |
| 封裝程度 | 只打包項目代碼和依賴關系,共享主機內核 | 完整的操作系統,與宿主機隔離 |
docker 有哪些優勢?
PS: (三個統一 封裝的模式image ,運行時環境container,統一的平臺engine)
和虛擬化比有什么優勢(表格中的對比)
docker和VM之前的區別,主要就是在于資源利用率和隔離性(共享內核、獨立的造作系統)
docker 把容器化技術做成了標準化平臺CAAS ( docker統一-/指定了容器化技術的標準化平臺)使用docker有什么意思?
docker 引擎統一了基礎設施環境-docker容器環境(引擎)
docker 引擎統一了程序打包(裝箱)方式-docker鏡像
docker 引擎統一了程序部署(運行)方式-docker容器
鏡像————》封裝的某個時刻的服務/應用狀態
容器————》應用跑起來的狀態(正常提供服務的狀態-運行時)
實現了一次構建、多次、多處使用
docker-ce (社區版) docker-ee(企業版)
三、Docker
3.1Docker的使用場景
K8S image鏡像+ container容器的方式
war jar——》 github gitlab 私有倉庫(代碼倉庫) 一-》 jenkins (測試)
(應用程序封裝/構建鏡像)一-》運維下載,使用容器技術進行運行/發布
打包應用程序簡單部署
可脫離底層硬件任意遷移(實現了應用的隔離,將應用拆分并進行解耦),例如:服務器從
騰訊云遷移到阿里云
持續集成和持續交付(CI/CD):開發到測試發布
部署微服務
提供PAAS產品(平臺即服務) {OpenStack的云 主機類似于阿里云的ECS,屬于IAAS、Docker (
K8S) 屬于PAAS}
docker 三要素
鏡像——》模板
容器——》基于鏡像,運行狀態/運行時狀態
倉庫——》存放鏡像模板
3.2 Docker引擎( Docker Engine )
Docker Engine 是具有以下主要組件的C/S客戶端-服務器應用程序:
server端:服務器是一種長期運行的程序,稱為守護程序進程(dockerd命令)。
CLIENT端:RESTAPI,它指定程序可以用來與守護程序進行通信并指示其操作的接口。
命令行界面(CLI) 客戶端(docker命令)。
docker run
docker start
docker rm
客戶端傳入——》通過restAPI——》進入內核中的docker-server端
——》由server端進行處理
——》通過rest API 返回給docker-client 端進行展示
3.3 Docker的架構 ( Docker architecture )
Docker使用客戶端-服務器架構。Docker 客戶端與Docker
守護進程進行對話,該守護進程完成了構建,運行和分發Docker容器的繁重工作。
Docker區別于傳統的虛擬化,不需要虛擬硬件資源,直接使用容器引擎,所以速度快
Docker Client: 客戶端/提供一個與用戶交互,展示的平臺+
管理、控制docker服務端(功能)的工具docker
Docker客戶端(docker) 是許多Docker用戶與Docker交互的主要方式。當您使用諸如之類的
命令時docker
run,客戶端會將這些命令發送到dockerd,以執行這些命令。該docker命令使用Docker
API。Docker客戶 端可以與多個守護程序通信。
Docker daemon:守護進程
Docker守護程序( dockerd)偵聽Docker
API請求并管理Docker對象,例如圖像,容器,網絡和卷。守護程序還可以與其他守護程序通信以管理Docker服務。
Docker images: 鏡像
cgroups namespace
3.4docker 三大組件
容器可以被打包成鏡像
-
Docker container: 容器
-
Docker registry:鏡像倉庫(yum倉庫)
組件:
- 鏡像:–組資源集合,包含了應用程序軟件包、應用程序相關的依賴包、運行應用程序所需要的基礎環境(泛指操作系統環境),可以理解為容器的模板
- 容器:基于鏡像的一-種運行時狀態
- 倉庫:存放image鏡像,倉庫大類: 1、公共倉庫一-》 docker hub 2、私有倉庫registry
harbor
四、安裝 Docker
#環境配置 systemctl stop firewalld && systemctl disable firewalld setenforce 0#安裝依賴包 yum -y install yum-utils device-mapper-persistemt-data lvm2#設置阿里云鏡像源 cd /etc/yum.repos.d/ yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#安裝 docker-ce 社區版(企業版叫 docker-ee,收費) yum -y install docker-ce#啟動 systemctl enable docker && systemctl start docker 12345678910111213141516 配置阿里云鏡像加速 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' {"registry-mirrors": ["https://4iv7219l.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker 12345678 網絡優化 cat >> /etc/sysctl.conf <<EOF net.ipv4.ip_forward=1 EOFsysctl -p systemctl restart network systemctl restart docker 1234567 一鍵安裝 [root@c7-1 ~]#cat docker.sh #!/bin/bash#環境配置 systemctl stop firewalld && systemctl disable firewalld setenforce 0#安裝依賴包 yum -y install yum-utils device-mapper-persistemt-data lvm2#設置阿里云鏡像源 cd /etc/yum.repos.d/ yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#安裝 docker-ce 社區版(企業版叫 docker-ee,收費) yum -y install docker-ce#配置阿里云鏡像加速(盡量使用自己的) #地址 https://help.aliyun.com/document_detail/60750.html sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' {"registry-mirrors": ["https://4iv7219l.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload#網絡優化 cat >> /etc/sysctl.conf <<EOF net.ipv4.ip_forward=1 EOFsysctl -p systemctl restart network systemctl enable docker && systemctl restart docker 1234567891011121314151617181920212223242526272829303132333435PS
docker-server 端配置文件 daemon.json
五、Docker 鏡像與容器命令管理
5.1 鏡像命令管理
PS:
- docker client 客戶端連接到了服務端(服務端是以一個守護進程的形式跑在操作系統里面的)restful api 典型的 C/S 架構
- 由 docker 服務端的守護進程從 docker hub 上下載了鏡像(PS:服務端會先檢查本地系統是否有這個鏡像)
- 服務端創建了一個新的容器,然后從拉去的這個鏡像啟動了一個容器,容器執行了腳本/可執行程序讓我們可以查看/使用
- docker 服務端把這些信息流(傳遞)返回到客戶端并展示出來(展示在終端上)
5.2 容器命令管理
容器與宿主機之間文件的復制
docker run -itd --name nginx_test nginx:latest /bin/bash#主機復制到容器 [root@tengxun-02 ~]#touch testfile [root@tengxun-02 ~]#ls testfile [root@tengxun-02 ~]#docker cp testfile nginx_test:/opt [root@tengxun-02 ~]#docker exec -it nginx_test bash root@2ca07b152329:/# cd /opt root@2ca07b152329:/opt# ls testfile#容器復制到主機 root@2ca07b152329:/opt# ls testfile root@2ca07b152329:/opt# touch haha root@2ca07b152329:/opt# ls haha testfile root@2ca07b152329:/opt# exit exit [root@tengxun-02 ~]#docker cp nginx_test:/opt/haha . [root@tengxun-02 ~]#ls haha testfile 1234567891011121314151617181920212223 進入容器沒有 systemctl 命令解決 添加 --privileged=true(指定此容器是否為特權容器),使用此參數,則不能用 attach。 > 示例: docker run -itd --name test3 --privileged=true centos /sbin/init`/sbin/init 內核啟動時主動呼叫的第一個進程`可以使用 docker inspect <容器ID> docker ps -a docker exec -it <容器ID> /bin/bash yum install httpd -y systemctl status httpd 1234567891011docker 在后臺的標準運行過程:
(1)檢查本地是否存在指定的鏡像。當鏡像不存在時,會從公有倉庫下載;
(2)利用鏡像創建并啟動一個容器;
(3)分配一個文件系統給容器,在只讀的鏡像層外面掛載一層可讀寫層;
(4)從宿主主機配置的網橋接口中橋接一個虛擬機接口到容器中;
(5)分配一個地址池中的IP地址給容器;
(6)執行用戶指定的應用程序,執行完畢后容器被終止運行。
總結
以上是生活随笔為你收集整理的初识docker容器(优势真的巨大,比虚拟机好用多了)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 6.S081 附加Lab1 用户执行系统
- 下一篇: 电气工程毕业论文题目【415个】