柚子快報激活碼778899分享:容器 docker-學習-2
柚子快報激活碼778899分享:容器 docker-學習-2
docker學習第二天
docker學習第二天1.docker和虛擬機的區(qū)別2.docker的底層隔離機制2.1 Namespaces(命名空間)2.1.1 什么是命名空間
2.2 Cgroups2.3 Union file systems2.4 Container format2.5 docker在底層如何做隔離的,如何進行資源限制的?
3. docker命令3.1 啟動MySQL 容量限制cpu使用率為50% 內存為2G,如何看是否啟用了限制?3.2 docker top3.3 思考:如何限制容器使用網(wǎng)絡帶寬資源?3.4 細講一下docker run3.5 docker rm3.6 docker rmi3.7 docker rm和rmi的區(qū)別
4. 一些小知識點4.1 kernel的作用4.2 假如我們不使用容器進程,我們想限制一個Linux操作系統(tǒng)里的進程使用多少cpu和多少內存?4.3 docker容器的三種狀態(tài)4.4 小結一下
docker學習第二天
1.docker和虛擬機的區(qū)別
2.docker的底層隔離機制
2.1 Namespaces(命名空間)
2.1.1 什么是命名空間
簡單來講:命名空間就是在內存中存放數(shù)據(jù)的空間(存放變量,函數(shù),庫等)
就相當于一塊地盤,梁山!梁山上的一草一木都是你命名的,這塊地盤歸你管理!
Namespaces是Linux內核的一個特性,它可以為進程提供一個隔離的環(huán)境,使得進程和其他進程運行在不同的“空間”中。Docker使用了以下幾種namespaces來隔離容器的運行環(huán)境:
**PID Namespace:**隔離進程ID,每個容器都有自己的進程ID空間。**NET Namespace:**隔離網(wǎng)絡接口,每個容器都有自己的網(wǎng)絡空間。**IPC Namespace:**隔離System V IPC和POSIX message queues,每個容器都有自己的IPC空間。**MNT Namespace:**隔離文件系統(tǒng)掛載點,每個容器都有自己的文件系統(tǒng)。**UTS Namespace:**隔離hostname和domainname,每個容器都有自己的hostname。**user Namespace: ** 用戶命名空間。
我們每起一個容器就是在內存中開辟一塊空間
同樣的每一個容器也代表著一個進程
2.2 Cgroups
Cgroups(control groups)是Linux內核的一個特性,它可以限制、記錄和隔離進程組所使用的物理資源,包括CPU、內存、磁盤I/O等。Docker使用cgroups來限制和控制容器對物理資源的使用。
2.3 Union file systems
Union file systems,或者叫unionfs,是一種文件系統(tǒng)服務,它可以將多個不同位置的目錄合并到一個虛擬的文件系統(tǒng)中。Docker使用unionfs來支持鏡像的層次結構,每一層都可以添加、修改或刪除文件,而不影響其他層。
2.4 Container format
Docker使用自己的容器格式來打包和運行容器。這個格式定義了容器的內容和運行時的參數(shù),包括容器使用的鏡像、網(wǎng)絡配置、環(huán)境變量等。
2.5 docker在底層如何做隔離的,如何進行資源限制的?
Namespaces和Cgroups聯(lián)系起來進行隔離和資源限制
隔離 - Namespaces
Namespaces是Linux內核的一個特性,它可以為進程提供一個隔離的環(huán)境,使得進程和其他進程運行在不同的“空間”中。Docker使用了以下幾種namespaces來隔離容器的運行環(huán)境:
PID Namespace:隔離進程ID,每個容器都有自己的進程ID空間。–>進程命名空間NET Namespace:隔離網(wǎng)絡接口,每個容器都有自己的網(wǎng)絡空間。–>網(wǎng)絡命名空間IPC Namespace:隔離System V IPC和POSIX message queues,每個容器都有自己的IPC空間。類似于管道的作用。MNT Namespace:隔離文件系統(tǒng)掛載點,每個容器都有自己的文件系統(tǒng)。UTS Namespace:隔離hostname和domainname,每個容器都有自己的hostname。和時間相關。user Namespace: 用戶命名空間。
資源限制 - Cgroups
Cgroups(control groups)是Linux內核的一個特性,它可以限制、記錄和隔離進程組所使用的物理資源,包括CPU、內存、磁盤I/O等。Docker使用cgroups來限制和控制容器對物理資源的使用。
例如,你可以設置一個容器只能使用1GB的內存和50%的CPU。當容器試圖使用更多的資源時,cgroups會阻止它并可能殺死一些進程來保持資源使用在限制之內。
舉個例子
悟空,八戒,嫦娥是不同的容器
?圖說明:不同的容器之間可以使用相同的命名空間
3. docker命令
3.1 啟動MySQL 容量限制cpu使用率為50% 內存為2G,如何看是否啟用了限制?
docker run -d --name sc-mysql-2 -p 3307:3306\
--cpus=".5" \
--memory="2g" \
-e MYSQL_ROOT_PASSWORD='sc123456' \
mysql:5.7.43
[root@docker-1 ~] docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
168628a39c9b sc-mysql-2 0.35% 205.2MiB / 2GiB 10.02% 656B / 0B 1.81MB / 583MB 27
該命令在Docker中啟動了一個名為sc-mysql-2的MySQL容器實例,并設置了相關參數(shù)來控制資源和配置,具體的參數(shù)解釋如下:
docker run: Docker的命令,用于創(chuàng)建并啟動一個新的容器。 -d: 表示容器將在后臺運行(detached mode),即容器啟動后不會占用當前的命令行界面。 --name sc-mysql-2: 設置容器的名稱為sc-mysql-2,方便后續(xù)的管理操作,如停止和刪除容器。 -p 3307:3306: 端口映射參數(shù)。將容器內部的3306端口(MySQL默認端口)映射到宿主機的3307端口。這樣,宿主機上的應用程序可以通過訪問localhost:3307來與容器內的MySQL服務器通信。 --cpus=".5": 限制容器的CPU使用率。在這里,設置為0.5意味著容器最多可以使用50%的CPU資源。如果是多核CPU,這表示容器可以使用半核的CPU時間。 --memory="2g": 限制容器可以使用的最大內存量為2GB。如果容器試圖使用超過這個限制的內存,可能會觸發(fā)OOM(Out of Memory)管理機制,導致容器內的進程被終止。 -e MYSQL_ROOT_PASSWORD='sc123456': 通過環(huán)境變量設置MySQL的root用戶密碼。MYSQL_ROOT_PASSWORD是MySQL容器初次啟動時必須設置的環(huán)境變量,用于定義root用戶的密碼。在這個例子中,密碼被設置為sc123456。 mysql:5.7.43: 指定使用的Docker鏡像,這里使用的是MySQL的官方Docker鏡像,版本是5.7.43。
綜上所述,這個命令將會在Docker中創(chuàng)建一個新的MySQL容器,該容器在后臺運行,擁有2GB的內存限制和50%的CPU使用限制,其root用戶的密碼設置為sc123456。外部可以通過宿主機的3307端口與容器內的MySQL服務進行通信。
另一種方式
[root@docker-1 ~] docker run -d --name sc-mysql-3 -p 3308:3306 --cpu-shares 500 --cpus 2 --cpuset-cpus 0,1 -m 2000000000 --device-write-bps /dev/sda:20MB -e MYSQL_ROOT_PASSWORD='sc123456' mysql:5.7.43
938d53c057a172472fdde927f25d89c709e467d19eceebe2923d31f2e2907627
這條命令在Docker中啟動了一個名為sc-mysql-3的MySQL容器實例,并配置了多個資源限制參數(shù)和環(huán)境變量。以下是該命令各個參數(shù)的詳細解釋:
docker run: Docker的命令,用于創(chuàng)建并啟動一個新的容器實例。 -d: 表示容器將在后臺運行(detached mode),即容器啟動后不會占用當前的命令行界面。 --name sc-mysql-3: 指定了新容器的名稱為sc-mysql-3。 -p 3308:3306: 將容器內部的3306端口(MySQL默認端口)映射到宿主機的3308端口。這樣,宿主機上的應用程序可以通過訪問localhost:3308來與容器內的MySQL服務器通信。 --cpu-shares 500: 設置容器的CPU共享權重為500。在同一宿主機上,CPU資源將按照容器的權重被分配,權重越高的容器在CPU資源緊張時獲得的份額越多。 --cpus 2: 限制容器可以使用的CPU核心數(shù)為2。這意味著容器可以使用兩個CPU核心的全部性能。 --cpuset-cpus 0,1: 綁定容器到特定的CPU核心,只允許容器在CPU 0和CPU 1上運行。 -m 2000000000: 限制容器可以使用的內存為2GB。這里使用字節(jié)作為單位,2000000000字節(jié)等于大約2GB。 --device-write-bps /dev/sda:20MB: 限制容器對/dev/sda設備(通常是宿主機的硬盤)的寫速度為每秒20MB。這可以防止容器占用過多的磁盤I/O資源。 -e MYSQL_ROOT_PASSWORD='sc123456': 通過環(huán)境變量設置MySQL的root用戶密碼。MYSQL_ROOT_PASSWORD是MySQL容器初次啟動時必須設置的環(huán)境變量,用于定義root用戶的密碼。在這個例子中,密碼被設置為sc123456。 mysql:5.7.43: 指定使用的Docker鏡像,這里使用的是MySQL的官方Docker鏡像,版本是5.7.43。
綜上所述,這個命令將會在Docker中創(chuàng)建一個新的MySQL容器,該容器在后臺運行,配置了CPU和內存的資源限制,并將容器的MySQL服務端口映射到宿主機的3308端口上。同時,還限制了容器對宿主機硬盤的寫速度。
[root@docker-1 ~] docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
938d53c057a1 sc-mysql-3 0.03% 205.2MiB / 1.863GiB 10.76% 656B / 0B 2.88MB / 583MB 27
3.2 docker top
查看容器內部的進程
[root@docker-1 ~] docker top sc-mysql-3
UID PID PPID C STIME TTY TIME CMD
polkitd 5529 5509 0 18:10 ? 00:00:00 mysqld
[root@docker-1 ~]#
一般容器里邊只跑一個進程
3.3 思考:如何限制容器使用網(wǎng)絡帶寬資源?
Docker本身并沒有直接提供限制容器網(wǎng)絡帶寬的選項,但是可以通過一些間接的方式來實現(xiàn)。其中一種常見的方法是使用tc(Traffic Control)工具,它是Linux內核的一部分,可以用來控制網(wǎng)絡帶寬。
然而,tc命令需要在容器啟動后執(zhí)行,而不能直接在docker run命令中設置。因此,你可能需要創(chuàng)建一個腳本來啟動容器并設置網(wǎng)絡帶寬限制。
以下是一個簡單的示例,首先啟動容器,然后使用tc命令限制容器的出口帶寬為1mbit/s:
# 啟動容器
docker run -d --name sc-mysql-3 -p 3308:3306 --cpu-shares 500 --cpus 2 --cpuset-cpus 0,1 -m 2000000000 --device-write-bps /dev/sda:20MB -e MYSQL_ROOT_PASSWORD='sc123456' mysql:5.7.43
# 獲取容器的網(wǎng)絡設備名
CONTAINER_PID=$(docker inspect -f '{{.State.Pid}}' sc-mysql-3)
NETWORK_INTERFACE=$(nsenter -t $CONTAINER_PID -n ip link | grep eth0 | awk '{print $2}' | tr -d ":")
# 限制容器的出口帶寬為1mbit/s
tc qdisc add dev $NETWORK_INTERFACE root tbf rate 1mbit burst 32kbit latency 400ms
這個腳本首先啟動了一個名為sc-mysql-3的MySQL容器,然后獲取了容器的網(wǎng)絡設備名,最后使用tc命令限制了容器的出口帶寬為1mbit/s。
需要注意的是,這只是一個基本的示例,實際使用時可能需要根據(jù)你的具體需求進行調整。另外,tc命令的使用可能需要一定的網(wǎng)絡知識,如果你不熟悉這個工具,可能需要花一些時間來學習。
3.4 細講一下docker run
docker run的流程 ?
檢查啟動容器使用的鏡像是否存在,如果不存在就先去pull鏡像到本機,如果存在就創(chuàng)建容器 docker pull 去拉mysql:5.7.43 docker create ------>創(chuàng)建容器 docker start ------>啟動容器
# 刪除鏡像
[root@localhost ~] docker rmi busybox
Untagged: busybox:latest
Untagged: busybox@sha256:5acba83a746c7608ed544dc1533b87c737a0b0fb730301639a0179f9344b1678
Deleted: sha256:beae173ccac6ad749f76713cf4440fe3d21d1043fe616dfbe30775815d1d0f6a
Deleted: sha256:01fd6df81c8ec7dd24bbbd72342671f41813f992999a3471b9d9cbc44ad88374
↑ 如果正在使用,就先停止那個容器,然后rm刪除容器,再rmi刪除鏡像
所以說,不需要 pull 創(chuàng)建之類的 ↓ 直接 用run
3.5 docker rm
rm 是刪容器的
3.6 docker rmi
rmi是刪除鏡像
一般是停止運行之后,先通過rm刪除容器,然后通過rmi刪除鏡像
3.7 docker rm和rmi的區(qū)別
docker rm 和 docker rmi 是Docker命令行工具中的兩個不同命令,分別用于刪除容器和鏡像。
docker rm
docker rm 命令用于刪除一個或多個容器。當一個容器不再需要時,你可以使用此命令來清除它。需要注意的是,只有停止狀態(tài)的容器才可以被刪除。如果要刪除正在運行的容器,需要先停止容器(使用docker stop命令),或者在使用docker rm命令時加上-f(–force)參數(shù)來強制刪除。
基本使用格式如下:
docker rm [OPTIONS] CONTAINER [CONTAINER...]
例如,刪除名為my_container的容器:
docker rm my_container
如果想要強制刪除一個正在運行的容器,可以使用:
docker rm -f my_container
docker rmi
docker rmi 命令用于刪除一個或多個Docker鏡像。當你不再需要某個鏡像,或者需要清理磁盤空間時,你可以使用這個命令。在刪除鏡像之前,需要確保沒有任何容器(無論是運行中的還是已停止的)正在使用這個鏡像。
基本使用格式如下:
docker rmi [OPTIONS] IMAGE [IMAGE...]
例如,刪除名為mysql的鏡像:
docker rmi mysql
如果一個鏡像有多個標簽,你可能需要刪除所有相關的標簽才能完全刪除該鏡像。
需要注意的是,如果其它鏡像依賴于要刪除的鏡像的層,那么這些層不會被刪除。只有當沒有任何鏡像使用這些層時,這些層才會從Docker主機上刪除。
無論是使用docker rm還是docker rmi,都應謹慎操作,確保不會誤刪正在使用或需要保留的容器或鏡像。
4. 一些小知識點
4.1 kernel的作用
Linux內核的作用是提供系統(tǒng)的核心功能,包括:
**進程管理:**調度進程、管理進程生命周期和狀態(tài)。**內存管理:**分配和回收內存、虛擬內存和交換空間的管理。**文件系統(tǒng):**管理數(shù)據(jù)存儲、文件的創(chuàng)建、刪除、讀取和寫入。**設備驅動:**提供與硬件設備通信的接口和控制。**網(wǎng)絡功能:**實現(xiàn)網(wǎng)絡協(xié)議棧,處理網(wǎng)絡通信。**安全:**提供用戶權限控制、訪問權限和安全機制。**系統(tǒng)調用和接口:**提供用戶空間程序與內核交互的接口。
4.2 假如我們不使用容器進程,我們想限制一個Linux操作系統(tǒng)里的進程使用多少cpu和多少內存?
使用cgroups技術去控制
https://pythonjishu.com/emkqvgkuoaalfkc/
操作系統(tǒng)內核里有個軟件: LXC linux container技術 docker只是調用了LXC的庫,實現(xiàn)了容器的應用
4.3 docker容器的三種狀態(tài)
Docker容器的狀態(tài)通常是通過docker ps或docker inspect命令查看的,并且確實有幾種主要狀態(tài),包括"Up"、“Exited"和"Created”。下面是對這三種狀態(tài)的詳細解釋:
Up(運行中):當容器正在運行時,使用docker ps命令查看容器列表,會顯示容器的狀態(tài)為"Up"。這表示容器內的應用程序正在活動運行。"Up"狀態(tài)后通常會跟隨容器已運行的時間,例如"Up 2 hours"表示容器已經(jīng)運行了兩小時。 Exited(已停止):當容器內的主進程已經(jīng)終止時,容器的狀態(tài)就變?yōu)?Exited"。這意味著容器已經(jīng)停止運行,不再執(zhí)行任何操作。"Exited"狀態(tài)后通常會跟隨一個退出代碼,表示容器終止時的狀態(tài),例如"Exited (0) 5 minutes ago"表示容器在5分鐘前正常退出,退出代碼為0。 Created(已創(chuàng)建):當使用docker create命令創(chuàng)建一個容器但尚未啟動它時,容器的狀態(tài)是"Created"。這意味著容器的配置已經(jīng)完成,包括文件系統(tǒng)的初始化,但是容器內的應用程序還沒有開始運行。"Created"狀態(tài)的容器需要通過docker start命令來啟動。
這些狀態(tài)幫助用戶了解容器的生命周期和當前運行情況。使用docker ps -a命令會列出所有容器,包括未運行的容器,而使用docker ps命令默認只列出處于"Up"狀態(tài)的運行中容器。
4.4 小結一下
docker run = docker pull+ docker create + docker start
docker rmi
docker top 查看容器里運行的進程,單進程思想,一個容器只跑一個進程
docker stats 查看運行的狀態(tài)
docker network 查看容器里的網(wǎng)絡
柚子快報激活碼778899分享:容器 docker-學習-2
精彩內容
本文內容根據(jù)網(wǎng)絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉載請注明,如有侵權,聯(lián)系刪除。