容器运行
使用 docker run
命令可以运行容器。该命令底层其实是 docker create
与docker start
两条命令的结合体,运行容器需要先基于镜像创建一个容器,然后启动容器,完成一个容器的运行
例如基于镜像启动一个新容器,打印当月日历
[root@docker ~]# docker run centos cal
February 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
从以上示例中可以看到日历已经被打印出来,但无法看到容器是否运行。
p命令在 Linux系统中被用来查看进程,在 Docker中被用来查看容器,因为运行中的容器也是一个进程,示例代码如下:
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2b78b9499da3 centos "cal" 48 seconds ago Exited (0) 47 seconds ago awesome_payne
从以上示例中可以看到,一个Docker容器以CentOS镜像为基础运行,并传了一个cal(打印当前月份日历)命令,容器正常启动并执行了cal命令。
除此之外,还可以通过指定参数,启动一个bash交互终端,代码如下:
[root@docker ~]# docker run -it centos /bin/bash
[root@553b03539041 /]# cal
February 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
上述代码创建了一个交互式的容器,并分配了一个伪终端,使用户可以通过命令行与容器进行交互。终端对宿主机进行直接操作,宿主机通过一个虚拟终端将对Docker的指令传输给容器,这个
虚拟终端就是伪终端,对容器进行直接操作。
执行dockerrun命令启动容器时,Docker会进行如下操作。
(1)检测本地是否存在指定的镜像,不存在则从默认的Docker Hub公有仓库下载。
(2)使用镜像创建(docker create)并启动(docker run)容器。
(3)分配一个文件系统,并在只读层外面挂载一个可读可写层。
(4)从宿主机配置的网桥接口中桥接一个虚拟接口到容器(后面的章节将详细介绍)。(5)从地址池分配一个IP地址给容器。
(6)执行用户指定的命令。
(7)执行之后容器被终止(docker stop)。
另外,在docker run命令中可以添加相应参数,实现不同的功能
OPTIONS说明:
- -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@docker ~]# docker run -it centos
#-i与-t通常一起使用,写作-it
[root@7050812f30d5 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
以上命令执行成功的前提是本地有 Centos镜像。其中,-i表示捕获标准输入输出,-t表示分配一个终端或控制台。
下面运行一个容器,并为其设置环境变量,示例代码如下:
[root@docker ~]# docker run -d -it -e key=1000 centos
f8319b84a257b3d67e8d2b3c51cca6a11198b99f91879ab0b81ccfee8db3b8dc
其中,-e参数在创建容器时为容器配置环境变量。
此时已经成功创建了一个容器,接着查看它的环境变量,示例代码如下:
[root@docker ~]# docker exec -it f83 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=f8319b84a257
TERM=xterm
key=1000
HOME=/root
从以上示例中可以看到,key=1000的环境变量已经设置成功。
1.自动重启的容器
在启动时添加 --restart
参数设置容器停止后的重启策略,发现exit退出后仍在运行
[root@docker ~]# docker run -it --restart=always centos
[root@7f2b5ea3a3bb /]# exit
exit
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7f2b5ea3a3bb centos "/bin/bash" 32 seconds ago Up 25 seconds admiring_bartik
2.自定义名称容器
--name=<名称>
设置自定义名称
[root@docker ~]# docker run -d --name=test centos
04388cd77a3322d9d7631aa8c45afcfd5b09525759014ea7b88ca4d2e1f99737
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
04388cd77a33 centos "/bin/bash" 10 seconds ago Exited (0) 8 seconds ago test
3.开启端口的容器
-p 宿主机端口:容器端口
[root@docker ~]# docker run -d -p 8800:80 nginx
8b585410ced51ff80e00369a05f2c6ddafe219711710ed3cb65467e0de97596c
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8b585410ced5 nginx "/docker-entrypoint.…" 8 seconds ago Up 7 seconds 0.0.0.0:8800->80/tcp, :::8800->80/tcp thirsty_bassi
访问8800端口显示欢迎页
使用curl也正常
[root@docker ~]# curl -I localhost:8800
HTTP/1.1 200 OK
Server: nginx/1.21.5
Date: Wed, 28 Feb 2024 06:49:46 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
4.与宿主机共享目录的容器
-v 宿主机目录or文件地址:容器内地址
映射文件目录or文件
--privileged
给用户添加操作权限
docker run -it \
-v ~/Centos-8.repo:/root/Centos-8.repo \
--privileged \
centos /bin/bash
进入容器
容器的三种状态
容器在宿主机中共有三种状态,分别为运行(Up)状态、暂停(Paused)状态与终止(Exited)状态。
下面通过示例来观察容器的三种状态。
1.运行状态
docker run
运行一个名为 tst- nginx E的 Nginx容器,并将容器80端口映射到宿主机8801端口,示例代码如下
[root@docker ~]# docker run -d -p 8801:80 --name test-nginx nginx
f3a0a568400ff23226f692e439f2670d9e471b7469fbe9bfceec8b8e67b69d09
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f3a0a568400f nginx "/docker-entrypoint.…" 28 seconds ago Up 27 seconds 0.0.0.0:8801->80/tcp, :::8801->80/tcp test-nginx
这时,容器已经创建完成,通过ps命令查看容器是否为运行状态,示例代码如下:
从以上示例中可以看出,此时容器状态为运行状态。
2.暂停状态
下面通过命令使容器进入暂停状态docker pause
是暂停容器的命令
接着通过命令查看容器是否成功暂停,示例代码如下:
[root@docker ~]# docker pause test-nginx
test-nginx
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f3a0a568400f nginx "/docker-entrypoint.…" About a minute ago Up About a minute (Paused) 0.0.0.0:8801->80/tcp, :::8801->80/tcp test-nginx
8b585410ced5 nginx "/docker-entrypoint.…" 18 minutes ago Up 18 minutes 0.0.0.0:8800->80/tcp, :::8800->80/tcp thirsty_bassi
从以上示例中可以看到,容器仍是运行状态,但同时也是暂停状态。
接着通过curl工具对该容器进行访问测试,示例代码如下:
[root@docker ~]# curl -I localhost:8801
^C
通过访问测试发现,此时无法访问到容器网页,但是服务器没有拒绝连接,说明暂停容器的本质是暂停容器中的服务。
下面使用docker unpause
命令使暂停状态的容器终止暂停状态,示例代码如下:
[root@docker ~]# docker unpause f3a0
f3a0
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f3a0a568400f nginx "/docker-entrypoint.…" 4 minutes ago Up 4 minutes 0.0.0.0:8801->80/tcp, :::8801->80/tcp test-nginx
8b585410ced5 nginx "/docker-entrypoint.…" 21 minutes ago Up 21 minutes 0.0.0.0:8800->80/tcp, :::8800->80/tcp thirsty_bassi
从以上代码中可以看到,暂停状态已经被终止,容器只处于运行状态。
接着用curl工具对容器进行访问测试,示例代码如下:
[root@docker ~]# curl -I localhost:8801
HTTP/1.1 200 OK
Server: nginx/1.21.5
Date: Wed, 28 Feb 2024 07:08:57 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
命令终止容器test-nginx。
[root@docker ~]# docker stop f3a0
f3a0
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f3a0a568400f nginx "/docker-entrypoint.…" 6 minutes ago Exited (0) 4 seconds ago test-nginx
8b585410ced5 nginx "/docker-entrypoint.…" 22 minutes ago Up 22 minutes 0.0.0.0:8800->80/tcp, :::8800->80/tcp thirsty_bassi
从以上示例中可以看出,此时容器为终止状态。接着对容器进行访问测试,示例代码如下:
[root@docker ~]# curl -I localhost:8801
curl: (7) Failed connect to localhost:8801; 拒绝连接
docker start
唤醒终止状态的容器
[root@docker ~]# docker start f3a0
f3a0
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f3a0a568400f nginx "/docker-entrypoint.…" 8 minutes ago Up 42 seconds 0.0.0.0:8801->80/tcp, :::8801->80/tcp test-nginx
8b585410ced5 nginx "/docker-entrypoint.…" 25 minutes ago Up 25 minutes 0.0.0.0:8800->80/tcp, :::8800->80/tcp thirsty_bassi
[root@docker ~]# curl -I localhost:8801
HTTP/1.1 200 OK
Server: nginx/1.21.5
Date: Wed, 28 Feb 2024 07:12:50 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
docker attach 与docker exec
在企业中,运维工程师与开发工程师都可能会有进入容器内部的需求。此时不建议使用SSH(SecureShell)登录容器,因为这违背了一个容器里只有一个进程的原则,同时增加了被攻击的风险。建议使用以下两种 Docker原生方式进入容器。
docker attach
通过 docker attach
命令可以进入一个已经在运行容器的虚拟输入设备,然后执行其他命令。
下面演示docker attach
命令的使用方式。
创建任意一个容器,这里以CentOS容器为例,示例代码如下:
如下:
[root@docker ~]# docker run -it -d centos /bin/bash
cdb35a279e96ac07da11076b80d05c45f61ea42d95a1ac029bff11e425382b66
此时CeatOS容器已经创建成功,接着使用docker attach命令与容器ID号进入容器,示例代码
[root@docker ~]# docker attach cdb
[root@cdb35a279e96 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
退出方式
- 容器内使用exit或CTRL+D退出,会导致容器终止( Exited)
- 使用CTRL+P+D退出,不会终止容器
使用exit或CTRL+D退出,会导致容器终止( Exited)
[root@cdb35a279e96 /]# exit
exit
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cdb35a279e96 centos "/bin/bash" 2 minutes ago Exited (0) 4 seconds ago flamboyant_goldwasser
f3a0a568400f nginx "/docker-entrypoint.…" 14 minutes ago Up 6 minutes 0.0.0.0:8801->80/tcp, :::8801->80/tcp test-nginx
8b585410ced5 nginx "/docker-entrypoint.…" 30 minutes ago Up 30 minutes 0.0.0.0:8800->80/tcp, :::8800->80/tcp thirsty_bassi
使用CTRL+P+D退出,不会终止容器
[root@docker ~]# docker start cdb
cdb
[root@docker ~]# docker attach cdb
[root@cdb35a279e96 /]# read escape sequence
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cdb35a279e96 centos "/bin/bash" 4 minutes ago Up 44 seconds flamboyant_goldwasser
f3a0a568400f nginx "/docker-entrypoint.…" 16 minutes ago Up 8 minutes 0.0.0.0:8801->80/tcp, :::8801->80/tcp test-nginx
8b585410ced5 nginx "/docker-entrypoint.…" 32 minutes ago Up 32 minutes 0.0.0.0:8800->80/tcp, :::8800->80/tcp thirsty_bassi
[root@docker ~]#
docker exec
参数 | 功能描述 |
---|---|
-detach,-d | 后台运行模式,在后合执行命令 |
-env,-e | 设置环境变量(仅在本次会中生效) |
-interactive,-i | 打开stdin,用于控制台交互 |
--tty,-t | 命令行交互模式 |
-user,-u | 设置用户名 |
[root@docker ~]# docker exec f3a ls
bin
boot
dev
docker-entrypoint.d
docker-entrypoint.sh
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
以上示例通过docker exee命令向容器发送Is命令,并将结果回显至终端。
下面创建一个新容器,并为容器启动一个虚拟终端,使用命令行对容器进行操作,示例代码如下:
[root@docker ~]# docker exec -it f3a /bin/bash
root@f3a0a568400f:/# 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@f3a0a568400f:/# date
Wed Feb 28 07:33:36 UTC 2024
以上示例通过虚拟终端对容器进行一系列操作。接着使用exit命令退出容器,并查看容器状态,示例代码如下:
root@f3a0a568400f:/# exit
exit
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cdb35a279e96 centos "/bin/bash" 18 minutes ago Up 14 minutes flamboyant_goldwasser
f3a0a568400f nginx "/docker-entrypoint.…" 30 minutes ago Up 21 minutes 0.0.0.0:8801->80/tcp, :::8801->80/tcp test-nginx
8b585410ced5 nginx "/docker-entrypoint.…" 46 minutes ago Up 46 minutes 0.0.0.0:8800->80/tcp, :::8800->80/tcp thirsty_bassi
以上示例使用exit命令退出了容器,但容器仍在运行状态。这说明docker exec与docker attach不同,在使用docker exec进入的容器中执行exit命令不会终止容器,只会退出当前bash终端。在工作中,建议使用dockerexec命令进入容器,这样不容易出现操作失误。
停止和删除容器
停止容器
在工作中,我们有时会需要将容器暂停,例如,要为容器文件系统做一个快
照时。使用docker pause
与docker unpause
命令可以对容器进行暂停与激活操作,并且暂停状态的容器不会占用宿主机CPU资源。
当不再需要业务运行时,就要将容器关闭,这时可以使用 Idocker top命令。当遇到特殊情况,无法关闭容器时,还可以使用 docker kill
命令强制终止容器
docker kill cdb35
企业中通常有大量的容器需要操作,一个一个操作会浪费大量的人力及时间成本。在这种情况下,可以将 Docker命令与正则表达式结合起来,实现对容器的批量操作。
首先查看运行状态容器的ID号,示例代码如下:
docker ps -q
接着使用正则表达式根据运行状态容器的id号关闭正在运行的容器,示例代码如下:
docker stop `docker ps -q`
以上示例运用 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 Exited|awk '{print $1}'`
删除容器方法二
删除运行状态容器
docker rm `docker ps -a q`
删除容器方法三
删除终止状态容器
docker rm (docker ps -q -f status=exited)
删除容器方法四
从Docker 1.13版本开始,用户可以使用 docker container prune
命令删除处于终止状态的容器。首先,查看当前容器及其状态,示例代码如下:
[root@docker ~]# docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
cdb35a279e96ac07da11076b80d05c45f61ea42d95a1ac029bff11e425382b66
f3a0a568400ff23226f692e439f2670d9e471b7469fbe9bfceec8b8e67b69d09
8b585410ced51ff80e00369a05f2c6ddafe219711710ed3cb65467e0de97596c
Total reclaimed space: 2.209kB
容器资源限制
限制容器内存资源
在 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
正数M正数S
容器可用总空间为S,其中RAM为M,Swap为(S-M),若S=M,则无可用Swap资源
正数M0
相当于未设置Swap
正数Munset
若主机(Docker宿主机)启用了Swap,则容器可用Swap为2×M
正数M-1
若主机(Docker宿主机)启用了Swap,则容器可以使用主机最大值的Swap资源
--memory | --memory-swap | 功能描述 |
---|---|---|
正数M | 正数S | 容器可用总空间为S,其中RAM为M,Swap为(S-M),若S=M,则无可用Swap资源 |
正数M | 0 | 相当于未设置Swap |
正数M | unset | 若主机(Docker宿主机)启用了Swap,则容器可用Swap为2×M |
正数M | -1 | 若主机(Docker宿主机)启用了Swap,则容器可以使用主机最大值的Swap资源 |
以上两个参数默认值都为-1,即对容器使用内存和Swap没有限制。
下面使用progrium/stress镜像来介绍如何为容器分配内存,该容器可以模拟进行压力测试。示例
代码如下:
[root@docker ~]# 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
stress: FAIL: [1] (245) unrecognized option: --vm1
以上示例运行了一个容器,分配可用最大内存为300MB,可用Swap为100MB。其中,-vm 1
参数表示启动一个内存工作线程,--vm-bytes 380M
参数表示每个线程分配380MB内存。可以看到系统不断地给容器分配内存、释放内存,一直循环。由于使用的内存是380MB,在最大使用量(400MB)之内,容器正常运行。
下面测试内存使用超出限额的情况,示例代码如下:
#将线程分配的内存改为450MB,超出了最大限额(400MB)
[root@docker ~]# 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 3s
限制容器CPU资源
Docker为容器设置CPU资源限制的参数是-c
或--cpu-shares
,其值是一个整数。运行两个容器test01与test02,并设置CPU权重,示例代码如下:
[root@docker -]# docker run -it -d -c 1000 --name test01 Docker.io/progrium/stress -cpu 2
设置CPU资源限制还可以使用--cpuset-cpus
参数,它能够指定容器使用某一颗CPU。这里使用CPU测试镜像 agileek/cpuset-test
进行测试,其功能是将CPU用满,示例代码如下:
[rootedocker -] 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次数来限制指定设备的写速度。
Comments NOTHING