(1).基本使用方法
查看所有鏡像。docker images
[root@youxi1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos httpd 65f64a254fcc 18 hours ago 346MB ghhh4512/centos httpd 565f0e4e1ef3 19 hours ago 346MB centos latest 67fa590cfc1c 3 weeks ago 202MB hub.c.163.com/library/tomcat latest 72d2be374029 2 years ago 292MB
啟動一個實例,並在實例中執行/bin/bash命令。docker run -it [鏡像] [命令],run表示運行,-i選項表示以交互模式運行容器(通常與-t選項同時使用),-t選項表示為容器分配一個偽終端,[鏡像]可以是鏡像ID也可以是[倉庫名]:[標簽名]。
[root@youxi1 ~]# docker run -it centos:latest /bin/bash [root@280414ba684e /]# exit //注意它們的容器實例名稱不同 exit [root@youxi1 ~]# docker run -it 67fa590cfc1c /bin/bash [root@5ab4fae39b65 /]# exit exit
在后台運行一個命令,模擬后台運行服務。docker run -d [鏡像] [命令] -c [待執行命令],-d選項表示后台運行容器,-c選項后跟隨待執行的命令
[root@youxi1 ~]# docker run -d centos:latest /bin/sh -c "while true;do echo hello world;sleep 1;done" f8ed8003fe20965a2d358af0f3c19b56f81b664385f2a0bbe3d643e91271eb60 //容器實例ID
從容器中讀取日志,查看輸入內容,可用於查詢docker實例在標准輸出中顯示的錯誤信息和正常信息。docker logs [容器實例ID],容器實例ID可以只截取一部分。
[root@youxi1 ~]# docker logs f8ed8003fe hello world hello world hello world hello world hello world hello world
查看正在運行的容器。docker ps
[root@youxi1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f8ed8003fe20 centos:latest "/bin/sh -c 'while t…" 3 minutes ago Up 3 minutes objective_dubinsky
停止一個容器實例。docker stop [容器實例ID]
[root@youxi1 ~]# docker stop f8ed8003fe20 f8ed8003fe20 [root@youxi1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
如果一個容器實例無法停止,那么還可以使用命令殺死該容器實例。docker kill [容器實例ID]
[root@youxi1 ~]# docker run -d centos:latest /bin/sh -c "while true;do echo hello world;sleep 1;done" 72217237c3121fba16275490344c5168530d8c0f65d3f22ec0e53c5de4ed0887 [root@youxi1 ~]# docker kill 72217237c3 72217237c3 [root@youxi1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
查看所有容器,包括退出狀態的容器。docker ps -a
[root@youxi1 ~]# docker ps -a //第一個是被kill掉的容器實例,第二個是被stop掉的容器實例 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 72217237c312 centos:latest "/bin/sh -c 'while t…" 45 seconds ago Exited (137) 31 seconds ago eager_kalam f8ed8003fe20 centos:latest "/bin/sh -c 'while t…" 11 minutes ago Exited (137) 5 minutes ago objective_dubinsky 5ab4fae39b65 67fa590cfc1c "/bin/bash" 35 minutes ago Exited (0) 35 minutes ago strange_euclid 280414ba684e centos:latest "/bin/bash" 35 minutes ago Exited (0) 35 minutes ago ecstatic_napier 92c1d60be419 centos:httpd "/bin/sh -c /usr/loc…" 18 hours ago Exited (137) 18 hours ago jovial_chebyshev 985ef7e0c4ca centos:latest "/bin/bash" 22 hours ago Exited (0) 22 hours ago sharp_kare 9a81af9b4134 centos:latest "/bin/bash" 3 days ago Exited (0) 3 days ago pensive_dijkstra 3ecc9bafd429 centos:latest "/bin/bash" 3 days ago Exited (0) 3 days ago sleepy_wilbur
還可以使用命令,使得這些實例再次啟動。docker start [容器實例ID];docker restart [容器實例ID]。
[root@youxi1 ~]# docker start 72217237c312 72217237c312 [root@youxi1 ~]# docker restart f8ed8003fe20 f8ed8003fe20 [root@youxi1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 72217237c312 centos:latest "/bin/sh -c 'while t…" 9 minutes ago Up 15 seconds eager_kalam f8ed8003fe20 centos:latest "/bin/sh -c 'while t…" 19 minutes ago Up 2 seconds objective_dubinsky
刪除容器實例。docker rm [容器實例],如果正在運行,可以停止或殺死實例再刪除,也可以加上-f選項強制刪除。
[root@youxi1 ~]# docker kill 72217237c312 72217237c312 [root@youxi1 ~]# docker rm 72217237c312 72217237c312 [root@youxi1 ~]# docker rm -f f8ed8003fe20 f8ed8003fe20 [root@youxi1 ~]# docker ps -a
//可以看到已經沒有刪除的容器實例了 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5ab4fae39b65 67fa590cfc1c "/bin/bash" 46 minutes ago Exited (0) 46 minutes ago strange_euclid 280414ba684e centos:latest "/bin/bash" 46 minutes ago Exited (0) 46 minutes ago ecstatic_napier 92c1d60be419 centos:httpd "/bin/sh -c /usr/loc…" 18 hours ago Exited (137) 18 hours ago jovial_chebyshev 985ef7e0c4ca centos:latest "/bin/bash" 22 hours ago Exited (0) 22 hours ago sharp_kare 9a81af9b4134 centos:latest "/bin/bash" 3 days ago Exited (0) 3 days ago pensive_dijkstra 3ecc9bafd429 centos:latest "/bin/bash" 3 days ago Exited (0) 3 days ago sleepy_wilbur
刪除鏡像。docker rmi [鏡像],如果存在實例(包括沉睡和停止),那么可以先刪除實例再刪除鏡像,也可以使用-f選項強制刪除。
[root@youxi1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos httpd 65f64a254fcc 19 hours ago 346MB ghhh4512/centos httpd 565f0e4e1ef3 20 hours ago 346MB centos latest 67fa590cfc1c 3 weeks ago 202MB hub.c.163.com/library/tomcat latest 72d2be374029 2 years ago 292MB [root@youxi1 ~]# docker run -it ghhh4512/centos:httpd /bin/bash [root@1b7f3ac5f4c7 /]# exit exit [root@youxi1 ~]# docker ps -a //可以看到ghhh4512/centos:httpd鏡像存在一個實例 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1b7f3ac5f4c7 ghhh4512/centos:httpd "/bin/bash" 8 seconds ago Exited (0) 5 seconds ago peaceful_elbakyan 5ab4fae39b65 67fa590cfc1c "/bin/bash" About an hour ago Exited (0) About an hour ago strange_euclid 280414ba684e centos:latest "/bin/bash" About an hour ago Exited (0) About an hour ago ecstatic_napier 92c1d60be419 centos:httpd "/bin/sh -c /usr/loc…" 19 hours ago Exited (137) 18 hours ago jovial_chebyshev 985ef7e0c4ca centos:latest "/bin/bash" 22 hours ago Exited (0) 22 hours ago sharp_kare 9a81af9b4134 centos:latest "/bin/bash" 3 days ago Exited (0) 3 days ago pensive_dijkstra 3ecc9bafd429 centos:latest "/bin/bash" 3 days ago Exited (0) 3 days ago sleepy_wilbur [root@youxi1 ~]# docker rmi ghhh4512/centos:httpd //直接刪除會報錯 Error response from daemon: conflict: unable to remove repository reference "ghhh4512/centos:httpd" (must force) - container 1b7f3ac5f4c7 is using its referenced image 565f0e4e1ef3 [root@youxi1 ~]# docker rmi -f ghhh4512/centos:httpd //強制刪除 Untagged: ghhh4512/centos:httpd Untagged: ghhh4512/centos@sha256:464ffb58cbc2334a936bea7081db41b257afb5b21dfcce6dd27863dc9b777855 Deleted: sha256:565f0e4e1ef37c6b4100bda2266bb5aabfbc74d74d571f97b7448eafba89038f Deleted: sha256:277a40438987a596dd86eb7b1d565ad733d4b809616b415d6235d242de56b89c Deleted: sha256:bea321c82f68d3c2d62daf5295078805180c56688ad7fc4e6b8b32f2dfa9b586 [root@youxi1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos httpd 65f64a254fcc 19 hours ago 346MB centos latest 67fa590cfc1c 3 weeks ago 202MB hub.c.163.com/library/tomcat latest 72d2be374029 2 years ago 292MB [root@youxi1 ~]# docker ps -a //相應的實例也被刪除 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1b7f3ac5f4c7 565f0e4e1ef3 "/bin/bash" 2 minutes ago Exited (0) 2 minutes ago peaceful_elbakyan 5ab4fae39b65 67fa590cfc1c "/bin/bash" About an hour ago Exited (0) About an hour ago strange_euclid 280414ba684e centos:latest "/bin/bash" About an hour ago Exited (0) About an hour ago ecstatic_napier 92c1d60be419 centos:httpd "/bin/sh -c /usr/loc…" 19 hours ago Exited (137) 19 hours ago jovial_chebyshev 985ef7e0c4ca centos:latest "/bin/bash" 22 hours ago Exited (0) 22 hours ago sharp_kare 9a81af9b4134 centos:latest "/bin/bash" 3 days ago Exited (0) 3 days ago pensive_dijkstra 3ecc9bafd429 centos:latest "/bin/bash" 3 days ago Exited (0) 3 days ago sleepy_wilbur
(2).容器實例的命名和重命名
容器實例的命名,就是在運行時使用--name [容器實例ID名]選項。如下:
[root@youxi1 ~]# docker run -itd --name docker1 centos:latest /bin/bash 118da4c24c2e02632449a5124f32401ed4332aaa91aece52222aca9e757fe1c5 [root@youxi1 ~]# docker run -itd centos:latest /bin/bash 14934f6eb3db8d2d80585e7ae7488418b4d360dd71547c62f4d392b1327ddcdb [root@youxi1 ~]# docker ps //可以看到兩個容器實例名稱的對比 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 14934f6eb3db centos:latest "/bin/bash" 4 seconds ago Up 3 seconds wizardly_engelbart 118da4c24c2e centos:latest "/bin/bash" 58 seconds ago Up 57 seconds docker1
容器實例的重命名。docker rename [舊的容器實例名] [新的容器實例名]。如下:
[root@youxi1 ~]# docker rename docker1 docker2 [root@youxi1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 14934f6eb3db centos:latest "/bin/bash" 3 minutes ago Up 3 minutes wizardly_engelbart 118da4c24c2e centos:latest "/bin/bash" 4 minutes ago Up 4 minutes docker2
容器實例的命名可以方便我們調用該容器實例
[root@youxi1 ~]# docker stop docker2 docker2 [root@youxi1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 14934f6eb3db centos:latest "/bin/bash" 6 minutes ago Up 6 minutes wizardly_engelbart [root@youxi1 ~]# docker kill 14934f6eb3db 14934f6eb3db
(3).創建容器實例時指定容器的主機名
指定容器實例的主機名,其實就是在啟動容器實例時使用的是-h [主機名]選項。如下:
[root@youxi1 ~]# docker run -it -h youxi centos:latest /bin/bash [root@youxi /]# hostname youxi [root@youxi /]# exit exit
(4).讓容器實例隨docker服務的啟動而啟動
讓容器實例跟隨docker服務啟動而啟動,其實就是在啟動容器實例時使用--restart=[參數]來調整重啟策略。參數可以是:no,默認策略,在容器退出時不重啟容器;no-failure,在容器正常退出時(退出狀態非0),才會重啟容器;no-failure:3,在容器非正常退出時重啟容器,最多3次;always,在容器退出時總是重啟容器;unless-stopped,在容器退出時總是重啟,但不考慮Docker守護進程啟動時就已經停止的容器。
對比always和unless-stopped,如下:
//使用always參數 [root@youxi1 ~]# docker run --restart=always -itd --name always-docker centos:latest bash d02e6e2587e9933f9535e70b94d69385c686f225afb6c59913f796124dd9a2c6 //使用unless-stopped參數 [root@youxi1 ~]# docker run --restart=unless-stopped -itd --name unless-stopped-docker centos:latest bash cfcfe9495d17585e388af27681a5f8234fbba5beca7b3a469156875ddd9ee6f2 [root@youxi1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d02e6e2587e9 centos:latest "bash" 6 seconds ago Up 4 seconds always-docker cfcfe9495d17 centos:latest "bash" 8 seconds ago Up 7 seconds unless-stopped-docker //重啟docker服務沒有差別 [root@youxi1 ~]# systemctl restart docker [root@youxi1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cfcfe9495d17 centos:latest "bash" 36 seconds ago Up 2 seconds unless-stopped-docker d02e6e2587e9 centos:latest "bash" 7 minutes ago Up 2 seconds always-docker //重啟系統沒有差別 [root@youxi1 ~]# init 6 ......//等待重啟 [root@youxi1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cfcfe9495d17 centos:latest "bash" 3 minutes ago Up 55 seconds unless-stopped-docker d02e6e2587e9 centos:latest "bash" 10 minutes ago Up 55 seconds always-docker //停止容器實例,出現了差別。unless-stopped參數的容器實例不啟動了 [root@youxi1 ~]# docker stop always-docker always-docker [root@youxi1 ~]# docker stop unless-stopped-docker unless-stopped-docker [root@youxi1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@youxi1 ~]# systemctl restart docker [root@youxi1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d02e6e2587e9 centos:latest "bash" 12 minutes ago Up 1 second always-docker [root@youxi1 ~]# init 6 [root@youxi1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d02e6e2587e9 centos:latest "bash" 32 minutes ago Up 9 minutes always-docker
更新容器實例的重啟策略。docker update --restart=[參數] [容器實例ID或名稱]
[root@youxi1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d02e6e2587e9 centos:latest "bash" 32 minutes ago Up 9 minutes always-docker [root@youxi1 ~]# docker update --restart=no always-docker always-docker [root@youxi1 ~]# systemctl restart docker [root@youxi1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
(5).docker數據映射
docker數據映射是指將物理機的本地目錄映射到容器實例中,是在運行時使用-v [物理機本地目錄]:[容器實例內部目錄]。如下:
[root@youxi1 ~]# mkdir -p /var/www/html [root@youxi1 ~]# echo aaaa > /var/www/html/a.html [root@youxi1 ~]# docker run -it -v /var/www/html:/var/www/html centos:httpd bash [root@0544477abbba /]# ls /var/www/html/ a.html
這樣做的好處是,即使docker壞了,數據還是在物理機上,不會丟失。
另外還有類似的--device [物理機設備地址]:[容器實例中的設備地址]設備對設備映射。
(6).容器資源配額控制
在最開始時就已經說過Docker通過cgroup控制容器使用的資源配額,包括CPU、內存、磁盤三大方面,基本覆蓋了常見的資源配額和使用量控制。
cgroup是Control Groups的縮寫,是Linux內核提供的一種可以限制、記錄、隔離進程組所使用的物理資源(如cpu、memory、磁盤IO等)的機制,被LXC、docker等很多項目用於實現進程資源控制。cgroup將任意進程進行分組化管理的Linux內核功能。 cgroup本身是提供將進程進行分組化管理的功能和接口基礎結構,I/O或內存的分配控制等具體的資源管理功能是通過這個功能來實現的。
進行硬件配額是為了防止在多個容器實例同時運行時,某個容器實例把所有硬件資源占滿(比如被黑的容器實例)。
1)CPU
指定容器使用的CPU份額,使用的是-c, --cpu-shares [整數]選項,這里的整數值是一個加權值(類似比列),並不是固定份額。默認docker容器實例的cpu份額值都是1024,容器實例A設定--cpu-shares 1000,容器實例B設定--cpu-shares 500,容器實例A和B的總和是超過1024的,但並沒有關系,如果兩個容器實例同時跑到極限(爭搶一個CPU資源),那么容器實例A所占的CPU份額是容器實例B的兩倍。
[root@youxi1 ~]# docker run -it --cpu-shares 512 centos:latest bash [root@5a4bda389131 /]# cat /sys/fs/cgroup/cpu/cpu.shares 512
對於多核CPU的服務器,docker還可以控制容器實例限定使用的CPU內核和內存節點,即--cpuset-cpus和--cpuset-mems,對具有NUMA拓撲(具有多CPU、多內存節點)的服務器尤其有用,可以對需要高性能計算的容器實例進行性能最優的配置。如果服務器只有一個內存節點,則--cpuset-mems的配置基本不會有明顯效果。
將進程綁定到CPU上是為了減少CPU上下文切換的開銷,節約時間。
擴展:對稱多處理器結構(SMP:Symmetric Multi-Processor) ,例:x86服務器,雙路服務器,主板上有兩個物理cpu;非一致存儲訪問結構(NUMA:Non-Uniform Memory Access), 例:IBM小型機pSeries 690;海量並行處理結構 (MPP : Massive ParallelProcessing), 例: 大型機。
[root@youxi1 ~]# docker run -it --cpuset-cpus 0-2 centos:latest bash [root@d7278351ad3d /]# taskset -cp 1 pid 1's current affinity list: 0-2
混合使用實驗(需要打開三個窗口),如下:
//第一個窗口,docker容器實例綁定CPU核心0和1,CPU份額權重設置為512 [root@youxi1 ~]# docker run -it -h docker1 --cpuset-cpus 0-1 --cpu-shares 512 centos:latest bash [root@docker1 /]# yum -y install epel-release [root@docker1 /]# yum -y install stress //安裝壓力測試工具 //第二個窗口,docker容器實例綁定CPU核心0和1,CPU份額權重設置為1024 [root@youxi1 ~]# docker run -it -h docker2 --cpuset-cpus 0-1 --cpu-shares 1024 centos:latest bash [root@docker2 /]# yum -y install epel-release [root@docker2 /]# yum -y install stress //安裝壓力測試工具 //第三個窗口 [root@youxi1 ~]# top //按下1和c,是CPU核心展開,並且下方按CPU占用排序 //首先測試,--cpu-shares選項是否會阻止容器實例占據CPU所有份額。在第一個窗口使用壓力測試名 [root@docker1 /]# stress -c 2 --verbose --timeout 20s //開始執行后立即到第三個窗口查看,可以看到Cpu0和Cpu1都達到了百分百,並且是兩個stress也達到了百分百。 top - 16:57:27 up 1:55, 3 users, load average: 2.08, 1.41, 0.68 Tasks: 193 total, 3 running, 190 sleeping, 0 stopped, 0 zombie %Cpu0 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu1 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu2 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu3 : 0.3 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 2030172 total, 677712 free, 339108 used, 1013352 buff/cache KiB Swap: 2097148 total, 2097148 free, 0 used. 1457364 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 3983 root 20 0 7308 100 0 R 100.0 0.0 0:05.83 stress -c+ 3984 root 20 0 7308 100 0 R 100.0 0.0 0:05.83 stress -c+ 775 root 20 0 21672 1300 972 S 0.3 0.1 0:02.37 /usr/sbin+ 3965 root 20 0 162104 2372 1588 R 0.3 0.1 0:00.38 top 1 root 20 0 191008 4000 2604 S 0.0 0.2 0:02.79 /usr/lib/+ //測試當兩個容器實例爭搶CPU資源時,是否是1:2的情況 //第一個窗口 [root@docker1 /]# stress -c 2 --verbose --timeout 20s //第二個窗口 [root@docker2 /]# stress -c 2 --verbose --timeout 20s //立即到第三個窗口查看,可以看到Cpu0和Cpu1都達到百分百,四個stressCPU比為2:2:1:1, //其中兩個66.8是CPU份額權重為1024的容器實例,33.2是CPU份額權重為512的容器實例。 top - 16:58:36 up 1:56, 3 users, load average: 1.14, 1.27, 0.68 Tasks: 196 total, 5 running, 191 sleeping, 0 stopped, 0 zombie %Cpu0 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu1 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu2 : 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu3 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 2030172 total, 677468 free, 339296 used, 1013408 buff/cache KiB Swap: 2097148 total, 2097148 free, 0 used. 1457124 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 3990 root 20 0 7308 96 0 R 66.8 0.0 0:02.98 stress -c+ 3991 root 20 0 7308 96 0 R 66.8 0.0 0:02.97 stress -c+ 3987 root 20 0 7308 100 0 R 33.2 0.0 0:02.60 stress -c+ 3988 root 20 0 7308 100 0 R 33.2 0.0 0:02.73 stress -c+ 3965 root 20 0 162104 2372 1588 R 0.3 0.1 0:00.64 top 1 root 20 0 191008 4000 2604 S 0.0 0.2 0:02.79 /usr/lib/+
由以上實驗可得出結論:在沒有CPU資源爭搶的情況下,CPU份額權重(--cpu-shares)並不會生效。一旦發生CPU資源爭搶的情況,將會按照CPU份額權重(--cpu-shares)分配CPU資源。
2)內存
限制容器實例使用的內存大小,使用的是-m [內存大小]選項。如下:
[root@youxi1 ~]# docker run -it -m 128M centos:latest bash [root@62108f7dab79 /]# cat /sys/fs/cgroup/memory/memory.limit_in_bytes 134217728 //128*1024*1024=134217728
3)IO
限制容器實例在設備上的讀寫速度,使用的是--device-write-bps [設備]:[限速]限制設備上的寫速度,以及--device-read-bps [設備]:[限速]限制設備上的讀速度。防止某個容器實例吃光這個磁盤的I/O資源。限速的單位可以是kb、mb或gb。
[root@youxi1 ~]# docker run -it -v /var/www/html:/var/www/html --device /dev/sda:/dev/sda --device-write-bps /dev/sda:1mb centos:latest bash //direct讀寫數據采用直接IO方式,不走緩存,直接從內存寫到硬盤上;nonblock讀寫數據采用非阻塞IOT方式,優先該命令 [root@c0ab62dc8e8b /]# time dd if=/dev/sda of=/var/www/html/out bs=1M count=50 oflag=direct,nonblock //可以看到是限制成了1M/s 50+0 records in 50+0 records out 52428800 bytes (52 MB) copied, 50.0133 s, 1.0 MB/s real 0m50.043s user 0m0.000s sys 0m0.161s
(7).擴展:stress壓力測試
語法:stress [選項]
參數:
-?, --help 顯示幫助文檔 --version 顯示版本信息 -v, --verbose 顯示詳細信息 -q, --quiet 靜默模式 -n, --dry-run 顯示已完成的指令情況 -t, --timeout N 超時時間,默認單位秒 --backoff N 等待N微秒后開始執行 -c, --cpu N 產生N個進程,每個進程反復計算隨機數的平方根,測試CPU -i, --io N 產生N個進程,每個進程反復調用sync(),sync()將內存上的內容寫入磁盤,測試磁盤 -m, --vm N 產生N個進程,每個進程反復調用內存分配malloc()和內存釋放free()函數,測試內存 --vm-bytes B 指定malloc()函數的內存字節數(默認256MB) --vm-stride B 每B個字節創建一個字節(默認4096) --vm-hang N 指定free()函數間隔時間(默認沒有,0是下限) --vm-keep 重新啟動內存而不是釋放和重新分配內存 -d, --hdd N 產生N個進程,每個進程反復調用write()/unlink()函數 --hdd-bytes B 每個硬盤寫B字節(默認1GB)
常用參數:-c, --cpu N;-i, --io N;-m, --vm N;--vm-bytes B;--vm-hang N。
(8).擴展:CPU周期控制(了解)
docker提供了--cpu-period(周期)、--cpu-quota兩個參數控制容器可以分配到的CPU時鍾周期。
--cpu-period是用來指定容器對CPU的使用要在多長時間內重新分配一次。指定周期
--cpu-quota是用來指定在這個周期內,最多可以有多少時間片段用來跑這個容器實例。指定在周期內使用的時間片
與--cpu-shares不同的是,這兩個選項分配的是一個絕對值,容器對CPU資源的使用絕對不能超過設定的值。單位為微妙(μ s),--cpu-period最小為1000微秒,最大值為1秒(10^6微秒),默認為0.1秒(100000微秒)。--cpu-quota默認值為-1,表示不做控制。
1秒=1000毫秒,1毫秒=1000微秒。