第四章 Docker容器

第四章 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(每秒读写次数)的方式控制容器读写磁盘的带宽。

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。
--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(每秒读写次数)的方式控制容器读写磁盘的带宽。

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次数来限制指定设备的写速度。

  • 30
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值