# docker 是如何來的?
a. linux 內核本身支持容器技術,LXC (市面上有很多基于 LXC 開發的容器管理軟件,如創建容器,查看容器,管理容器, docker 作為管理容器的一款代表工具軟件)
b. 容器的作用,
1. 創建獨立的 namespace,一個隔離的環境。
2.以及對資源進行限制,
3.以及容器是直接使用宿主機的硬件配置 (沒有像虛擬化這種資源損耗)
# docker 和容器的關系
1.docker 就是一個對容器增刪改查的一個工具
2.docker 就是基于 golang 語音開發的一款軟件
3.學習使用 docker 時要安裝 golang 環境
# linux 宿主機? centos
宿主機本身有沒有自己的 namespace?
進程
網絡
文件系統
舉例:nginx???? ---pid? 14578
?? ??? ??? ??? ---port 80
?? ??? ??? ??? network 10.0.0.22
?? ??? ??? ?? ?
進程pid->去讀取文件系統
/opt/nginx/sbin/cgifx.17
基于文件跑出來的進程
宿主機有這些的 namespace 資源是有數量,路徑限制的
因此才會有容器,虛擬機等可以實現隔離環境的作用 說白了就是創建獨立的三個 namespace
docker run centos 調用 linux 內核 LXC 容器技術? 實現了創建 centos 容器
docker run nginx -> 調用 linux 內核 LXC 容器技術? -> 實現創建容器
資源隔離?? 作用1
容器 宿主機 網橋 docker0 默認的網段? 172.16.17.0/16
所有容器都用 /opt/nginx-1.17/sbin/nginx 這個文件路徑,他們的文件路徑是不會沖突的
容器1
進程
網絡?? ??? ?172.16.17.2
文件系統?? ?/opt/nginx-1.17/sbin/nginx
容器2
進程
網絡?? ??? ?172.16.17.3
文件系統?? ?/opt/nginx-1.17/sbin/nginx
容器3
進程
網絡?? ??? ?172.16.17.4
文件系統?? ?/opt/nginx-1.17/sbin/nginx
容器4
進程
網絡?? ??? ?172.16.17.5
文件系統?? ?/opt/nginx-1.17/sbin/nginx
#
1.linux 本身支持 LXC 技術 對 linux 內核資源隔離 (提供了兩個技術:namespace 和 cgroup 技術)
2.docker 基于 golang 開發出來了,docker 的作用就是調用 LXC 技術去管理這些容器 如增刪改查
3. 運維,開發基于這些容器去部署這些應用
docker 和 LXC linux容器技術的本質關系,以及我們是如何用的 docker ,以及 docker 資源隔離本質
docker 是管理 LXC linux 容器技術的工具,docker 是用 golang 語言寫的
學習 docker 就需要安裝 golang 環境
用 docker 命令去實現 容器的增刪改查
# docker 工具
容器技術是 linux 系統支持的 名字叫 LXC 容器技術的作用是在操作系統的角度實現資源的隔離與限制,
說白了就是用 LXC 技術去創建獨立的 namespace 命名空間,去區分開進程,網絡,文件系統這樣的一個環境
我們要基于 LXC 技術去創建容器,是很費勁的,有很多其他的容器技術也是去管理 LXC 容器技術 發現他們不好,后來
Docker 公司位于舊金山,原名 dotCloud, 底層利用了 linux 容器技術 (LXC) (在操作系統中實現資源隔離與限制)。為了方便創建和管理這些容器,dotCloud 開發了一些內部工具,之后被命名為"docker".?? ?
Docker 就是這樣誕生的
Docker 對容器的管理,命令非常簡單,主要圍繞 增刪改查 四個角度 的命令去使用
增?? ?創建一個容器
刪?? ?干掉刪除容器記錄(刪除了某一個名稱空間)
改?? ?修改容器內的應用信息以及修改容器的網絡模式等,以及修改容器的名字
查?? ?查詢當前有多少容器進程
# 創建虛機需要你的 cpu 支持這個? Hypervisor 工具
Hypervisor , 一種運行基礎物理服務器和操作系統之間的中間軟件層,可允許多個操作系統和應用共享硬件,常見的 vmware的 workstation,ESXi,微軟的 Hyper-v或者思杰的 XenServer.
#? linux 內核 支持 LXC 容器技術
Container Runtime ,通過 linux 內核虛擬化能力管理多個容器。多個容器共享一套操作系統內核。因此摘掉了內核占用的空間及運行所需要的耗時,使得容器極其輕量與快速。
centos 宿主機 (發行版 + linux 內核(支持 LXC 技術)) 即通過 LXC 技術去增刪改查容器
#
LXC > Libcontainer (創建一個隔離的,獨立的 namespace,也就是容器實例)
docker 的強大在于通過操作系統層面的虛擬化實現進程隔離,因此 docker 容器進程運行后,不需要像虛擬機一樣的一個完整的操作系統。。。
紅帽官網的虛擬化文章
https://www.redhat.com/zh/topics/virtualization
https://www.redhat.com/zh/containers/whats-a-linux-container
維基百科,什么是操作系統虛擬化
https://zh.wikipedia.org/zh-cn/topics/
# 容器技術
-? Docker 最初是 DotCloud 公司在法國期間發起的一個公司內部項目,后來以 Apache 2.0 授權協議開源,代碼在 github 上維護
-? Docker 是基于 Google 公司推出的 Golang 語言開發而來的,基于 Linux 內核的 Cgroups,NameSpace,以及 Union FS 等技術,對進程進行封裝隔離,屬于操作系統層面的虛擬化技術。
-? 由于隔離的進程獨立于宿主機和其他隔離的進程,也被稱之為容器。
-? 最初的 Docker 是基于 LXC ( Linux Containers? 是一種 linux 端 操作系統 級的虛擬化技術,可以實現輕量級容器,每個容器看起來像一個獨立的操作系統,他們共享同一個物理服務器,但是互相隔離。LXC容器比傳統虛擬機更加輕便,高效,且啟動速度快) 的,后來去除 LXC 轉而使用自行開發的 Libcontainer。
-? Docker 被定義為開源的容器引擎,可以方便的對容器進行管理,例如對鏡像打包封裝,引入 Docker Registry 對鏡像統一管理。
-? 利用 Docker 可以實現開發,測試,生產環境的部署一致性,極大的減少運維成本。
舉例分析
宿主機環境
網絡
進程
文件系統等信息
基于 centos7 下載安裝 docker 工具?? ?yum install docker
docker run nginx 命令
# 容器1
基礎鏡像,發行版提供 當執行 docker run nginx 這條命令后,會自動下載 debian 系統(默認下載這個系統)
nginx 程序?? 然后nginx有自己獨立的文件系統
獨立名稱空間
文件系統?? ?/usr/bin/nginx
端口?? ??? ?80
進程?? ??? ?12334
docker 做了什么事情
1.下載鏡像
2.運行程序
3.創建整個容器去跑一個 nginx
容器本質上還是跑在 centos7 上的,因此 容器是 centos7 宿主機上的一個進程而與
在宿主機上可以用 ps ef | grep nginx 看到Nginx這個容器 id 記錄
容器的本質:就是跑在宿主機上的一個進程而與。
容器就是對 xxx 程序的封裝,提供了一個獨立運行的環境 是隔離的環境
比如跑一個 nginx 容器 其實就是對 nginx 程序的封裝
最初是 linux 基于 LXC 去管理容器 后來 docker 這家公司基于 golang 語言對底層容器技術 LXC 創建技術進行二次開發,
基于 golang 寫了一個底層容器驅動,叫 libcontainer? 能夠在宿主機上看到 containeed 進程
# docker 為什么能夠實現多環境的一致性以及快速發布
1.沒有容器的部署環境(centos + ubuntu)
- 開發一般不懂 centos(ubuntu)環境? 2年以內開發的基本不懂 linux 環境
- windows + java 寫源代碼?? 源代碼?? 是基于 windows 環境運行的
- 功能開發 調用的一些驅動都是 windows 環境的
- 你這套源碼,他運行后,要下載很多依賴,都是windods
2.測試環境?? 用 centos 或者 ubuntu
- 源碼寫完了上傳到 gitlab github 測試倉庫下載到測試環境
- 基于 源代碼 運行環境,去安裝一些依賴
- 安裝數據庫等
-保證跑起來之后,調試功能是否有BUG
發現代碼有錯,
求運維?? ?jdk 用什么命令
求開發指導環境參數如何,功能是干嘛的
3.生產環境? 運維 可以手工部署應用 jenkins
- 源碼寫完了上傳到 gitlab github 線上倉庫下載到生產環境
- 單機,
- 單點
- 數據庫 測試數據庫的假數據
# 如今的企業級虛擬機環境? 阿里云 還是私有云,說白了都是虛擬機
環境: 物理機 -> 虛擬化 -> 私有云(阿里云,ESC,機器)->yum install docker->docker run nginx 或者 docker run jenkins 從而實現?? ?nginx容器? jenkins容器
基于虛擬機,源碼,jenkins , 多環境發布?? ?問題: 慢 , 容易出錯
傳統的發布模式只提供源碼?? ?所有環境都是臨時 安裝 的
環境的部署是一個大問題
測試環境 與生產環境又不一樣
# 如何實現環境一致性
開發提供好一個部署物料 不僅有源碼,運行環境直接發給測試,直接發給運維。(運行環境+源碼)
# 沒有容器的發布時代,(基于虛擬機的模板發布)
基于vmware 模板機實現,有一個機器是專門跑 tomcat 這套臺機器提供了穩定的模板基礎,基于這臺機器,克隆出你需要的運行的測試環境,生產環境? 這樣盡量減少環境不一致的問題
虛擬機模板克隆技術是很重量級的 都是 linux 內核一套 + 發行版一套,你安裝的鏡像4-10GB左右 安裝完成之后最少20GB
# 有容器的發布時代?? ?Docker 鏡像 只有軟件運行的依賴環境,只有發行版,你的代碼是基于 centos,ubuntu,macos? 發行版+xxx依賴 所以體積很小
?
# 基于容器實現的環境一致性發布
# 容器化部署架構
LXC開源倉庫 GitHub - lxc/lxc: LXC - Linux Containers
LXC容器:概念介紹及簡單上手操作指導
1、介紹LXC(Linux Containers)是一種Linux端操作系統級的虛擬化技術,可以實現輕量級容器,每個容器看起來像一個獨立的操作系統,它們共享同一臺物理服務器,但是互相隔離。LXC容器比傳統虛擬機更加輕便、高效,且啟動速度快。LXC中創建的為非特權容器,相較于特權容器,其有更高的安全性,更小的攻擊面,同時便于管理和升級。下面介紹一下LXC的架構和基本上手操作指導。開源倉庫:https://github.com/lxc/lxc官網:https://linuxcontainers.org/lxc/
2、LXC架構宿主機(Host OS):運行LXC命令和LXC用戶空間的操作系統。LXC用戶空間(Userspace):包括LXC庫、配置文件和容器元數據等組件。LXC模板(Templates):用于創建容器的基礎鏡像。LXC命令(Commands):用于管理和操作LXC容器的命令工具。LXC庫(Library):提供容器相關的API和函數庫。LXC配置(Configs):用于配置和定制容器的參數和選項。LXC網絡腳本(Net Scripts):用于管理容器的網絡連接和配置。LXC工具(Tools):提供各種輔助工具和腳本,用于管理和維護LXC容器。LXC 容器(LXC Container):相互獨立運行的輕量容器。LXC的核心功能是利用Linux內核提供的Namespace和Cgroups等機制來實現容器的隔離和虛擬化,從而使得容器可以獨立運行和管理。同時,LXC還支持各種網絡選項和安全特性,可以根據不同的應用場景進行定制和配置。
3、檢查Linux Kernel容器的要求如下內核版本要求:Linux kernel >= 3.12依賴包要求:# to allow for capability drops
libcap
# to set a different apparmor profile for the container
libapparmor
# to set a different selinux context for the container
libselinux
# to set a seccomp policy for the container
libseccomp
# for various checksumming
libgnutls
# for the LUA binding
liblua
# for the python3 binding
python3-dev
?