?
目錄
Docker容器的使用
Docker容器關鍵技術
Namespace?
Cgroups
UnionFS
Docker容器的使用
? ? ? ? 首先直觀地了解docker如何安裝使用,并快速啟動mysql服務的,啟動時候綁定主機上的3306端口,查找mysql容器的ip,使用mysql -h containerIP 或者127.0.0.1就可以直接訪問mysql服務,暫不考慮mysql的存儲卷。
# 安裝docker的rpm包
yum install -y docker
# 啟動docker服務
systemctl start docker
# 查看image鏡像列表,現(xiàn)在沒有pull拉取任何鏡像,列表為空
docker image list
# 修改鏡像源地址為國內(nèi)
vi /etc/docker/daemon.json
{
"registry-mirrors" : [
"https://docker.mirrors.ustc.edu.cn",
"http://hub-mirror.c.163.com"]
}
# 拉取mysql的固定版本鏡像mysql:5.7.29
docker image pull mysql:5.7.29
# 查看鏡像信息
docker inspect mysql:5.7.29
# 把mysql的鏡像run跑起來,--name指定容器名,-p綁定端口映射關系,這里主機和容器的3306綁定,-e環(huán)境變量,-d是后臺運行
docker run mysql:5.7.29 --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=admin@123 -d
# 查看docker的容器進程
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
39189fab8ca8 mysql:5.7.29 "docker-entrypoint..." 44 minutes ago Up 5 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
# 查看 mysql的容器ip,知道它的ip是172.17.0.2
docker inspect 39189fab8ca8
# centos系統(tǒng)本地安裝mysql客戶端
yum install -y mysql
# 在centos中使用docker的ip或者直接主機ip+3306端口訪問mysql服務,密碼是上面的admin@123
mysql -h 172.17.0.2 -P 3306 -u root -p
mysql -h 127.0.0.1 -P 3306 -u root -p
# 允許mysql的遠程訪問
MySQL [(none)]> grant all privileges on *.* to 'root'@'%' identified by 'admin@123' with grant option;
Query OK, 0 rows affected, 1 warning (0.00 sec)
MySQL [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
Docker容器關鍵技術
?
Namespace?
????????Docker 利用 Linux 內(nèi)核的 namespace 技術來實現(xiàn)容器化。Namespace 是一種隔離機制,它將系統(tǒng)資源封裝在一個獨立的命名空間中,使得在不同的命名空間中的進程看起來像在獨立的操作系統(tǒng)實例中運行,Linux 內(nèi)核代碼中進程的數(shù)據(jù)結構和Namespace 的數(shù)據(jù)結構:
namespace的類型有多種:
PID Namespace:每個容器都有自己獨立的進程 ID (PID) 命名空間。這意味著容器內(nèi)部的進程在容器外部是不可見的,進程 ID 在容器之間是隔離的。這使得容器內(nèi)的進程可以擁有自己的進程樹。
Network Namespace:每個容器都有自己獨立的網(wǎng)絡命名空間。這意味著每個容器擁有自己的網(wǎng)絡棧,包括獨立的網(wǎng)絡接口、IP 地址、路由表和防火墻規(guī)則。這使得容器之間網(wǎng)絡隔離,可以獨立地運行和與外部網(wǎng)絡通信。
Mount Namespace:每個容器都有自己獨立的文件系統(tǒng)視圖。這意味著每個容器可以擁有自己的文件系統(tǒng)掛載點和文件樹。容器內(nèi)部對文件系統(tǒng)的修改不會影響到宿主機或其他容器。
UTS Namespace:每個容器都有自己獨立的主機名和域名。這意味著容器可以擁有自己的主機名,并且可以在網(wǎng)絡中被識別為一個獨立的實體。
IPC Namespace:每個容器都有自己獨立的進程間通信 (IPC) 命名空間。這意味著容器之間的進程無法直接進行 IPC,它們被隔離在不同的命名空間中。
Cgroups
?Docker 使用 cgroups(Control Groups)技術來實現(xiàn)對容器資源的限制和管理。cgroups 是 Linux 內(nèi)核中將一組進程組織在多個層次結構中,并為每個組提供資源隔離/優(yōu)先級和控制的技術;
CPU 資源管理:Docker 使用 cgroups 將 CPU 資源劃分為不同的組,并為每個組分配 CPU 時間片。這允許 Docker 控制容器可以使用的 CPU 資源的數(shù)量,并根據(jù)需要進行動態(tài)調(diào)整。
內(nèi)存資源管理:通過 cgroups,Docker 可以為容器分配特定的內(nèi)存限制。當容器超出分配的內(nèi)存限制時,內(nèi)核會觸發(fā) OOM(Out of Memory)機制來處理內(nèi)存不足的情況。
網(wǎng)絡帶寬管理:Docker 使用 cgroups 的網(wǎng)絡子系統(tǒng)來限制容器的網(wǎng)絡帶寬。這使得 Docker 可以控制容器可以使用的網(wǎng)絡帶寬,以防止某個容器占用過多的網(wǎng)絡資源。
塊設備 I/O 控制:通過 cgroups,Docker 可以對容器的塊設備 I/O 進行限制和控制。這允許 Docker 控制容器對磁盤讀寫的速度,以避免某個容器對存儲設備的過度使用。
UnionFS
Docker 使用 UnionFS(Union File System)技術來實現(xiàn)容器鏡像的分層和聯(lián)合掛載,它提供了靈活而高效的容器鏡像管理和文件系統(tǒng)隔離功能,能構建、分發(fā)和運行容器鏡像,同時節(jié)省存儲空間,并提供了高度的可定制性和可擴展性。
分層鏡像:Docker 使用分層鏡像的概念來構建容器。每個鏡像層都只包含對文件系統(tǒng)的增量修改,這樣可以節(jié)省存儲空間并提高鏡像的構建效率。每個鏡像層都可以看作是一個只讀的文件系統(tǒng),它們通過 UnionFS 技術聯(lián)合掛載在一起,形成一個完整的容器鏡像。
寫時復制(Copy-on-write):當容器啟動時,Docker 會為每個容器創(chuàng)建一個可寫的容器層。這個可寫層是基于鏡像層的一個副本,當容器對文件系統(tǒng)進行修改時,UnionFS 使用寫時復制技術將修改后的文件存儲在可寫層中,而不是原始鏡像層中。這樣可以避免對原始鏡像層的修改,使得容器之間可以共享相同的鏡像層。
聯(lián)合掛載:通過 UnionFS 技術,Docker 將不同的鏡像層聯(lián)合掛載到容器的文件系統(tǒng)中,形成一個統(tǒng)一的文件系統(tǒng)視圖。這使得容器可以訪問并使用鏡像層中的文件和目錄,就像它們是在容器內(nèi)部的文件一樣。聯(lián)合掛載還允許容器在運行時共享文件和目錄,提高了容器之間的效率和資源利用率。
文章來源:http://www.zghlxwxcb.cn/news/detail-654310.html
linux系統(tǒng)啟動后,首先將 rootfs 設置為 readonly, 進行一系列檢查, 然后將其切換為 “readwrite” 供用戶使用,而docker容器啟動時也是將 rootfs 以 readonly 方式加載并檢查,然而接下來利用union mount 的方式 將一個 readwrite 文件系統(tǒng)掛載在 readonly 的 rootfs 之上,?并且允許再次將下層的 FS(file system) 設定為 readonly 并且向上疊加,這樣一組 readonly 和一個 writeable 的結構構成一個 container 的運行時態(tài), 每一個 FS 被稱作一個 FS 層。文章來源地址http://www.zghlxwxcb.cn/news/detail-654310.html
到了這里,關于容器和云原生(二):Docker容器化技術的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!