容器运行

使用 docker run 命令可以运行容器。该命令底层其实是 docker createdocker 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端口显示欢迎页

image-20240228144850646

使用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 pausedocker 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资源
正数M0相当于未设置Swap
正数Munset若主机(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(每秒读写次数)的方式控制容器读写磁盘的带宽。

bpsiops主要参数有:
–-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次数来限制指定设备的写速度。

是一名喜欢每天折腾的咸鱼! 也是一名半退役的算竞摸鱼选手,参与过icpc,天梯赛,蓝桥等比赛. --------------------------------------------------- 百度 飞桨领航团-团长 Datawhale -专业助教 上海人工智能实验室 书生·浦语实战营- 助教 --------------------------------------------------- 认证类: 华为 Harmony OS应用开发者高级认证, NISP 一级认证, H3C NE-RS网络工程师认证 --------------------------------------------------- 荣获奖项荣誉: 第十八届“挑战杯”全国大学生课外学术科技作品竞赛 “揭榜挂帅”专项赛-全国特等奖、 “美亚杯”第八届中国电子取证大赛 三等奖、 “蓝桥杯”国优、 中国高校计算机大赛-团体程序天梯赛 省高校一等奖、 “蓝桥杯”省一等奖、 H3C新华三杯 省三等奖、 中国移动“梧桐杯”大数据创新大赛 省三等奖、 百度 飞桨领航团 金牌团长
最后更新于 2024-03-09