Kubernetes入门——深入浅出讲Docker
作者簡介:
李子昂
百度基礎架構部研發工程師
負責百度分布式Redis平臺的研發和運維
專注于基礎架構中間件的研發和優化
本文基于『云原生基礎知識概述及實踐』系列視頻課程——『Kubernetes入門—深入淺出講Docker』梳理。
視頻課程可點擊:https://cloud.baidu.com/video-center/video.html?id=606進行學習。
導讀
Kubernetes簡稱K8s,是一個開源的用于管理云平臺中多個主機上的容器化的應用,讓部署容器化的應用簡單并且高效,Kubernetes提供了應用部署、規劃、更新、維護的一種機制。
本節課作為K8s入門基礎課第一期,將介紹一種虛擬環境容器:Docker。可以說Docker是K8S的基礎,就像蓋房子的磚和水泥一樣。
課程主要分為以下三大部分:
第一部分:容器化的簡介和發展歷程——主要介紹虛擬化、容器化的概念和發展歷程,讓同學們對Docker有一個宏觀的認識。
第二部分:Docker容器的基本使用和鏡像制作——了解Docker容器的基本使用后,還會通過實踐學習到:如何啟動一個Docker鏡像,如何構建自己的Docker鏡像,如何對鏡像進行Debug。
第三部分:Docker底層核心技術——加深對Docker的理解。
01 容器化的簡介和發展歷程
1.1 虛擬化技術介紹
簡單來說,Docker是一種虛擬化技術。虛擬化技術可以分至少3種。
第一種:硬件虛擬化,這是底層的技術實現。
第二種:軟件虛擬化,比如常見的虛擬機。
第三種:就是我們今天所介紹的,容器虛擬化技術。
通俗地說,虛擬化技術就是多個人,通過一種技術協作使用一臺電腦來工作,使得每個人都覺得如同在自己的電腦上工作一樣互不干擾。
為了更好的了解這三種虛擬化技術的運行機制,我們對比一下物理機、虛擬機、Docker系統運行棧。
可以看到,無論是哪一種虛擬化技術,都是多層的。其中,藍色部分是底層實現,黃色的部分是操作系統及以上的軟件層面上的實現。層數越多,運行的開銷就會更大。
物理機的系統運行棧分析:
第一層Infrastructure:基礎架構層
第二層Host OS:操作系統層
第三層:二進制/依賴庫
第四層:應用程序
虛擬機的系統運行棧分析:
底層實現上,虛擬機比物理機多了一層Hypervisor。這是一個常用的硬件虛擬化軟件,可以把底層的操作系統抽象出多個底層的硬件接口。
而在操作系統及以上的軟件層面實現上,被分成了3個并行執行的虛擬機,而每一個并行運行的虛擬機和物理機相比,又多了一層Guest OS,也就是每個虛擬機還要運行自己的操作系統,這是和物理機的一個比較大的區別。
Docker的系統運行棧分析:
和虛擬機的結構相似,Docker也被分為了若干個“容器”。但是和虛擬機相比,少了一層。可以直觀的感受到,Docker的運行效率要比虛擬機要高。
互聯網常面臨一個場景:爆發式的流量增長。在這種情況下,效率一定是第一位的。
針對以上三種虛擬化技術,從他們的部署、運行時間上,也可以對他們的運行效率簡單對比:
物理機的部署,時間周期大概是以月為計算。包括建設機房,建設機架,部署機器,部署網絡,部署機器的操作系統等,整個的部署周期十分長。
虛擬機:在購買之后幾分鐘,1個虛擬機就能創建完了。
Docker: Docker的啟動是秒級的。
從部署、運行時間上,可以看到Docker的效率十分高。
1.2 容器化發展簡史介紹
容器化技術其實不是一個新穎的技術,早在1978年,就有對容器化的探索。下圖可以清楚的看到容器化技術的簡史:
1.3 Docker認識
集裝箱的出現改變了運輸業,Docker之于計算機行業,好比集裝箱之于運輸業。
2013年,Docker對外開源,2014年6月9日正式發布,從Docker0.1到Docker1.0 短短15個月的時間,風靡全球。2017年正式宣布擁抱K8S, 這標志著“容器管理系統之爭”結束。
Docker為什么可以廣受接納,有如下幾個優勢:
a. 持續部署與測試的一致性
Docker能夠保持容器內部所有的配置和依賴關系始終不變。你可以從開發到產品發布的整個過程中使用相同的容器來確保沒有任何差異或者人工干預。
b. 多云平臺兼容
可移植性好,可以在任何擁有Docker runtime的環境快速部署。例如AWS GCP BCE Azure aliyun都支持docker,沒有遷移的成本。
c. 環境標準化和版本控制
設想某次發布因為完成一個組件的升級而導致你整個環境都損壞了,Docker可以在幾分鐘內輕松地滾回到這個鏡像的前一個版本。
d. 隔離性
Docker可以確保你的應用程序與資源是分隔開的。例如依賴多個不同版本的tomcat的時候不會因為依賴沖突導致崩潰。同時Docker還能確保每個容器只使用分配給它的額定資源,不會因為某個進程影響其他容器。
e. 安全性
f. 由于Docker容器是隔離的,并且資源是受限制的。所以即使你其中一個應用程序被黑,也不會影響運行在其它Docker容器上的應用程序。
總結起來,Docker的優點可以概括為以下三句話:
1.一處成功,處處成功。
l橫跨開發、測試、部署環境
l也不用管是在實體機、虛擬機、還是在某個云上
2.高度集成,高度一致,使用方便
l創建和部署十分便捷,效率極高
l流水線作業,持續構建發布(CI/CD)
3.結合微服務,大大提升工程研發效率
lApp相互隔離,解耦依賴關系,方便彈性擴展
l有安全保證,接入無負擔
02 Docker容器的基本使用和鏡像操作
第一部分我們對Docker容器有一個基本的認識。這一部分,我們將通過一些實際的演練和操作,讓大家掌握Docker容器的基本使用和鏡像操作。在這一部分正式開展前,簡單“掃盲”。科普一下Docker里的常用名詞、Docker的環境安裝及Docker架構。
常用名詞
Docker 鏡像 Docker images
Docker 倉庫 Docker repository
Docker 容器 Docker containers
Docker 宿主機 Docker host
Docker 守護進程 Docker daemon
Docker 客戶端 Docker client
Docker環境安裝
Centos系統環境安裝Docker:
curl-fsSL https://get.docker.com | bash-s docker
OSX系統安裝Docker:
https://hub.docker.com/editions/community/docker-ce-desktop-mac
Windows系統安裝Docker:
https://hub.docker.com/editions/community/docker-ce-desktop-windows
目前來說,除了Linux系統可以直接運行Docker之外,其他系統都是基于虛擬機運行的。
Docker的架構:C/S模型
Client: 與Docker通信的一個組件,也就是客戶端。
Docker daemon: 相當于守護進程,也就是docker的Server,他執行的結果是Containers (容器)
Images: 鏡像。鏡像和容器之間的關系。運行起來的鏡像就是一個容器。
Registry: 倉庫。倉庫具體存放的是鏡像。
2.1 Docker核心概念和使用
Docker repository 鏡像倉庫
鏡像倉庫是集中存放管理鏡像的地方。倉庫有分為公有倉庫(DockerHub、DockerPool)和私有倉庫。有了鏡像倉庫,用戶可以用它來:
l中心化的倉庫,提供上傳/下載 鏡像的能力。
l管理倉庫中的鏡像,大多數倉庫都提供檢索和版本整理能力。
DockerHub是Docker官方提供的公共倉庫,可以檢索官方鏡像,除此之外還有很多私有的registry,例如BCE,也可以自己動手搭建自己的Docker image repository。
Docker Hub地址:https://hub.docker.com
DockerFile: 構建Docker鏡像的源代碼
Dockerfile是用于生成image的源文件,源代碼像編程一樣,有自己的語法,編譯方式,Dockerfile也有自己的語法,提供一個簡單的Dockerfile源文件地址,大家可以參考學習一下
https://github.com/docker-library/hello-world/blob/master/amd64/hello-world/Dockerfile
以下是一些例子:
-FROM 基于已有的Docker image來生成
例如:FROM tomcat:8.0
(含義:用tomcat這個鏡像的8.0版本做為我們的基礎鏡像,然后將現有的鏡像疊在該鏡像之上)
-COPY 把用戶的文件copy到image去
例如:COPY index.jsp /usr/local/tomcat/webapps/ROOT
(COPY 本機文件地址 鏡像內文件地址)
-EXPOSE 對外通過該端口提供服務
例如:EXPOSE 8080
-CMD 啟動該image應該運行的命令
例如:CMD[ “catalina.sh”, “run”]
2.2 Docker入門命令
1.入門命令1:獲得幫助
Docker help [command]獲取run命令的幫助。
2.入門命令2:鏡像操作系列命令
Docker pull [name]:[tag] 拉取/更新某image
Docer image ls 列舉當前的Docker image
Docker image rm[image ID] 刪除某image
Docker build-t [name]:[tag] [dockerfile path]
從本地路徑尋找Dockerfile構建鏡像,并打tag上
3.入門命令3:鏡像運行系列命令
Docker run-it ubuntu bash
_it:表示起一個交互終端,來run后面的命令
-d: 表示運行docker容器到后臺
Docker ps 查看運行中的容器
Docker kill [container ID]終止容器
docker run -v dor1:dir2 redis 目錄掛載
例如:docker run –v~:/ user-it Ubuntu bash 是把host的用戶home主目錄,映射為Docker實例中的/user目錄。
Tips: 關于鏡像的常見問題
1.我的拉取的鏡像究竟存到哪里了?
鏡像有Docker管理,每個系統具體路徑不一樣。
Linux系統存儲在/var/lib/docker
OSX系統存儲在:/Users/{YourUserName}/Library/Containers/com.docker.docker/Data
2.我沒有指定鏡像的tag怎么辦?
命令中沒有指定鏡像tag時會默認使用latest作為tag。避免發生預期錯誤的方法是指名tag、
3.鏡像刪除不掉怎么辦?
鏡像之間可能會相互依賴(layer),添加-f可以強制刪除。
2.3 如何Debug
1.看容器log:
Docker logs [container_id]
2.Inspect 獲取容器/鏡像的元數據。
Docker inspect [container_id]
3.在Docker實例中執行交互的shell命令。
Docker exec –it [container_id] bash
Docker exec-it[container_id]sh
2.4如何構建自己的Docker鏡像
1.前期準備:
Dockerfile內容如下
FROM tomcat:8.0
COPY index.jsp /usr/local/tomcat/webapps/ROOT
EXPOSE 8080
Index.jsp內容如下
<%< span="">
Out. Println(“Hello World, V1”);
%>
2.構建鏡像
Docker build-t mytomact:1.0
Docker run –p 8080:8080 –d mytomcat:1.0
Curl localhost:8080
Docker logs {容器 id}
2.5鏡像制作的基本操作命令總結
1.構建Docker鏡像
Cd node/docker
Docker build –t hub.baidubce.com/bootcamp/mynode:1.0.0
2.運行鏡像
Docker run-d –p 8000:8080 hub.baidubce.com/bootcamp/mynode:1.0.0
Docker ps | grep mynode
Curl localhost:8000
3.查看執行日志
Docker ps |grep mynode
Docker logs{container id}
03 Docker底層核心技術
Docker是容器虛擬化的相關技術的結合,它的三大技術支柱包括:Cgroup,Namespace, AUFS。下面簡單介紹一下者三大技術支柱
1.Cgroup
全稱:Linux Control Group ,又稱為Cgroup,是Linux Kernel的一個功能。
由Google工程師發起并貢獻。最終合入了內核代碼;
作用是限制一個進程組的資源(包括內存用量,CPU用量,磁盤IO,網絡IO,網絡優先級等)
http://man7.org/linux/man-pages/man7/cgroups.7 .html
例如:使用Cgroup限制一個進程資源的用量
Mkdir –p /sys/fs/cgroup/cpu/k8s_s1
Echo 50000>/cguop/cpu/k8s_s1/cpu.cfs_quota_us
將cpu.cfs_quota_us 設為50000
相當于cpu.cfs_period_us的100000是50%
Echo{PID}>/cgroup/cpu/foo/tasks
2.Linux Namespace
Namespace是Linux Kernel提供的一種內核級別資源隔離的方法。又稱為命名空間,它主要做訪問隔離,即同一個命名空間的多個資源(memory, CPU, network, pid)可以相互看到,但是之外的看不到。
http://man7.org/linux/man_pages/man7/namespaces.7.html
目前namespce種類有以下7種:
例如:使用Namespace隔離一個進程的資源
lSyscall. CLONE NEWPID: 隔離PID
lSyscall. CLONE_NEWNET :隔離網絡
3.AUFS
全稱:Advanced Multilayered Unification File System。一種高性能分層文件系統,是Docker image的基石。可以把多個文件掛載到同一個掛載點。只有第一層(第一個文件夾層級)是可寫的,其余層是只讀的。增加/刪除文件時都會轉換為寫操作寫入可寫層。
修改文件時,AUFS利用Cow特性來修改只讀層中的文件。不管修改數據的量的多少。在第一次修改時,文件都會被拷貝到可寫層然后再被修改。AUFS的CoW特性能夠允許在多個容器之間共享分層,從而減少物理空間占用。
例如:使用AUFS創建多重掛載點
1.Mount-t aufs –o dirs.=./fruits=tw:./vegetables=rw none./mnt
2.Echo modify>> ./mnt/tomato
以上是本期課程的全部內容。
更多精彩課程歡迎關注百度開發者中心公眾號。
總結
以上是生活随笔為你收集整理的Kubernetes入门——深入浅出讲Docker的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我见过的最糟糕代码
- 下一篇: Kubernetes入门——Kubern