第四章 Docker容器
镜像是构建容器的蓝图,Docker以镜像为模板,构建出容器,容器依赖于镜像。
1、容器运行
使用 docker run 命令可以运行容器,该命令底层其实是 docker create 与 docker start 两条命令的结合体。
打印当前日历:
[root@chenyujie ~]# docker run centos cal
March 2024
Su Mo Tu We Th Fr Sa
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
[root@chenyujie ~]#
ps 命令在docker中查看容器
[root@chenyujie ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
048a6047ca20 centos "cal" About a minute ago Exited (0) About a minute ago loving_chaum
1e39e4635f00 b27bdf5d2385 "/bin/bash" 9 days ago Exited (0) 9 days ago trusting_faraday
a33cf4f45015 centos "/bin/bash" 9 days ago Exited (0) 9 days ago competent_lewin
645d215d7bf2 centos "/bin/bash" 9 days ago Exited (0) 9 days ago angry_shamir
8dfad39c5b0d hello-world "/hello" 2 weeks ago Exited (0) 2 weeks ago optimistic_bartik
[root@chenyujie ~]#
从以上示例中可以看到,一个Docker容器以CentOS镜像为基础运行,并传了一个cal(打印当前月份日历)命令,容器正常启动并执行了cal命令。除此之外,还可以通过指定参数,启动一个bash交互终端,代码如下:
[root@chenyujie ~]# docker run -it centos /bin/bash
[root@945be7bdcfc7 /]# cal
March 2024
Su Mo Tu We Th Fr Sa
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
[root@945be7bdcfc7 /]# exit
exit
[root@chenyujie ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
945be7bdcfc7 centos "/bin/bash" About a minute ago Exited (0) 27 seconds ago serene_jones
048a6047ca20 centos "cal" 9 minutes ago Exited (0) 9 minutes ago loving_chaum
1e39e4635f00 b27bdf5d2385 "/bin/bash" 9 days ago Exited (0) 9 days ago trusting_faraday
a33cf4f45015 centos "/bin/bash" 9 days ago Exited (0) 9 days ago competent_lewin
645d215d7bf2 centos "/bin/bash" 9 days ago Exited (0) 9 days ago angry_shamir
8dfad39c5b0d hello-world "/hello" 2 weeks ago Exited (0) 2 weeks ago optimistic_bartik
[root@chenyujie ~]#
上述代码创建了一个交互式的容器,并分配了一个伪终端,使用户可以通过命令行与容器进行交互。终端对宿主机进行直接操作,宿主机通过一个虚拟终端将对Docker的指令传输给容器,这个虚拟终端就是伪终端,对容器进行直接操作。
执行 docker run 命令启动容器时,Docker会进行如下操作。
(1)检测本地是否存在指定的镜像,不存在则从默认的Docker Hub公有仓库下载。
(2)使用镜像创建(docker create)并启动(docker run)容器。
(3)分配一个文件系统,并在只读层外面挂载一个可读可写层。
(4)从宿主机配置的网桥接口中桥接一个虚拟接口到容器(后面的章节将详细介绍)。
(5)从地址池分配一个IP地址给容器。
(6)执行用户指定的命令。
(7)执行之后容器被终止(docker stop)。
docker run 参数
- -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
- -d: 后台运行容器,并返回容器ID;
- -i: 以交互模式运行容器,通常与 -t 同时使用;
- -P: 随机端口映射,容器内部端口随机映射到主机的端口
- -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
- -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
- –name=“nginx-lb”: 为容器指定一个名称;
- –dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
- –dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
- -h “mars”: 指定容器的hostname;
- -e username=“ritchie”: 设置环境变量;
- –env-file=[]: 从指定文件读入环境变量;
- –cpuset=“0-2” or --cpuset=“0,1,2”: 绑定容器到指定CPU运行;
- **-m 😗*设置容器使用内存最大值;
- –net=“bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
- –link=[]: 添加链接到另一个容器;
- –expose=[]: 开放一个端口或一组端口;
- –volume , -v: 绑定一个卷
运行一个容器并为其配置环境变量:
[root@chenyujie ~]# docker run -d -it -e key=1000 centos
f875fabe496e1e282541e4f1ba269937ebb3d1974363cd46ead71eff9bb501c6
#查看容器ID为 f875f 的容器的环境变量
[root@chenyujie ~]# docker exec -it f875f env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=f875fabe496e
TERM=xterm
key=1000
HOME=/root
[root@chenyujie ~]#
1.自动重启的容器
[root@chenyujie ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@chenyujie ~]# docker run -it centos
[root@f9b3d8530113 /]# exit
exit
[root@chenyujie ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f9b3d8530113 centos "/bin/bash" 18 seconds ago Exited (0) 12 seconds ago heuristic_goldstine
#添加--restart参数
[root@chenyujie ~]# docker run -it --restart=always centos
[root@d1a6e1e7c366 /]# exit
exit
[root@chenyujie ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d1a6e1e7c366 centos "/bin/bash" 18 seconds ago Up 1 second frosty_payne
f9b3d8530113 centos "/bin/bash" About a minute ago Exited (0) About a minute ago heuristic_goldstine
#容器ID为d1a6e的容器终止后自动重启
[root@chenyujie ~]#
2. 自定义名称的容器
[root@chenyujie ~]# docker run -d --name=text1 centos
a3b575869c3685196ce377bd74ff4e138b806cd61cddadebdb956ba3dc2994a4
[root@chenyujie ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a3b575869c36 centos "/bin/bash" 3 seconds ago Exited (0) 2 seconds ago text1
d1a6e1e7c366 centos "/bin/bash" 8 minutes ago Up 7 minutes frosty_payne
f9b3d8530113 centos "/bin/bash" 9 minutes ago Exited (0) 8 minutes ago heuristic_goldstine
[root@chenyujie ~]#
容器id为a3b575的容器 使用–name参数 创建名字为text1的容器
3.开启端口容器
创建开启一个80端口的容器
[root@chenyujie ~]# docker run -d -p 80:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete
a9edb18cadd1: Pull complete
589b7251471a: Pull complete
186b1aaa4aa6: Pull complete
b4df32aa5a72: Pull complete
a0bcbecc962e: Pull complete
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
e2c826c0d654054ecd547d71b3bec2e385a7c40b23a786d501c520863c7b2908
[root@chenyujie ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e2c826c0d654 nginx "/docker-entrypoint.…" 44 seconds ago Up 41 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp elated_murdock
a3b575869c36 centos "/bin/bash" 52 minutes ago Exited (0) 52 minutes ago text1
d1a6e1e7c366 centos "/bin/bash" About an hour ago Up 23 minutes frosty_payne
f9b3d8530113 centos "/bin/bash" About an hour ago Exited (0) About an hour ago heuristic_goldstine
访问80端口表示欢迎页(IP地址:端口号),记得关闭防火墙
使用curl工具访问容器端口
[root@chenyujie ~]# curl -I 192.168.10.136:80
HTTP/1.1 200 OK
Server: nginx/1.21.5
Date: Fri, 22 Mar 2024 10:57:52 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 28 Dec 2021 15:28:38 GMT
Connection: keep-alive
ETag: "61cb2d26-267"
Accept-Ranges: bytes
接下来容器终止,访问端口号
[root@chenyujie ~]# docker stop e2c82
e2c82
[root@chenyujie ~]# curl -I 192.168.10.136:80
curl: (7) Failed connect to 192.168.10.136:80; 拒绝连接
[root@chenyujie ~]#
说明服务是由docker容器所提供的,只是通过宿主机的端口向外网开放。
4.与宿主机共享目录的容器
目录与文件共享成功
[root@chenyujie ~]# mkdir text
#在宿主机上创建共享目录
[root@chenyujie ~]# touch /root/text/a.txt /root/text/b.txt
[root@chenyujie ~]# ls /root/text/
a.txt b.txt
[root@chenyujie ~]# docker run -it -v /root/text/:/root/text/ --privileged docker.io/nginx /bin/bash
#运行容器,并挂载共享目录,冒号前面的是宿主机目录,后面是容器目录
root@80a527f6de26:/# ls
bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var
boot docker-entrypoint.d etc lib media opt root sbin sys usr
root@80a527f6de26:/# ls /root/
.bashrc .profile text/
root@80a527f6de26:/# ls /root/text/
a.txt b.txt
root@80a527f6de26:/# exit
exit
[root@chenyujie ~]#
2、进入容器
容器的三种状态容器在宿主机中共有三种状态,分别为运行(Up)状态、暂停(Paused)状态与终止(Exited)状态。
下面通过示例来观察容器的三种状态。
1.运行状态
运行一个名为 text2- nginx 的 Nginx容器,并将容器80端口映射到宿主机80端口,示例代码如下:
[root@chenyujie ~]# docker run -d -p 80:80 --name text2-nginx docker.io/nginx
fc6665648ecf8d83db3e90ff35eb290c1a26034b0a3fdaf097b71628f8998dfe
这时,容器已经创建完成,通过ps命令查看容器是否为运行状态,示例代码如下:
[root@chenyujie ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fc6665648ecf nginx "/docker-entrypoint.…" 53 seconds ago Up 50 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp text2-nginx
从以上示例中可以看出,此时容器状态为运行状态。
2.暂停状态
下面通过命令使容器进入暂停状态。
docker pause 是暂停容器的命令接着通过命令查看容器是否成功暂停,示例代码如下:
[root@chenyujie ~]# docker pause text2-nginx
text2-nginx
[root@chenyujie ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fc6665648ecf nginx "/docker-entrypoint.…" 4 minutes ago Up 4 minutes (Paused) 0.0.0.0:80->80/tcp, :::80->80/tcp text2-nginx
[root@chenyujie ~]#
从以上示例中可以看到,容器仍是运行状态,但同时也是暂停状态。接着通过curl工具对该容器进行访问测试,示例代码如下:
[root@chenyujie ~]# curl -I 192.168.10.136
^C
通过访问测试发现,此时无法访问到容器网页,但是服务器没有拒绝连接,说明暂停容器的本质是暂停容器中的服务。
下面使用 docker unpause 命令使暂停状态的容器终止暂停状态,暂停状态已经被终止,容器只处于运行状态。
[root@chenyujie ~]# docker unpause fc666
fc666
[root@chenyujie ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fc6665648ecf nginx "/docker-entrypoint.…" 14 minutes ago Up 14 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp text2-nginx
接着用curl工具对容器进行访问测试,示例代码如下
[root@chenyujie ~]# curl -I 192.168.10.136
HTTP/1.1 200 OK
Server: nginx/1.21.5
Date: Fri, 22 Mar 2024 13:23:39 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 28 Dec 2021 15:28:38 GMT
Connection: keep-alive
ETag: "61cb2d26-267"
Accept-Ranges: bytes
从以上示例中可以看到,此时网站已经可以正常访问,说明容器中的服务正常运行。
3.终止状态
当不再需要某一个业务继续运行时,就要通过命令使该业务的容器终止,使用 docker stop 命令终止容器text2-nginx。从以上示例中可以看出,此时容器为终止状态。
[root@chenyujie ~]# docker stop text2-nginx
text2-nginx
[root@chenyujie ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@chenyujie ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fc6665648ecf nginx "/docker-entrypoint.…" 16 minutes ago Exited (0) 10 seconds ago text2-nginx
.........
接着对容器进行访问测试,示例代码如下:
[root@chenyujie ~]# curl -I 192.168.10.136
curl: (7) Failed connect to 192.168.10.136:80; 拒绝连接
docker start 唤醒终止状态的容器
[root@chenyujie ~]# docker start text2-nginx
text2-nginx
[root@chenyujie ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fc6665648ecf nginx "/docker-entrypoint.…" 18 minutes ago Up 9 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp text2-nginx
[root@chenyujie ~]# curl -I 192.168.10.136
HTTP/1.1 200 OK
Server: nginx/1.21.5
Date: Fri, 22 Mar 2024 13:27:02 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 28 Dec 2021 15:28:38 GMT
Connection: keep-alive
ETag: "61cb2d26-267"
Accept-Ranges: bytes
[root@chenyujie ~]#
docker attach 与docker exec
在企业中,运维工程师与开发工程师都可能会有进入容器内部的需求。此时不建议使用SSH
(SecureShell)登录容器,因为这违背了一个容器里只有一个进程的原则,同时增加了被攻击的风险。建议使用以下两种 Docker原生方式进入容器。docker attach通过 docker attach 命令可以进入一个已经在运行容器的虚拟输入设备,然后执行其他命令。下面演示 docker attach 命令的使用方式。以f9b3d8530113 一个容器ID的CentOS容器为例,示例代码如下:
[root@chenyujie ~]# docker start f9b3
f9b3
[root@chenyujie ~]# docker attach f9b3
[root@f9b3d8530113 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@f9b3d8530113 /]#
容器内使用exit或CTRL+D退出,会导致容器终止( Exited)
[root@f9b3d8530113 /]# exit
exit
[root@chenyujie ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f9b3d8530113 centos "/bin/bash" 5 hours ago Exited (0) 5 seconds ago heuristic_goldstine
使用CTRL+P+D退出,不会终止容器
[root@chenyujie ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f9b3d8530113 centos "/bin/bash" 5 hours ago Up About an hour heuristic_goldstine
使用 docker exec 进入的容器中执行exit 命令不会终止容器,只会退出当前bash终端。
3 、停止和删除容器
停止容器
在工作中,我们有时会需要将容器暂停,例如,要为容器文件系统做一个快照时。使用 docker pause 与 docker unpause 命令可以对容器进行暂停与激活操作,并且暂停状态的容器不会占用宿主机CPU资源。
当不再需要业务运行时,就要将容器关闭,这时可以使用 docker stop命令。当遇到特殊情况,无法关闭容器时,还可以使用 docker kill 命令强制终止容器。
docker kill 容器ID号
企业中通常有大量的容器需要操作,一个一个操作会浪费大量的人力及时间成本。在这种情况下,可以将 Docker命令与正则表达式结合起来,实现对容器的批量操作。
首先查看运行状态容器的ID号 (docker ps -a) 接着使用正则表达式根据运行状态容器的ID号关闭正在运行的容器,示例代码如下:
docker stop `docker pa -a`
以上示例运用 docker stop命令与正则表达式批量终止了运行中的容器,该命令还有另一种方式,
docker stop `docker ps -a | grep Up|awk '{print $1}
另外,使用类似方法还可以对容器进行批量删除、启动等操作。
dockersop与 docker Kill的区别:
docker stop 执行时,首先给容器发送一个 TERM信号,让容器做一些退出前必须做的保护性,安全性操作,然后让容器自动停止运行。如果在一段时间内容器没有停止运行,再执行 kill -9强制终止容器。
docker kill 执行时,不论容器是什么状态,在运行什么程序,直接执行 kll -9强制关闭容器
删除容器
方法一
批量删除已终止的容器(终止状态删除)
docker rm `docker ps -a | grep Up|awk '{print $1}''
方法二
删除运行状态容器
docker rm `docker ps -a -q`
使用 -f 可以强制删除运行状态中的容器
方法三
删除终止状态
docker rm (docker ps -q -f status=exited)
方法四
从Docker 1.13版本开始,用户可以使用 docker container prune 命令删除处于终止状态的容器。首先,查看当前容器及其状态。
[root@chenyujie ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fc6665648ecf nginx "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp, :::80->80/tcp text2-nginx
80a527f6de26 nginx "/docker-entrypoint.…" 3 hours ago Exited (0) 3 hours ago mystifying_elbakyan
e2c826c0d654 nginx "/docker-entrypoint.…" 5 hours ago Exited (128) 4 hours ago elated_murdock
a3b575869c36 centos "/bin/bash" 5 hours ago Exited (0) 3 seconds ago text1
d1a6e1e7c366 centos "/bin/bash" 6 hours ago Exited (0) 2 hours ago frosty_payne
f9b3d8530113 centos "/bin/bash" 6 hours ago Up About a minute heuristic_goldstine
[root@chenyujie ~]# docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
80a527f6de2679b1d353836ca29027cb8ba541b2e74cbc8da7f589a16f762e35
e2c826c0d654054ecd547d71b3bec2e385a7c40b23a786d501c520863c7b2908
a3b575869c3685196ce377bd74ff4e138b806cd61cddadebdb956ba3dc2994a4
d1a6e1e7c3663bcc1c9d38e0e16ded82921160e6b030d8fb6b0a0af4a4378ee4
Total reclaimed space: 1.121kB
[root@chenyujie ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fc6665648ecf nginx "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp, :::80->80/tcp text2-nginx
f9b3d8530113 centos "/bin/bash" 6 hours ago Up 2 minutes heuristic_goldstine
[root@chenyujie ~]#
4、容器资源限制
1. 限制容器内存资源
在 Linux服务器上,如果内核检测到没有足够的内存( Memory)来执行重要的系统功能,内会提示OOME(Out of Memory Error,内存溢出),并开始终止进程以释放内存,这称为OOM操生任何进程都有可能被终止,包括 Docker和其他重要的应用程序。如果终止了系统关键进程,可能与致整个系统瘫疾。
设置内存上限虽然能保护主机,但是也可能导致容器里的服务运行不畅。如果为服务设置的内存上限太小,服务在正常工作时可能出现资源不足;如果设置过大,则会因为调度器算法浪费内存。因此,合理的做法是遵循以下原则。
(1)为应用做内存压力测试,了解正常业务需求下内存的使用情况,然后再进入生产环境。
(2)限制容器的内存使用上限。
(3)尽量保持机的资源,一通过监控发现资源不足,就进行扩容或者对容器进行迁移
(4)内存资源充足的情况下,尽量不要使用Swap(交换分区)。Swap的使用会导致内存计算变得复杂,对调度器造成压力。
下面介绍Docker启动参数中的内存限制参数。
-m, --memory
设置容器可使用的最大内存,最小值是4MB:
–memory-swap
设置容器可使用内存+Swap的最大值。
–memory-swapiness
默认情况下,用户可以设置一个0-100的值,代表允许内存与交换分区置换的比例。
–memory-reservation
设置一个内存使用的soft limit(非强制性限制),如果Docker发现主机内存不足,会执行OOM操作。这个值必须小于-memory设置的值.
–kemel-memory
容器能够使用的内核内存的大小,最小值为4MB。
–oom-kill-disable
设置是否运行OOM的时候终止容器进程。宿主机会在内存不足时,随机关闭一些进程,而该参数会保护容器进程不被关闭。只有通过设置-memory限制容器内存,才可以使用该参数,否则容器会耗尽宿主机内存,而且导致宿主机应用被终止。
注:–memory-swap只有在设置了–memory时才有意义。使用Swap允许容器在耗尽所有可里的内存时,将多余的内存需求写入磁盘。
–memory与-memory-swap
下面使用progrium/stress镜像来介绍如何为容器分配内存,该容器可以模拟进行压力测试。示例:
[root@chenyujie ~]# docker run -it -m 300M --memory-swap=400M progrium/stress --vm 1 --vm-bytes 380M
Unable to find image 'progrium/stress:latest' locally
latest: Pulling from progrium/stress
[DEPRECATION NOTICE] Docker Image Format v1, and Docker Image manifest version 2, schema 1 support will be removed in an upcoming release. Suggest the author of docker.io/progrium/stress:latest to upgrade the image to the OCI Format, or Docker Image manifest v2, schema 2. More information at https://docs.docker.com/go/deprecated-image-specs/
a3ed95caeb02: Pull complete
871c32dbbb53: Pull complete
dbe7819a64dd: Pull complete
d14088925c6e: Pull complete
58026d51efe4: Pull complete
7d04a4fe1405: Pull complete
1775fca35fb6: Pull complete
5c319e267908: Pull complete
Digest: sha256:e34d56d60f5caae79333cee395aae93b74791d50e3841986420d23c2ee4697bf
Status: Downloaded newer image for progrium/stress:latest
以上示例运行了一个容器,分配可用最大内存为300MB,可用Swap为100MB。其中,-vm 1
参数表示启动一个内存工作线程,--vm-bytes 380M
参数表示每个线程分配380MB内存。可以看到系统不断地给容器分配内存、释放内存,一直循环。由于使用的内存是380MB,在最大使用量(400MB)之内,容器正常运行。
#将线程分配的内存改为450MB,超出了最大限额(400MB)
[root@chenyujie ~]# docker run -it -m 300M --memory-swap=400M progrium/stress --vm 1 --vm-bytes 480M
stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: dbug: [1] using backoff sleep of 3000us
stress: dbug: [1] --> hogvm worker 1 [7] forked
stress: dbug: [7] allocating 503316480 bytes ...
stress: dbug: [7] touching bytes in strides of 4096 bytes ...
stress: FAIL: [1] (416) <-- worker 7 got signal 9
stress: WARN: [1] (418) now reaping child worker processes
stress: FAIL: [1] (422) kill error: No such process
stress: FAIL: [1] (452) failed run completed in 1s
限制容器CPU资源
Docker为容器设置CPU资源限制的参数是-c
或--cpu-shares
,其值是一个整数。运行两个容器test01与test02,并设置CPU权重,示例代码如下:
[root@chenyujie ~]# docker run -it -d -c 1000 --name test01
Docker.io/progrium/stress -cpu 2
设置CPU资源限制还可以使用--cpuset-cpus
参数,它能够指定容器使用某一颗CPU。这里使用CPU测试镜像 agileek/cpuset-test
进行测试,其功能是将CPU用满,示例代码如下:
[root@chenyujie~] docker run -d -it --cpuset-cpus=0
Docker.io/agileek/cpus
限制容器Block I/O
Block IO指的是磁盘的读写,docker可以通过设置权重以及限制bps(每秒读写数据量)和iops(每秒读写次数)的方式控制容器读写磁盘的带宽。
bps
与iops
主要参数有:
–-blkio-weight
:容器默认磁盘IO的加权值,有效值范围为10-1000。
–-blkio-weight-device
: 针对特定设备的IO加权控制。其格式为DEVICE_NAME:WEIGHT
–-device-read-bps
:限制此设备上的读速度(bytes per second),单位可以是KB、MB或者GB。
–-device-read-iops
:通过每秒读IO次数来限制指定设备的读速度。
–-device-write-bps
:限制此设备上的写速度(bytes per second),单位可以是KB、MB或者GB。
--cpuset-cpus
参数,它能够指定容器使用某一颗CPU。这里使用CPU测试镜像 agileek/cpuset-test
进行测试,其功能是将CPU用满,示例代码如下:
[root@chenyujie~] docker run -d -it --cpuset-cpus=0
Docker.io/agileek/cpus
限制容器Block I/O
Block IO指的是磁盘的读写,docker可以通过设置权重以及限制bps(每秒读写数据量)和iops(每秒读写次数)的方式控制容器读写磁盘的带宽。
bps
与iops
主要参数有:
–-blkio-weight
:容器默认磁盘IO的加权值,有效值范围为10-1000。
–-blkio-weight-device
: 针对特定设备的IO加权控制。其格式为DEVICE_NAME:WEIGHT
–-device-read-bps
:限制此设备上的读速度(bytes per second),单位可以是KB、MB或者GB。
–-device-read-iops
:通过每秒读IO次数来限制指定设备的读速度。
–-device-write-bps
:限制此设备上的写速度(bytes per second),单位可以是KB、MB或者GB。
–-device-write-iops
:通过每秒写IO次数来限制指定设备的写速度。