03. Docker:网络模式和资源控制

目录

一、Docker 网络模式

1、Docker 网络实现原理

2、Docker 网络模式概述

2.1 Host 模式

2.2 Container 模式

2.3 None 模式

2.4 Bridge 模式

2.5 自定义网络(user-defined network)

3、配置 docker 网络模式

3.1 查看网络基础命令

3.1.1 查看 docker 网络列表

3.1.2 搜索指定网络模式的容器

3.1.3 查看容器的进程

3.1.4 查看容器信息(包含配置、环境、网关、挂载、cmd等信息)

3.1.5 查看网桥bridge信息

3.2 配置 host 网络模式

3.3 配置 container 网络模式

3.3.1 先创建一个bridge模式的容器

3.3.2 创建 container 模式的容器centos02,共享centos01容器的网卡

3.4 配置 none 网络模式

3.5 配置 bridge 网络模式

3.6 配置 user-defined network 模式(自定义网络)

3.6.1 创建自定义网络

3.6.2 使用指定IP创建并运行docker

二、Docker 资源控制

1、CPU 资源控制

1.1 设置CPU使用率上限

1.1.1 设置50%的比例分配CPU使用时间上限

1.1.2 进入到容器中,进行CPU压力测试

1.1.3 查看CPU占用资源

1.2 设置CPU资源占用比(设置多个容器时才有效)

1.2.1 创建并运行两个容器为 c1 和 c2,并设置容器的权重,使得c1和c2的CPU资源占比为1/3和2/3

1.2.2 分别进入这两个容器,并进行压力测试

1.2.3 查看容器运行状态(动态更新)

1.3 设置容器绑定指定的CPU

1.3.1 创建并运行bak容器绑定CPU1和CPU3

1.3.2 进入容器,进行压力测试

1.3.3 使用top查看CPU绑定情况

2、对内存使用的限制

2.1 使用--memory标志

2.2 使用--memory-swap标志

3、对磁盘IO配额控制(blkio)的限制

3.1 限制容器的读写速度

3.2 限制容器的读写次数

三、Docker 故障造成大量日志导致磁盘爆满故障

1、处理步骤

2、模拟故障

2.1 模拟新建容器一直在后台持续运行占用资源

2.2 停止运行有问题的容器

2.3 清理日志文件

四、总结

1、Docker 网络模式

2、Docker 资源控制

2.1 CPU资源控制

2.2 内存资源限制

2.3 磁盘IO配额限制


一、Docker 网络模式

1、Docker 网络实现原理

        Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的 Container-IP 直接通信

命令示例:

ifconfig
ifconfig docker0

输出结果:

[root@MineGi ~]# ifconfig docker0
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:1c:e7:57:ea  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@MineGi ~]#

        Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法直接通过 Container-IP 访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即 docker run 创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器

端口映射:

        在启动容器的时候,如果不指定对应的端口,在容器外是无法通过网络来访问容器内的服务

        端口映射机制将容器内的服务提供给外部网络访问,实质上就是将宿主机的端口映射到容器中,使得外部网络访问宿主机的端口便可访问容器内的服务

docker run -d --name test1 -P nginx              #随机映射端口(大写P)
docker run -d --name test2 -p 9999:80 nginx      #指定映射端口(小写p)
docker ps -a                                  #查看当前所有的容器

命令示例:

docker ps -a 
docker run -d --name test1 -P nginx
docker run -d --name test2 -p 9999:80 nginx
docker ps -a  

输出结果:

[root@MineGi ~]# docker ps -a 
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@MineGi ~]# docker run -d --name test1 -P nginx
74ccdf369a5e7691293b1ef4110e63f491a570d508604315ef419954adb21ad2
[root@MineGi ~]# docker run -d --name test2 -p 9999:80 nginx
b9890f1f108d067957476725a1e23150771afdc138b33f12470eedaf461f0817
[root@MineGi ~]# docker ps -a  
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS          PORTS                                   NAMES
b9890f1f108d   nginx     "/docker-entrypoint.…"   7 seconds ago    Up 5 seconds    0.0.0.0:9999->80/tcp, :::9999->80/tcp   test2
74ccdf369a5e   nginx     "/docker-entrypoint.…"   12 seconds ago   Up 11 seconds   0.0.0.0:1024->80/tcp, :::1024->80/tcp   test1
[root@MineGi ~]#

浏览器访问:
http://10.4.7.11:1024
http://10.4.7.11:9999

#查看容器的输出和日志信息
格式:docker logs 容器的ID/名称
如:docker logs test1

命令示例:

docker logs test1

输出结果:

root@MineGi ~]# docker logs test1
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2024/12/15 02:46:07 [notice] 1#1: using the "epoll" event method
2024/12/15 02:46:07 [notice] 1#1: nginx/1.27.3
2024/12/15 02:46:07 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14) 
2024/12/15 02:46:07 [notice] 1#1: OS: Linux 3.10.0-1127.el7.x86_64
2024/12/15 02:46:07 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2024/12/15 02:46:07 [notice] 1#1: start worker processes
2024/12/15 02:46:07 [notice] 1#1: start worker process 29
2024/12/15 02:46:07 [notice] 1#1: start worker process 30
10.4.7.253 - - [15/Dec/2024:02:47:09 +0000] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0" "-"
2024/12/15 02:47:09 [error] 29#29: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 10.4.7.253, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "10.4.7.11:1024", referrer: "http://10.4.7.11:1024/"
10.4.7.253 - - [15/Dec/2024:02:47:09 +0000] "GET /favicon.ico HTTP/1.1" 404 153 "http://10.4.7.11:1024/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0" "-"
[root@MineGi ~]# 

#使用 docker run -p 时,docker实际是在iptables做了DNAT规则,实现端口转发功能
iptables -t nat -vnL

命令示例:

iptables -t nat -vnL

输出结果:

[root@MineGi ~]# iptables -vnL -t nat
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    3   156 DOCKER     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 16 packets, 1216 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DOCKER     all  --  *      *       0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT 17 packets, 1268 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MASQUERADE  all  --  *      !docker0  172.17.0.0/16        0.0.0.0/0           
    0     0 MASQUERADE  tcp  --  *      *       172.17.0.2           172.17.0.2           tcp dpt:80
    0     0 MASQUERADE  tcp  --  *      *       172.17.0.3           172.17.0.3           tcp dpt:80

Chain DOCKER (2 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 RETURN     all  --  docker0 *       0.0.0.0/0            0.0.0.0/0           
    1    52 DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:1024 to:172.17.0.2:80
    0     0 DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:9999 to:172.17.0.3:80
[root@MineGi ~]#

2、Docker 网络模式概述

        Docker 提供了多种网络模式,用于在容器间和容器与外部网络之间建立通信。这些网络模式可以根据实际需求选择,下面是一些常见的 Docker 网络模式

2.1 Host 模式

  • 相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址
  • Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等
  • 一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、iptable规则等都与其他的Network Namespace隔离。 一个Docker容器一般会分配一个独立的Network Namespace。 但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡、配置自己的IP等,而是使用宿主机的IP和端口
  • 解决了ip地址不固定的情况

  • 优点
    • 性能优势:由于容器与宿主机共享网络栈,因此在host网络模式下,容器之间的通信不需要经过网络地址转换(NAT),可以提高网络性能
    • 简化网络配置:使用host网络模式可以简化网络配置,容器可以直接访问宿主机上的所有网络服务,无需进行端口映射
    • 高吞吐量:由于容器直接使用宿主机的网络接口,可以获得更高的网络吞吐量,适用于对网络性能要求较高的场景
  • 缺点
    • 安全性:由于容器与宿主机共享网络栈,容器之间的隔离性降低,可能会增加一定的安全风险,特别是在多租户环境中
    • 端口冲突:在host网络模式下,容器与宿主机共享相同的网络接口,可能会导致端口冲突,需要谨慎管理端口使用
    • 不适用于多主机环境:host网络模式适用于单个主机上的容器,不适用于跨主机通信的场景

2.2 Container 模式

  • 这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围(端口不能一致)等
  • 同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信

  • 优点:
    • 容器之间共享同一个网络命名空间,可以直接进行网络通信,无需通过网络层进行路由,提高了网络通信的效率
    • 可以方便地实现容器之间的私有网络,适用于需要高度互联的容器组
    • 可以更好地控制容器之间的通信,增强了网络安全性
  • 缺点:
    • 容器之间共享网络命名空间,可能会导致网络隔离性不足,容器之间的通信可能会相互影响
    • 不适合需要完全隔离的场景,因为容器共享网络命名空间,可能会导致安全性问题
    • 可能会增加网络配置和管理的复杂性,特别是在大规模部署时

2.3 None 模式

  • 该模式关闭了容器的网络功能
  • 使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等
  • 这种网络模式下容器 只有lo回环网络,没有其他网卡。 none模式可以在容器创建时通过–network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性
  • 可以安全的储存数据,不会被攻击,可以用来当个仓库

  • 优点:
    • 提供了最高级别的隔离性,适用于一些需要完全隔离的场景,如测试隔离性等。
    • 可以防止容器与外部网络发生意外的通信,增强了安全性。
  • 缺点:
    • 容器无法与外部网络通信,除非手动配置网络连接或使用其他通信方式,这可能增加了管理和配置的复杂性。
    • 不适合一般应用场景,因为容器无法访问外部资源,如互联网或其他容器服务。

2.4 Bridge 模式

  • 此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及iptables nat表配置与宿主之间的关联
  • 当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中
  • 从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看
  • bridge模式是docker的默认网络模式,不写–net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看

  • 优点:
    • 桥接网络模式是默认的网络模式,易于使用和管理。
    • 提供了一定程度的网络隔离,容器之间默认无法直接通信,增强了安全性。
    • 允许容器使用NAT(网络地址转换)来访问外部网络,同时也支持端口映射,方便从外部访问容器内的服务。
  • 缺点:
    • 需要进行端口映射才能从外部访问容器内的服务,可能会增加管理复杂性。
    • 容器之间的通信需要通过桥接网络,可能会影响性能,尤其在大规模部署时。

2.5 自定义网络(user-defined network)

  • 创建自定义的网络模式来满足特定的网络需求。自定义网络模式可以帮助您更好地管理容器之间的通信和隔离
  • 优点:
    • 隔离性:自定义网络模式可以帮助实现容器之间的隔离,使它们可以在独立的网络环境中运行
    • 灵活性:通过自定义网络模式,您可以根据应用程序需求定制网络配置,实现更灵活的网络管理
    • 安全性:自定义网络模式可以帮助您更好地控制容器之间的通信,提高网络安全性
      性能:自定义网络模式可以优化容器之间的通信性能,减少不必要的网络开销
  • 缺点:
    • 需要用户自行创建和配置网络,可能增加管理复杂性

3、配置 docker 网络模式

        使用docker run创建Docker容器时,可以用 --net 或 --network 选项指定容器的网络模式

host模式

--net=host

容器和宿主机共享Network namespace

container模式

--net=container:NAME_or_ID

多个容器共享一个Network namespace

none模式

--net=none

容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。

bridge模式

--net=bridge

默认为该模式,可省略

3.1 查看网络基础命令

3.1.1 查看 docker 网络列表

情况说明:安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络)、 none 、host

#查看docker网络列表
docker network ls 或 docker network list            

命令示例:

docker network ls

输出结果:

[root@MineGi ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
8651a6d080de   bridge    bridge    local
ea437fbaf5b4   host      host      local
94ab88ac75ce   none      null      local
[root@MineGi ~]#

3.1.2 搜索指定网络模式的容器
格式:docker ps --filter "network=网络模式"   或者  docker network ls|grep 网络模式
#如:docker ps --filter "network=bridge"  #搜索bridge模式的容器
#如:docker network ls|grep bridge

命令示例:

docker ps --filter "network=bridge"

输出结果:

[root@MineGi ~]# docker ps --filter "network=bridge"
CONTAINER ID   IMAGE     COMMAND                   CREATED         STATUS         PORTS                                   NAMES
b9890f1f108d   nginx     "/docker-entrypoint.…"   8 minutes ago   Up 8 minutes   0.0.0.0:9999->80/tcp, :::9999->80/tcp   test2
74ccdf369a5e   nginx     "/docker-entrypoint.…"   8 minutes ago   Up 8 minutes   0.0.0.0:1024->80/tcp, :::1024->80/tcp   test1
[root@MineGi ~]# 

3.1.3 查看容器的进程
docker inspect -f '{{.State.Pid}}' 容器ID/容器名称   #查看指定容器的进程号

命令示例:

docker inspect -f '{{.State.Pid}}' test1

输出结果:

[root@MineGi ~]# docker inspect -f '{{.State.Pid}}' test1
1462
[root@MineGi ~]# 

3.1.4 查看容器信息(包含配置、环境、网关、挂载、cmd等信息)
docker inspect 容器ID/容器名

命令示例:

docker inspect test1

输出结果:

[root@MineGi ~]# docker inspect test1 |head
[
    {
        "Id": "74ccdf369a5e7691293b1ef4110e63f491a570d508604315ef419954adb21ad2",
        "Created": "2024-12-15T02:46:06.271102561Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
            "nginx",
            "-g",
            "daemon off;"
        ],
[root@MineGi ~]#

3.1.5 查看网桥bridge信息

命令示例:

brctl show
yum install -y bridge-utils
brctl show

输出结果:

[root@MineGi ~]# brctl show
-bash: brctl: 未找到命令
[root@MineGi ~]# yum install -y -q bridge-utils
[root@MineGi ~]# brctl show
bridge name    bridge id        STP enabled    interfaces
docker0        8000.024267cb5ef4    no        veth1dfb5af
                            vethb2c0803
[root@MineGi ~]#

3.2 配置 host 网络模式

#创建名为nginx01的容器网络模式为host
docker run -d --name nginx01 --network host nginx:latest

命令示例:

docker ps 
docker run -d --name nginx01 --network host nginx:latest
docker ps 

输出结果:

[root@MineGi ~]# docker ps 
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS          PORTS                                   NAMES
b9890f1f108d   nginx     "/docker-entrypoint.…"   13 minutes ago   Up 13 minutes   0.0.0.0:9999->80/tcp, :::9999->80/tcp   test2
74ccdf369a5e   nginx     "/docker-entrypoint.…"   13 minutes ago   Up 13 minutes   0.0.0.0:1024->80/tcp, :::1024->80/tcp   test1
[root@MineGi ~]# docker run -d --name nginx01 --network host nginx:latest
1d5f8dfacde54febd910fe8ea1dc7688cd070853e40da381ddcfad3a8b548625
[root@MineGi ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS          PORTS                                   NAMES
1d5f8dfacde5   nginx:latest   "/docker-entrypoint.…"   5 seconds ago    Up 4 seconds                                            nginx01
b9890f1f108d   nginx          "/docker-entrypoint.…"   13 minutes ago   Up 13 minutes   0.0.0.0:9999->80/tcp, :::9999->80/tcp   test2
74ccdf369a5e   nginx          "/docker-entrypoint.…"   13 minutes ago   Up 13 minutes   0.0.0.0:1024->80/tcp, :::1024->80/tcp   test1
[root@MineGi ~]# 

docker inspect nginx01  #查看容器详细信息,包括配置、环境、网络模式等信息

命令示例:

docker ps 
docker inspect -f '{{.HostConfig.NetworkMode}}' nginx01
docker inspect -f '{{.HostConfig.NetworkMode}}' test1
docker inspect -f '{{.HostConfig.NetworkMode}}' test2

输出结果:

[root@MineGi ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED              STATUS              PORTS                                   NAMES
1d5f8dfacde5   nginx:latest   "/docker-entrypoint.…"   About a minute ago   Up About a minute                                           nginx01
b9890f1f108d   nginx          "/docker-entrypoint.…"   15 minutes ago       Up 15 minutes       0.0.0.0:9999->80/tcp, :::9999->80/tcp   test2
74ccdf369a5e   nginx          "/docker-entrypoint.…"   15 minutes ago       Up 15 minutes       0.0.0.0:1024->80/tcp, :::1024->80/tcp   test1
[root@MineGi ~]# docker inspect -f '{{.HostConfig.NetworkMode}}' nginx01
host
[root@MineGi ~]# docker inspect -f '{{.HostConfig.NetworkMode}}' test1
bridge
[root@MineGi ~]# docker inspect -f '{{.HostConfig.NetworkMode}}' test2
bridge
[root@MineGi ~]#

#查看host模式的容器
docker ps --filter "network=host"

命令示例:

docker ps --filter "network=host"

输出结果:

[root@MineGi ~]# docker ps --filter "network=host"
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS         PORTS     NAMES
1d5f8dfacde5   nginx:latest   "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes             nginx01
[root@MineGi ~]# 

docker inspect -f '{{.State.Pid}}' nginx01   #查看指定容器的进程号
lsof -i:80   #查看80端口是否被host模式的nginx01容器的进程占用

命令示例:

docker inspect -f '{{.State.Pid}}' nginx01
lsof -i:80

输出结果:

[root@MineGi ~]# docker inspect -f '{{.State.Pid}}' nginx01
1797
[root@MineGi ~]# lsof -i:80
lsof: no pwd entry for UID 101
lsof: no pwd entry for UID 101
lsof: no pwd entry for UID 101
lsof: no pwd entry for UID 101
COMMAND  PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   1797     root    6u  IPv4  32104      0t0  TCP *:http (LISTEN)
nginx   1797     root    7u  IPv6  32105      0t0  TCP *:http (LISTEN)
lsof: no pwd entry for UID 101
nginx   1831      101    6u  IPv4  32104      0t0  TCP *:http (LISTEN)
lsof: no pwd entry for UID 101
nginx   1831      101    7u  IPv6  32105      0t0  TCP *:http (LISTEN)
lsof: no pwd entry for UID 101
nginx   1832      101    6u  IPv4  32104      0t0  TCP *:http (LISTEN)
lsof: no pwd entry for UID 101
nginx   1832      101    7u  IPv6  32105      0t0  TCP *:http (LISTEN)
[root@MineGi ~]#

浏览器访问,查看是否能访问nginx。主机模式下的nginx01容器默认使用80端口
10.4.7.11

3.3 配置 container 网络模式

3.3.1 先创建一个bridge模式的容器

命令示例:

docker ps
docker run -itd --name centos01 centos /bin/bash
docker ps

输出结果:

[root@MineGi ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS          PORTS                                   NAMES
1d5f8dfacde5   nginx:latest   "/docker-entrypoint.…"   8 minutes ago    Up 8 minutes                                            nginx01
b9890f1f108d   nginx          "/docker-entrypoint.…"   22 minutes ago   Up 22 minutes   0.0.0.0:9999->80/tcp, :::9999->80/tcp   test2
74ccdf369a5e   nginx          "/docker-entrypoint.…"   22 minutes ago   Up 22 minutes   0.0.0.0:1024->80/tcp, :::1024->80/tcp   test1
[root@MineGi ~]# docker run -itd --name centos01 centos /bin/bash
e1e91a610aabe65b2546db86fe7d61b553e6c1f5083bf71723f440779f1940c9
[root@MineGi ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS          PORTS                                   NAMES
e1e91a610aab   centos         "/bin/bash"               1 second ago     Up 1 second                                             centos01
1d5f8dfacde5   nginx:latest   "/docker-entrypoint.…"   9 minutes ago    Up 8 minutes                                            nginx01
b9890f1f108d   nginx          "/docker-entrypoint.…"   22 minutes ago   Up 22 minutes   0.0.0.0:9999->80/tcp, :::9999->80/tcp   test2
74ccdf369a5e   nginx          "/docker-entrypoint.…"   22 minutes ago   Up 22 minutes   0.0.0.0:1024->80/tcp, :::1024->80/tcp   test1
[root@MineGi ~]#

#搜索bridge模式的容器,是否有centos01
docker ps --filter "network=bridge"  

命令示例:

docker ps --filter "network=bridge"  

输出结果:

[root@MineGi ~]# docker ps --filter "network=bridge"  
CONTAINER ID   IMAGE     COMMAND                   CREATED              STATUS              PORTS                                   NAMES
e1e91a610aab   centos    "/bin/bash"               About a minute ago   Up About a minute                                           centos01
b9890f1f108d   nginx     "/docker-entrypoint.…"   23 minutes ago       Up 23 minutes       0.0.0.0:9999->80/tcp, :::9999->80/tcp   test2
74ccdf369a5e   nginx     "/docker-entrypoint.…"   23 minutes ago       Up 23 minutes       0.0.0.0:1024->80/tcp, :::1024->80/tcp   test1
[root@MineGi ~]#

#查看容器进程号
docker inspect -f '{{.State.Pid}}' centos01
 
#查看容器的进程、网络、文件系统等命名空间编号
ls -l /proc/9684/ns

命令示例:

docker inspect -f '{{.State.Pid}}' centos01
ls -l /proc/2360/ns

输出结果:

[root@MineGi ~]# docker inspect -f '{{.State.Pid}}' centos01
2360
[root@MineGi ~]# ls -l /proc/2360/ns
总用量 0
lrwxrwxrwx 1 root root 0 12月 15 11:10 ipc -> ipc:[4026532575]
lrwxrwxrwx 1 root root 0 12月 15 11:10 mnt -> mnt:[4026532573]
lrwxrwxrwx 1 root root 0 12月 15 11:08 net -> net:[4026532578]
lrwxrwxrwx 1 root root 0 12月 15 11:10 pid -> pid:[4026532576]
lrwxrwxrwx 1 root root 0 12月 15 11:10 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 12月 15 11:10 uts -> uts:[4026532574]
[root@MineGi ~]#

3.3.2 创建 container 模式的容器centos02,共享centos01容器的网卡

命令示例:

docker run -itd --name centos02 --net=container:centos01 centos /bin/bash
docker ps 

输出结果:

[root@MineGi ~]# docker run -itd --name centos02 --net=container:centos01 centos /bin/bash
0003fffe697001140e5049d12052c774b49d46cfd8ccf699c46844d841837942
[root@MineGi ~]# docker ps 
CONTAINER ID   IMAGE          COMMAND                   CREATED             STATUS             PORTS                                   NAMES
0003fffe6970   centos         "/bin/bash"               2 seconds ago       Up 2 seconds                                               centos02
e1e91a610aab   centos         "/bin/bash"               About an hour ago   Up About an hour                                           centos01
1d5f8dfacde5   nginx:latest   "/docker-entrypoint.…"   About an hour ago   Up About an hour                                           nginx01
b9890f1f108d   nginx          "/docker-entrypoint.…"   2 hours ago         Up 2 hours         0.0.0.0:9999->80/tcp, :::9999->80/tcp   test2
74ccdf369a5e   nginx          "/docker-entrypoint.…"   2 hours ago         Up 2 hours         0.0.0.0:1024->80/tcp, :::1024->80/tcp   test1
[root@MineGi ~]# 

#查看centos02容器的网络模式是否是container
docker inspect centos02 | grep NetworkMode

命令示例:

docker inspect centos02 | grep NetworkMode
docker inspect -f '{{.HostConfig.NetworkMode}}' centos02

输出结果:

[root@MineGi ~]# docker inspect centos02 | grep NetworkMode
            "NetworkMode": "container:e1e91a610aabe65b2546db86fe7d61b553e6c1f5083bf71723f440779f1940c9",
[root@MineGi ~]# docker inspect -f '{{.HostConfig.NetworkMode}}' centos02
container:e1e91a610aabe65b2546db86fe7d61b553e6c1f5083bf71723f440779f1940c9
[root@MineGi ~]#

#查看容器进程号
docker inspect -f '{{.State.Pid}}' centos02
 
#查看容器的进程、网络、文件系统等命名空间编号
ls -l /proc/9967/ns

命令示例:

docker inspect -f '{{.State.Pid}}' centos02
ls -l /proc/2739/ns

输出结果:

[root@MineGi ~]# docker inspect -f '{{.State.Pid}}' centos02
2739
[root@MineGi ~]# ls -l /proc/2739/ns
总用量 0
lrwxrwxrwx 1 root root 0 12月 15 12:23 ipc -> ipc:[4026532636]
lrwxrwxrwx 1 root root 0 12月 15 12:23 mnt -> mnt:[4026532634]
lrwxrwxrwx 1 root root 0 12月 15 12:23 net -> net:[4026532578]
lrwxrwxrwx 1 root root 0 12月 15 12:23 pid -> pid:[4026532637]
lrwxrwxrwx 1 root root 0 12月 15 12:23 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 12月 15 12:23 uts -> uts:[4026532635]
[root@MineGi ~]#

命令示例:观察可以发现两个容器的 net namespace 编号相同

docker inspect -f '{{.State.Pid}}' centos01
docker inspect -f '{{.State.Pid}}' centos02
ls -l /proc/2360/ns
ls -l /proc/2739/ns

输出结果:

[root@MineGi ~]# docker inspect -f '{{.State.Pid}}' centos01
2360
[root@MineGi ~]# docker inspect -f '{{.State.Pid}}' centos02
2739
[root@MineGi ~]# ls -l /proc/2360/ns
总用量 0
lrwxrwxrwx 1 root root 0 12月 15 11:10 ipc -> ipc:[4026532575]
lrwxrwxrwx 1 root root 0 12月 15 11:10 mnt -> mnt:[4026532573]
lrwxrwxrwx 1 root root 0 12月 15 11:08 net -> net:[4026532578]
lrwxrwxrwx 1 root root 0 12月 15 11:10 pid -> pid:[4026532576]
lrwxrwxrwx 1 root root 0 12月 15 11:10 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 12月 15 11:10 uts -> uts:[4026532574]
[root@MineGi ~]# ls -l /proc/2739/ns
总用量 0
lrwxrwxrwx 1 root root 0 12月 15 12:23 ipc -> ipc:[4026532636]
lrwxrwxrwx 1 root root 0 12月 15 12:23 mnt -> mnt:[4026532634]
lrwxrwxrwx 1 root root 0 12月 15 12:23 net -> net:[4026532578]
lrwxrwxrwx 1 root root 0 12月 15 12:23 pid -> pid:[4026532637]
lrwxrwxrwx 1 root root 0 12月 15 12:23 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 12月 15 12:23 uts -> uts:[4026532635]
[root@MineGi ~]#

3.4 配置 none 网络模式

#创建网络模式为 none 的centos03容器
docker run -itd --name centos03 --network=none centos:7 /bin/bash

命令示例:

docker run -itd --name centos03 --network=none centos /bin/bash
docker ps 

输出结果:

[root@MineGi ~]# docker run -itd --name centos03 --network=none centos /bin/bash
e7320ceaf62c58fd4f4c34f95d9bdf277885f8a0f6bebf9445893f8dc4dc6784
[root@MineGi ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED             STATUS             PORTS                                   NAMES
e7320ceaf62c   centos         "/bin/bash"               4 seconds ago       Up 3 seconds                                               centos03
0003fffe6970   centos         "/bin/bash"               6 minutes ago       Up 6 minutes                                               centos02
e1e91a610aab   centos         "/bin/bash"               About an hour ago   Up About an hour                                           centos01
1d5f8dfacde5   nginx:latest   "/docker-entrypoint.…"   About an hour ago   Up About an hour                                           nginx01
b9890f1f108d   nginx          "/docker-entrypoint.…"   2 hours ago         Up 2 hours         0.0.0.0:9999->80/tcp, :::9999->80/tcp   test2
74ccdf369a5e   nginx          "/docker-entrypoint.…"   2 hours ago         Up 2 hours         0.0.0.0:1024->80/tcp, :::1024->80/tcp   test1
[root@MineGi ~]# 

#查看centos03容器的网络模式是否是node
docker inspect centos03

命令示例:

docker inspect -f '{{.HostConfig.NetworkMode}}' centos03

输出结果:

[root@MineGi ~]# docker inspect -f '{{.HostConfig.NetworkMode}}' centos03
none
[root@MineGi ~]# 

#搜索网络模式为none的容器
docker ps --filter "network=none"

命令示例:

docker ps --filter "network=none"

输出结果:

[root@MineGi ~]# docker ps --filter "network=none"
CONTAINER ID   IMAGE     COMMAND       CREATED              STATUS              PORTS     NAMES
e7320ceaf62c   centos    "/bin/bash"   About a minute ago   Up About a minute             centos03
[root@MineGi ~]# 

3.5 配置 bridge 网络模式

情况说明:bridge模式是docker的默认网络模式,不用--net参数,就是bridge模式

#创建网络模式为 bridge(默认模式) 的centos04容器,不用--net参数指定
docker run -itd --name centos04 centos:7 /bin/bash

命令示例:

docker run -itd --name centos04 centos /bin/bash
docker ps

输出结果:

[root@MineGi ~]# docker run -itd --name centos04 centos /bin/bash
54222634464cb125db3b8282568509028fe33a10fdc64035c46c1774fc9b52c5
[root@MineGi ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED             STATUS             PORTS                                   NAMES
54222634464c   centos         "/bin/bash"               2 seconds ago       Up 2 seconds                                               centos04
e7320ceaf62c   centos         "/bin/bash"               3 minutes ago       Up 3 minutes                                               centos03
0003fffe6970   centos         "/bin/bash"               10 minutes ago      Up 10 minutes                                              centos02
e1e91a610aab   centos         "/bin/bash"               About an hour ago   Up About an hour                                           centos01
1d5f8dfacde5   nginx:latest   "/docker-entrypoint.…"   2 hours ago         Up 2 hours                                                 nginx01
b9890f1f108d   nginx          "/docker-entrypoint.…"   2 hours ago         Up 2 hours         0.0.0.0:9999->80/tcp, :::9999->80/tcp   test2
74ccdf369a5e   nginx          "/docker-entrypoint.…"   2 hours ago         Up 2 hours         0.0.0.0:1024->80/tcp, :::1024->80/tcp   test1
[root@MineGi ~]#

#查看centos04容器的网络模式是否是bridge
docker inspect centos04

命令示例:

docker inspect -f '{{.HostConfig.NetworkMode}}' centos04

输出结果:

[root@MineGi ~]# docker inspect -f '{{.HostConfig.NetworkMode}}' centos04
bridge
[root@MineGi ~]# 

#搜索网络模式为bridge的容器
docker ps --filter "network=bridge"

命令示例:

docker ps --filter "network=bridge"

输出结果:

[root@MineGi ~]# docker ps --filter "network=bridge"
CONTAINER ID   IMAGE     COMMAND                   CREATED             STATUS             PORTS                                   NAMES
54222634464c   centos    "/bin/bash"               5 minutes ago       Up 5 minutes                                               centos04
e1e91a610aab   centos    "/bin/bash"               About an hour ago   Up About an hour                                           centos01
b9890f1f108d   nginx     "/docker-entrypoint.…"   2 hours ago         Up 2 hours         0.0.0.0:9999->80/tcp, :::9999->80/tcp   test2
74ccdf369a5e   nginx     "/docker-entrypoint.…"   2 hours ago         Up 2 hours         0.0.0.0:1024->80/tcp, :::1024->80/tcp   test1
[root@MineGi ~]#

3.6 配置 user-defined network 模式(自定义网络)

#直接使用bridge模式,是无法支持指定IP运行docker的,例如执行以下命令就会报错
docker run -itd --name centos05 --network bridge --ip 172.17.0.100 centos:7 /bin/bash

命令示例:

docker run -itd --name centos05 --network bridge --ip 172.17.0.100 centos /bin/bash
docker ps 

输出结果:

[root@MineGi ~]# docker run -itd --name centos05 --network bridge --ip 172.17.0.100 centos /bin/bash
docker: Error response from daemon: invalid config for network bridge: invalid endpoint settings:
user specified IP address is supported on user defined networks only.
See 'docker run --help'.
[root@MineGi ~]# docker ps 
CONTAINER ID   IMAGE          COMMAND                   CREATED             STATUS             PORTS                                   NAMES
54222634464c   centos         "/bin/bash"               6 minutes ago       Up 6 minutes                                               centos04
e7320ceaf62c   centos         "/bin/bash"               10 minutes ago      Up 10 minutes                                              centos03
0003fffe6970   centos         "/bin/bash"               17 minutes ago      Up 17 minutes                                              centos02
e1e91a610aab   centos         "/bin/bash"               About an hour ago   Up About an hour                                           centos01
1d5f8dfacde5   nginx:latest   "/docker-entrypoint.…"   2 hours ago         Up 2 hours                                                 nginx01
b9890f1f108d   nginx          "/docker-entrypoint.…"   2 hours ago         Up 2 hours         0.0.0.0:9999->80/tcp, :::9999->80/tcp   test2
74ccdf369a5e   nginx          "/docker-entrypoint.…"   2 hours ago         Up 2 hours         0.0.0.0:1024->80/tcp, :::1024->80/tcp   test1
[root@MineGi ~]# 

3.6.1 创建自定义网络
#可以先自定义网络,再使用指定IP运行docker
docker network create --subnet=172.20.0.0/16 --opt "com.docker.network.bridge.name"="docker1"  mynetwork
 
#docker1 为执行 ifconfig -a 命令时,显示的网卡名,如果不使用 --opt 参数指定此名称,那你在使用 ifconfig -a 命令查看网络信息时,看到的是类似 br-110eb56a0b22 这样的名字,这显然不怎么好记
#mynetwork 为执行 docker network list 命令时,显示的bridge网络模式名称

命令示例:

docker network create --subnet=172.20.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork
ifconfig docker1
ifconfig docker0

输出结果:

[root@MineGi ~]# ifconfig docker1
docker1: error fetching interface information: Device not found
[root@MineGi ~]# docker network create --subnet=172.20.0.0/16 --opt "com.docker.network.bridge.name"="docker1"  mynetwork
36ac46c788ff91d20635fd57dfc9c1fbcbd172a9308693c8e37c79fa4cdd5e73
[root@MineGi ~]# ifconfig docker1
docker1: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.20.0.1  netmask 255.255.0.0  broadcast 172.20.255.255
        ether 02:42:57:18:90:90  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@MineGi ~]# ifconfig docker0
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:67ff:fecb:5ef4  prefixlen 64  scopeid 0x20<link>
        ether 02:42:67:cb:5e:f4  txqueuelen 0  (Ethernet)
        RX packets 17  bytes 1877 (1.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 23  bytes 3263 (3.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@MineGi ~]# 

brctl show   #查看网桥信息

命令示例:

brctl show

输出结果:

[root@MineGi ~]# brctl show
bridge name    bridge id        STP enabled    interfaces
docker0        8000.024267cb5ef4    no        veth1dfb5af
                            veth828628f
                            vethb2c0803
                            vethf894597
docker1        8000.024257189090    no        
[root@MineGi ~]# 

3.6.2 使用指定IP创建并运行docker

命令示例:

docker run -itd --name centos05 --net mynetwork --ip 172.20.0.100 centos /bin/bash
docker ps 

输出结果:

[root@MineGi ~]# docker run -itd --name centos05 --net mynetwork --ip 172.20.0.100 centos /bin/bash
32a5c1de696108805f045e5778bb5d875314d4c05f64b91264de3ba4138afe7e
[root@MineGi ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS          PORTS                                   NAMES
32a5c1de6961   centos         "/bin/bash"               7 seconds ago    Up 6 seconds                                            centos05
54222634464c   centos         "/bin/bash"               11 minutes ago   Up 11 minutes                                           centos04
e7320ceaf62c   centos         "/bin/bash"               15 minutes ago   Up 15 minutes                                           centos03
0003fffe6970   centos         "/bin/bash"               22 minutes ago   Up 22 minutes                                           centos02
e1e91a610aab   centos         "/bin/bash"               2 hours ago      Up 2 hours                                              centos01
1d5f8dfacde5   nginx:latest   "/docker-entrypoint.…"   2 hours ago      Up 2 hours                                              nginx01
b9890f1f108d   nginx          "/docker-entrypoint.…"   2 hours ago      Up 2 hours      0.0.0.0:9999->80/tcp, :::9999->80/tcp   test2
74ccdf369a5e   nginx          "/docker-entrypoint.…"   2 hours ago      Up 2 hours      0.0.0.0:1024->80/tcp, :::1024->80/tcp   test1
[root@MineGi ~]#

#查看centos05容器的IP是否是我们设置的172.20.0.100
docker inspect centos05

命令示例:

docker inspect centos05 |grep IPAddress
docker inspect -f '{{.NetworkSettings.Networks.mynetwork.IPAddress}}' centos05

输出结果:

[root@MineGi ~]# docker inspect centos05 |grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.20.0.100",
[root@MineGi ~]# docker inspect -f '{{.NetworkSettings.Networks.mynetwork.IPAddress}}' centos05
172.20.0.100
[root@MineGi ~]# 

二、Docker 资源控制

1、CPU 资源控制

Control Groups (cgroups):

  • cgroups,是一个非常强大的linux内核工具,他不仅可以限制被 namespace 隔离起来的资源, 还可以为资源设置权重、计算使用量、操控进程启停等等。 所以 cgroups(Control groups)实现了对资源的配额和度量

cgroups有四大功能:

  • 资源限制:可以对任务使用的资源总额进行限制
  • 优先级分配:通过分配的cpu时间片数量以及磁盘IO带宽大小,实际上相当于控制了任务运行优先级
  • 资源统计:可以统计系统的资源使用量,如cpu时长,内存用量等
  • 任务控制:cgroup可以对任务执行挂起、恢复等操作

1.1 设置CPU使用率上限

  • Linux通过CFS(Completely Fair Scheduler,完全公平调度器)来调度各个进程对CPU的使用。CFS默认的调度周期是100ms
  • 我们可以设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少 CPU 时间
  • 使用 --cpu-period 即可设置调度周期,使用 --cpu-quota 即可设置在每个周期内容器能使用的CPU时间。两者可以配合使用
  • CFS 周期的有效范围是 1ms~1s,对应的 --cpu-period 的数值范围是 1000~1000000。 周期100毫秒
  • 而容器的 CPU 配额必须不小于 1ms,即 --cpu-quota 的值必须 >= 1000
#创建并运行一个centos06容器
docker run -itd --name centos06 centos:7 /bin/bash
 
#切换到指定 Docker 容器的 CPU 控制组目录
cd /sys/fs/cgroup/cpu/docker/74851f0e67a3341be757c4279a270f84f9d1e05a97a48c8e999424077c659545/
#/sys/fs/cgroup/cpu/docker/: 这是 Docker 容器的 CPU 控制组目录所在的路径。控制组是 Linux 内核提供的一种机制,用于对进程组进行资源控制和管理

命令示例:

docker run -itd --name centos06 centos /bin/bash
docker ps -a |grep centos06
cd /sys/fs/cgroup/cpu/docker/7dc19460385b80581920200baf61726c2c03a4f7cc99bbd9eb4d552414593667
ls

输出结果:

[root@MineGi ~]# docker run -itd --name centos06 centos /bin/bash
7dc19460385b80581920200baf61726c2c03a4f7cc99bbd9eb4d552414593667
[root@MineGi ~]# docker ps -a |grep centos06
7dc19460385b   centos         "/bin/bash"               4 seconds ago    Up 2 seconds                                            centos06
[root@MineGi ~]# cd /sys/fs/cgroup/cpu/docker/7dc19460385b80581920200baf61726c2c03a4f7cc99bbd9eb4d552414593667/
[root@MineGi 7dc19460385b80581920200baf61726c2c03a4f7cc99bbd9eb4d552414593667]# ls
cgroup.clone_children  cgroup.procs  cpuacct.usage         cpu.cfs_period_us  cpu.rt_period_us   cpu.shares  notify_on_release
cgroup.event_control   cpuacct.stat  cpuacct.usage_percpu  cpu.cfs_quota_us   cpu.rt_runtime_us  cpu.stat    tasks
[root@MineGi 7dc19460385b80581920200baf61726c2c03a4f7cc99bbd9eb4d552414593667]# 

Docker 容器的 CPU 控制组目录

说明

cgroup.clone_children

用于控制是否允许子 cgroup 继承父 cgroup 的配置。如果设置为 1,则子 cgroup 将继承父 cgroup 的配置;如果设置为 0,则子 cgroup 将不继承父 cgroup 的配置

cgroup.procs

列出了当前在该 cgroup 中运行的进程(任务)的 PID。可以通过向这个文件写入 PID,将进程移动到该 cgroup 中

cpuacct.usage

包含了容器在 CPU 上消耗的总时间,以纳秒为单位。可以用来监视容器在 CPU 上的实际使用情况

cpu.cfs_period_us

用于设置 CPU CFS(Completely Fair Scheduler)周期的长度,单位是微秒。决定了任务在一个周期内能够使用的 CPU 时间

cpu.rt_period_us

用于设置实时调度任务的周期长度,单位是微秒。用于限制实时任务在一个周期内的执行时间

cpu.shares

用于设置容器相对于其他容器的 CPU 分配权重。通过调整这个值,可以影响容器在 CPU 分配上的优先级

notify_on_release:

用于控制当 cgroup 中的最后一个任务退出时是否通知。如果设置为 1,则当 cgroup 中的最后一个任务退出时会收到通知;如果设置为 0,则不会收到通知

cgroup.event_control

用于控制 cgroup 事件的通知。可以用来注册和取消事件通知

cpuacct.stat

包含了有关 CPU 账户的统计信息,例如用户态和内核态的 CPU 时间消耗

cpuacct.usage_percpu

包含了每个 CPU 核心上容器消耗的 CPU 时间,以纳秒为单位。可以用来查看每个 CPU 核心上的 CPU 使用情况

cpu.cfs_quota_us

用于设置容器在一个周期内能够使用的 CPU 时间配额,单位是微秒。超过这个配额的部分将被限制

cpu.rt_runtime_us

用于设置实时调度任务的运行时间配额,单位是微秒。用于限制实时任务的运行时间

cpu.stat

包含了有关 CPU 使用情况的统计信息,例如 CPU 时间消耗、时间片的使用情况等

tasks

列出了当前在该 cgroup 中运行的进程(任务)的 PID。可以通过向这个文件写入 PID,将进程移动到该 cgroup 中

#查看容器在一个周期内能够使用的 CPU 时间配额
cat cpu.cfs_quota_us 
#默认值 -1,表示该容器没有被限制在一个周期内可以使用的 CPU 时间配额
#如果设为50000,表示占用50000/100000=50%的CPU
 
#查看CPU CFS 调度器的周期长度,单位也是微秒(us)
cat cpu.cfs_period_us
#CPU CFS 调度器的周期长度为100毫秒。在一个周期内,容器的进程可以使用的 CPU 时间总量受限于这个周期的长度

命令示例:

cat cpu.cfs_quota_us
cat cpu.cfs_period_us

输出结果:

[root@MineGi 74851f0e67a3341be757c4279a270f84f9d1e05a97a48c8e999424077c659545]# cat cpu.cfs_quota_us 
-1
[root@MineGi 74851f0e67a3341be757c4279a270f84f9d1e05a97a48c8e999424077c659545]# cat cpu.cfs_period_us 
100000
[root@MineGi 74851f0e67a3341be757c4279a270f84f9d1e05a97a48c8e999424077c659545]# 

1.1.1 设置50%的比例分配CPU使用时间上限

命令示例:

echo 50000 |tee cpu.cfs_quota_us 

输出结果:

[root@MineGi 74851f0e67a3341be757c4279a270f84f9d1e05a97a48c8e999424077c659545]# echo 50000 |tee cpu.cfs_quota_us 
50000
[root@MineGi 74851f0e67a3341be757c4279a270f84f9d1e05a97a48c8e999424077c659545]# 

1.1.2 进入到容器中,进行CPU压力测试
#进入到centos06的容器内
docker exec -it centos06 /bin/bash
 
#编写压力测试的循环脚本
vi cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done
 
#添加执行权限,并执行脚本
chmod +x cpu.sh
source cpu.sh

命令示例:

docker exec -it centos06 /bin/bash

cat >cpu.sh <<'eof'
#!/bin/bash
i=0
while true
do
let i++
done
eof

bash cpu.sh

输出结果:

[root@MineGi ~]# docker exec -it centos06 /bin/bash
[root@7dc19460385b /]# cat >cpu.sh <<'eof'
> #!/bin/bash
> i=0
> while true
> do
> let i++
> done
> eof
[root@7dc19460385b /]# bash cpu.sh

1.1.3 查看CPU占用资源
top     #查看这个压力测试的循环脚本占了50%左右的CPU资源

命令示例:

top

输出结果:

[root@MineGi ~]# top
top - 12:58:27 up  2:14,  3 users,  load average: 0.74, 0.25, 0.12
Tasks: 143 total,   4 running, 139 sleeping,   0 stopped,   0 zombie
%Cpu(s): 25.1 us,  0.2 sy,  0.0 ni, 74.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  2027900 total,  1098732 free,   339196 used,   589972 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  1531732 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                          
  3956 root      20   0   11904   1540   1296 R  50.2  0.1   0:38.57 bash                                             
  3989 root      20   0  162124   2288   1600 R   0.7  0.1   0:00.06 top                                              
  2988 root      20   0 1236704  10028   4652 S   0.3  0.5   0:00.20 containerd-shim                                  
  3544 root      20   0       0      0      0 S   0.3  0.0   0:00.11 kworker/u256:0                                   
     1 root      20   0  125484   3896   2580 S   0.0  0.2   0:02.75 systemd                                          
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.02 kthreadd                                         
     4 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H                                     
     6 root      20   0       0      0      0 S   0.0  0.0   0:00.15 ksoftirqd/0                                      
     7 root      rt   0       0      0      0 S   0.0  0.0   0:00.15 migration/0                                      
     8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh                                           
     9 root      20   0       0      0      0 R   0.0  0.0   0:01.15 rcu_sched                                        
    10 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 lru-add-drain                                    
    11 root      rt   0       0      0      0 S   0.0  0.0   0:00.06 watchdog/0                                       
    12 root      rt   0       0      0      0 S   0.0  0.0   0:00.08 watchdog/1                                       
    13 root      rt   0       0      0      0 S   0.0  0.0   0:00.03 migration/1                                      
    14 root      20   0       0      0      0 S   0.0  0.0   0:00.12 ksoftirqd/1                     

docker stats  #查看容器占用的系统资源信息

命令示例:

docker stats

输出结果:

CONTAINER ID   NAME       CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O         PIDS
7dc19460385b   centos06   51.80%    1.309MiB / 1.934GiB   0.07%     656B / 0B         2.82MB / 0B       3
32a5c1de6961   centos05   0.00%     540KiB / 1.934GiB     0.03%     1.1kB / 0B        0B / 0B           1
54222634464c   centos04   0.00%     536KiB / 1.934GiB     0.03%     656B / 0B         0B / 0B           1
e7320ceaf62c   centos03   0.00%     536KiB / 1.934GiB     0.03%     0B / 0B           0B / 0B           1
0003fffe6970   centos02   0.00%     536KiB / 1.934GiB     0.03%     656B / 0B         0B / 0B           1
e1e91a610aab   centos01   0.00%     532KiB / 1.934GiB     0.03%     656B / 0B         0B / 0B           1
1d5f8dfacde5   nginx01    0.00%     2.383MiB / 1.934GiB   0.12%     0B / 0B           0B / 16.4kB       3
b9890f1f108d   test2      0.00%     2.383MiB / 1.934GiB   0.12%     698B / 0B         0B / 17.4kB       3
74ccdf369a5e   test1      0.00%     4.578MiB / 1.934GiB   0.23%     3.92kB / 2.12kB   30.7MB / 24.6kB   3

注意事项:如果不对 cpu.cfs_quota_us 进行限制,则默认值为-1的情况下,进行压力测试,CPU资源使用率接近100%

总结:
设置设置50%的比例分配CPU使用时间上限的方法
 
方法一:创建并运行容器时指定分配CPU使用时间的比例进行限额
docker run -itd --name test --cpu-quota 50000 centos:7 /bin/bash
 
方法二:进入Docker容器的 CPU 控制组目录,并更改cpu.cfs_quota_us文件内容为指定分配CPU使用时间的比例来进行限额
cd /sys/fs/cgroup/cpu/docker/a4a05d1b6b69644fec398777baa35daeb82606c4cc540d65be0d3e2259737f27/
echo 50000 > cpu.cfs_quota_us 

1.2 设置CPU资源占用比(设置多个容器时才有效)

情况说明:

  • Docker 通过 --cpu-shares 指定 CPU 份额,默认值为1024,值为1024的倍数
  • 虚拟机修改成单核CPU才有明显的效果
1.2.1 创建并运行两个容器为 c1 和 c2,并设置容器的权重,使得c1和c2的CPU资源占比为1/3和2/3
#创建并运行两个容器为 c1 和 c2,若只有这两个容器,设置容器的权重,使得c1和c2的CPU资源占比为1/3和2/3
docker run -itd --name c1 --cpu-shares 512 centos:7    
docker run -itd --name c2 --cpu-shares 1024 centos:7

命令示例:

docker stop `docker ps -aq`
docker ps
docker run -itd --name c1 --cpu-shares 512 centos:7
docker run -itd --name c2 --cpu-shares 1024 centos:7
docker ps

输出结果:

[root@MineGi ~]# docker stop `docker ps -aq`
7dc19460385b
32a5c1de6961
54222634464c
e7320ceaf62c
0003fffe6970
e1e91a610aab
1d5f8dfacde5
b9890f1f108d
74ccdf369a5e
[root@MineGi ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@MineGi ~]# docker run -itd --name c1 --cpu-shares 512 centos:7
86f812ea20466be990cbaa9f2846f9999b0390069981f01e7902b4c19f98a517
[root@MineGi ~]# docker run -itd --name c2 --cpu-shares 1024 centos:7
d5d91237a973962a2a4a152a3aadc68aed45efdc77c596c83affa36c5c4bfd11
[root@MineGi ~]# docker ps
CONTAINER ID   IMAGE      COMMAND       CREATED         STATUS         PORTS     NAMES
d5d91237a973   centos:7   "/bin/bash"   2 seconds ago   Up 2 seconds             c2
86f812ea2046   centos:7   "/bin/bash"   7 seconds ago   Up 7 seconds             c1
[root@MineGi ~]# 

1.2.2 分别进入这两个容器,并进行压力测试
#分别进入这两个容器,并进行压力测试
docker exec -it c1 /bin/bash    #进入到c1容器内
yum install -y epel-release     #安装额外源
yum install -y stress           #安装stress压力测试工具
stress -c 4   #产生四个进程,每个进程都反复不停的计算随机数的平方根
 
docker exec -it c2 /bin/bash    ##进入到c2容器内
yum install -y epel-release
yum install -y stress
stress -c 4

命令示例:

docker exec -it c1 /bin/bash
curl -s -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum install -y epel-release
yum install -y stress
stress -c 4

输出结果:

[root@MineGi ~]# docker exec -it c1 /bin/bash
[root@86f812ea2046 /]# curl -s -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@86f812ea2046 /]# yum install -y -q epel-release
Package epel-release-7-14.noarch already installed and latest version
[root@86f812ea2046 /]# yum install -y -q stress
Package stress-1.0.4-16.el7.x86_64 already installed and latest version
[root@86f812ea2046 /]# stress -c 4
stress: info: [241] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd

[root@MineGi ~]# docker exec -it c2 /bin/bash
[root@d5d91237a973 /]# curl -s -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@d5d91237a973 /]# yum install -y -q epel-release
Package epel-release-7-14.noarch already installed and latest version
[root@d5d91237a973 /]# yum install -y -q stress
Package stress-1.0.4-16.el7.x86_64 already installed and latest version
[root@d5d91237a973 /]# stress -c 4
stress: info: [131] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd

1.2.3 查看容器运行状态(动态更新)
docker stats  #查看容器占用的系统资源信息

命令示例:

docker stats

输出结果:

CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O          BLOCK I/O     PIDS
d5d91237a973   c2        132.83%   271.7MiB / 1.934GiB   13.72%    47MB / 612kB     0B / 50.7MB   7
86f812ea2046   c1        64.69%    271.7MiB / 1.934GiB   13.72%    47.2MB / 674kB   0B / 51.5MB   7

1.3 设置容器绑定指定的CPU

情况说明:先分配虚拟机4个CPU核数

1.3.1 创建并运行bak容器绑定CPU1和CPU3

命令示例:

lscpu |grep -i ^"cpu("
lscpu |grep -i ^"cpu("
docker stop `docker ps -aq`
docker run -itd --name bak --cpuset-cpus 1,3 centos:7 /bin/bash
systemctl restart docker
docker run -itd --name bak --cpuset-cpus 1,3 centos:7 /bin/bash
docker ps 

输出结果:

[root@MineGi ~]# lscpu |grep -i ^"cpu("
CPU(s):                2
[root@MineGi ~]# lscpu |grep -i ^"cpu("
CPU(s):                4
[root@MineGi ~]# docker stop `docker ps -aq`
77981229d9b9
545beac6543c
74851f0e67a3
5b837c99681c
e02df7fcccaf
9b407d51c254
80ae98c76e92
96dd5a052f61
26c5f0d34d64
cad1f45206bb
6a7f23538317
[root@MineGi ~]# docker run -itd --name bak --cpuset-cpus 1,3 centos:7 /bin/bash
docker: Error response from daemon: Requested CPUs are not available - requested 1,3, available: 0-1.
See 'docker run --help'.
[root@MineGi ~]# systemctl restart docker
[root@MineGi ~]# docker run -itd --name bak --cpuset-cpus 1,3 centos:7 /bin/bash
c8740f0208dd49268b8e86af98473f480454f0f804bb06e52065530b5d1efe92
[root@MineGi ~]# docker ps
CONTAINER ID   IMAGE      COMMAND       CREATED         STATUS         PORTS     NAMES
c8740f0208dd   centos:7   "/bin/bash"   4 seconds ago   Up 3 seconds             bak
[root@MineGi ~]# 

1.3.2 进入容器,进行压力测试
#进入容器,进行压力测试
docker exec -it bak /bin/bash    #进入到容器内
yum install -y epel-release     #安装额外源
yum install -y stress           #安装stress压力测试工具
stress -c 4   #产生四个进程,每个进程都反复不停的计算随机数的平方根

命令示例:

docker exec -it bak /bin/bash
curl -s -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum install -y epel-release
yum install -y stress 
stress -c 4

输出结果:

[root@MineGi ~]# docker exec -it bak /bin/bash
[root@7996d05df7b9 /]# curl -s -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@7996d05df7b9 /]# yum install -y -q epel-release
Package epel-release-7-14.noarch already installed and latest version
[root@7996d05df7b9 /]# yum install -y -q stress
Package stress-1.0.4-16.el7.x86_64 already installed and latest version
[root@7996d05df7b9 /]# stress -c 4
stress: info: [158] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd

1.3.3 使用top查看CPU绑定情况

命令示例:

top

输出结果:

[root@MineGi ~]# top
top - 14:01:06 up 13 min,  2 users,  load average: 3.87, 2.02, 0.83
Tasks: 131 total,   5 running, 126 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.0 us,  0.3 sy,  0.0 ni, 99.7 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.7 us,  0.0 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  4026168 total,  3134096 free,   253948 used,   638124 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  3537264 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                          
  1920 root      20   0    7312     96      0 R  55.8  0.0   1:41.95 stress                                           
  1918 root      20   0    7312     96      0 R  48.2  0.0   1:41.95 stress                                           
  1921 root      20   0    7312     96      0 R  48.2  0.0   1:41.79 stress                                           
  1919 root      20   0    7312     96      0 R  47.8  0.0   1:41.72 stress                                           
  1678 root      20   0 1236448  10252   4740 S   0.7  0.3   0:00.81 containerd-shim                                  
     1 root      20   0  125468   3908   2576 S   0.0  0.1   0:02.74 systemd                                          
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.02 kthreadd                                         
     4 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H                                     
     5 root      20   0       0      0      0 S   0.0  0.0   0:00.02 kworker/u256:0                                   
     6 root      20   0       0      0      0 S   0.0  0.0   0:00.05 ksoftirqd/0                                      
     7 root      rt   0       0      0      0 S   0.0  0.0   0:00.12 migration/0                                      
     8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh                                           
     9 root      20   0       0      0      0 S   0.0  0.0   0:00.70 rcu_sched                                        
    10 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 lru-add-drain 

2、对内存使用的限制

2.1 使用--memory标志

情况说明:

  • 在Docker中,可以使用内置的功能来限制容器可以使用的内存量
  • 可以在运行容器时使用--memory标志来设置容器可以使用的内存量,单位可以是字节、千字节、兆字节、千兆字节或者吉字节
#-m(--memory=) 选项用于限制容器可以使用的最大内存
docker run -itd --name nc -m 512m centos:7 /bin/bash
#限制新容器nc的最大使用内存为512MB

命令示例:

docker run -itd --name nc -m 512m centos:7 /bin/bash
docker ps

输出结果:

[root@MineGi ~]# docker run -itd --name nc -m 512m centos:7 /bin/bash
e181c2c0445560f7f9bdf75a2fb3dc02af0a9f104900d756261ef4a9ca3a797f
[root@MineGi ~]# docker ps
CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS          PORTS     NAMES
e181c2c04455   centos:7   "/bin/bash"   11 seconds ago   Up 10 seconds             nc
7996d05df7b9   centos:7   "/bin/bash"   13 minutes ago   Up 13 minutes             bak
[root@MineGi ~]#

docker stats  #查看容器占用的系统资源信息

命令示例:

docker stats

输出结果:

CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT    MEM %     NET I/O          BLOCK I/O        PIDS
e181c2c04455   nc        0.00%     400KiB / 512MiB      0.08%     656B / 0B        0B / 0B          1
7996d05df7b9   bak       203.42%   286.5MiB / 3.84GiB   7.29%     47.1MB / 690kB   117MB / 51.4MB   7

2.2 使用--memory-swap标志

情况说明:

  • --memory-swap标志可以用来设置容器可以使用的交换空间大小。强调一下,--memory-swap 是必须要与 --memory 一起使用的
  • 正常情况下,--memory-swap 的值包含容器可用内存和可用 swap。所以 -m 300m --memory-swap=1g 的含义为:容器可以使用 300M 的物理内存,并且可以使用 700M(1G - 300)的 swap
  • 如果 --memory-swap 设置为 0 或者 不设置,则容器可以使用的 swap 大小为 -m 值的两倍
  • 如果 --memory-swap 的值和 -m 值相同,则容器表示禁用交换空间swap
  • 如果 --memory-swap 值为 -1,它表示容器程序使用的内存受限,而可以使用的 swap 空间使用不受限制(宿主机有多少 swap 容器就可以使用多少)
docker run -itd --name swp -m 200m --memory-swap=1g nginx:latest --vm 1 --vm-bypes 100m
#--vm 1:启动1个内容工作线程
#--vm-bypes:每个线程分配100M

3、对磁盘IO配额控制(blkio)的限制

--device-read-bps:限制某个设备上的读速度bps(数据量),单位可以是kb、mb(M)或者gb
例:docker run -itd --name test9 --device-read-bps /dev/sda:1M  centos:7 /bin/bash
 
--device-write-bps : 限制某个设备上的写速度bps(数据量),单位可以是kb、mb(M)或者gb
例:docker run -itd --name test10 --device-write-bps /dev/sda:1mb centos:7 /bin/bash
 
--device-read-iops :限制读某个设备的iops(次数)
 
--device-write-iops :限制写入某个设备的iops(次数)

3.1 限制容器的读写速度

情况说明:此测试只能在旧版本的docker有效,如20.10.17版本,新版本可能会有问题

#创建容器,并同时限制读取和写入速率
docker run -it --name wre --device-read-bps=/dev/sda:5MB --device-write-bps=/dev/sda:1MB centos:7 /bin/bash
#通过dd来验证写速度
dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct                
#添加oflag参数以规避掉文件系统cache

命令示例:新版本出现问题

docker run -it --name wre --device-read-bps=/dev/sda:5MB --device-write-bps=/dev/sda:1MB centos:7 /bin/bash
dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct   

输出结果:

[root@MineGi ~]# docker run -it --name wre --device-read-bps=/dev/sda:5MB --device-write-bps=/dev/sda:1MB centos:7 /bin/bash
[root@cf32238b2f1e /]# dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct   
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.0150208 s, 698 MB/s
[root@cf32238b2f1e /]# 

3.2 限制容器的读写次数

情况说明:用于限制容器中指定设备的每秒读取和写入操作数 (IOPS)

#限制读取和写入次数,指定了对 /dev/sda 设备的最大读取 IOPS 为 300,指定了对 /dev/sda 设备的最大写入 IOPS 为 300
docker run -it --name cis --device-read-iops=/dev/sda:300 --device-read-iops=/dev/sda:300 centos:7 /bin/bash

三、Docker 故障造成大量日志导致磁盘爆满故障

1、处理步骤

        处理Docker故障导致磁盘爆满的问题通常需要一系列步骤

(1)停止Docker服务

        首先,停止Docker服务以阻止持续写入造成的进一步磁盘使用

docker stop 容器ID/名称

(2)删除不必要的容器和镜像

        删除不再需要的容器、镜像和数据卷,以释放磁盘空间

#删除所有已停止的容器
docker container prune
 
#删除不再使用的镜像
docker image prune
 
#删除未被任何容器使用的数据卷
docker volume prune
 
#清理docker占用的磁盘空间
docker system prune -a            
#可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络

(3)清理日志文件

#编写脚本,清除日志
vim /opt/clean.sh
#!/bin/bash
logs=$(find /var/lib/docker/containers/ -name *-json.log*)
for log in $logs
do
cat /dev/null > $log
done

(4)设置docker日志文件数量及每个日志大小

#设置docker日志文件数量及每个日志大小
 vim /etc/docker/daemon.json
{
"registry-mirrors": ["http://f613ce8f.m.daocloud.io"],
"log-driver": "json-file",   #日志格式
"log-opts": { "max-size" : "500m", "max-file" : "3"}   
#日志的参数最大500M,最大容器中有三个日志文件,每个日志文件大小是500M
}
 
#修改完需要重新加载  
systemctl daemon-reload

(5)定期清理

        建立计划任务:crontab -e,设定时间执行清除日志的脚步

crontab -e
* */3 1 * *  /usr/bin/bash /opt/clean.sh

(6)监控和预防措施

        最后,确保实施监控和预防措施以避免未来的磁盘爆满问题。可以使用监控工具来追踪磁盘使用情况,并且可以设置警报,以便在磁盘使用接近极限时采取行动

        完成这些步骤后,您可以重新启动Docker服务,并且应该能够恢复正常运行

2、模拟故障

2.1 模拟新建容器一直在后台持续运行占用资源

#在后台持续运行 docker run 创建的容器
#需要在 docker run 命令之后添加 -d 选项让 Docker 容器以守护形式在后台运行。并且容器所运行的程序不能结束
docker run -itd centos:7 /usr/bin/bash -c "while true;do echo hello;done"

命令示例:

docker rm -f `docker ps -aq`
docker run -itd centos:7 /usr/bin/bash -c "while true;do echo hello;done"
docker ps

输出结果:

[root@MineGi ~]# docker rm -f `docker ps -aq`
cf32238b2f1e
e181c2c04455
7996d05df7b9
d5d91237a973
86f812ea2046
7dc19460385b
32a5c1de6961
54222634464c
e7320ceaf62c
0003fffe6970
e1e91a610aab
1d5f8dfacde5
b9890f1f108d
74ccdf369a5e
[root@MineGi ~]# docker run -itd centos:7 /usr/bin/bash -c "while true;do echo hello;done"
a86d50ea93df302cb983366fb6ecde88fd857b3dfd10ac09bbc3f532d5334dff
[root@MineGi ~]# docker ps
CONTAINER ID   IMAGE      COMMAND                   CREATED         STATUS         PORTS     NAMES
a86d50ea93df   centos:7   "/usr/bin/bash -c 'w…"   6 seconds ago   Up 5 seconds             brave_keldysh
[root@MineGi ~]#

#切换至存放docker运行中的容器的相关数据的目录
cd /var/lib/docker/containers/
#查看文件所占磁盘空间的大小
du -sh *

命令示例:

cd /var/lib/docker/containers/
du -sh *
du -sh *
du -sh *

输出结果:

[root@MineGi ~]# cd /var/lib/docker/containers/
[root@MineGi containers]# du -sh *
512M    a86d50ea93df302cb983366fb6ecde88fd857b3dfd10ac09bbc3f532d5334dff
[root@MineGi containers]# du -sh *
1.0G    a86d50ea93df302cb983366fb6ecde88fd857b3dfd10ac09bbc3f532d5334dff
[root@MineGi containers]# du -sh *
1.0G    a86d50ea93df302cb983366fb6ecde88fd857b3dfd10ac09bbc3f532d5334dff
[root@MineGi containers]# 

命令示例:此时CPU利用率过高,会导致卡顿等问题

top

输出结果:

[root@MineGi containers]# top
top - 14:38:43 up 51 min,  1 user,  load average: 4.83, 4.22, 3.80
Tasks: 125 total,   3 running, 122 sleeping,   0 stopped,   0 zombie
%Cpu(s): 24.5 us, 18.1 sy,  0.0 ni, 57.3 id,  0.0 wa,  0.0 hi,  0.1 si,  0.0 st
KiB Mem :  4026168 total,  1797308 free,   259004 used,  1969856 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  3515444 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                  
  2453 root      20   0   11692   1100    924 R  99.0  0.0   2:15.56 bash                                                     
  1468 root      20   0 1916080  81632  26804 S  68.1  2.0   1:38.16 dockerd                                                  
  2431 root      20   0 1236192   9928   4556 S   9.6  0.2   0:13.47 containerd-shim                                          
    38 root      39  19       0      0      0 S   0.7  0.0   0:00.23 khugepaged                                               
   887 root      20   0 1553612  31612  14692 S   0.7  0.8   0:04.55 containerd                                               
  1736 root      20   0       0      0      0 S   0.7  0.0   0:01.20 kworker/0:0                                              
  1420 root      rt   0       0      0      0 S   0.3  0.0   0:00.11 migration/2                                              
  2243 root      20   0       0      0      0 R   0.3  0.0   0:00.60 kworker/2:1                                              
  2482 root      20   0       0      0      0 S   0.3  0.0   0:00.24 kworker/3:2                                              
  2486 root      20   0       0      0      0 S   0.3  0.0   0:00.19 kworker/1:2                                              
     1 root      20   0  125468   3912   2580 S   0.0  0.1   0:02.85 systemd                                                  
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.02 kthreadd                                                 
     4 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H                                             
     5 root      20   0       0      0      0 S   0.0  0.0   0:01.20 kworker/u256:0                                           
     6 root      20   0       0      0      0 S   0.0  0.0   0:00.06 ksoftirqd/0                                              
     7 root      rt   0       0      0      0 S   0.0  0.0   0:00.28 migration/0                                              
     8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh                                                   
     9 root      20   0       0      0      0 S   0.0  0.0   0:00.79 rcu_sched                                                
    10 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 lru-add-drain

2.2 停止运行有问题的容器

命令示例:

docker ps 
docker stop a86d50ea93df
docker ps 

输出结果:

[root@MineGi containers]# docker ps 
CONTAINER ID   IMAGE      COMMAND                   CREATED         STATUS         PORTS     NAMES
a86d50ea93df   centos:7   "/usr/bin/bash -c 'w…"   2 minutes ago   Up 2 minutes             brave_keldysh
[root@MineGi containers]# docker stop a86d50ea93df
a86d50ea93df
[root@MineGi containers]# docker ps 
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@MineGi containers]#

2.3 清理日志文件

#编写脚本,清除日志
vim /opt/clean.sh
#!/bin/bash
logs=$(find /var/lib/docker/containers/ -name *-json.log*)
for log in $logs
do
cat /dev/null > $log
done
 
#添加执行权限,并执行脚本
chmod +x /opt/clean.sh
. /opt/clean.sh

命令示例:

du -sh *

cat >/opt/clean.sh <<'eof'
#!/bin/bash
logs=$(find /var/lib/docker/containers/ -name *-json.log*)
for log in $logs
do
cat /dev/null > $log
done
eof

sh /opt/clean.sh
du -sh *

输出结果:

[root@MineGi containers]# du -sh *
2.0G    a86d50ea93df302cb983366fb6ecde88fd857b3dfd10ac09bbc3f532d5334dff
[root@MineGi containers]# cat >/opt/clean.sh <<'eof'
> #!/bin/bash
> logs=$(find /var/lib/docker/containers/ -name *-json.log*)
> for log in $logs
> do
> cat /dev/null > $log
> done
> eof
[root@MineGi containers]# sh /opt/clean.sh
[root@MineGi containers]# du -sh *
24K    a86d50ea93df302cb983366fb6ecde88fd857b3dfd10ac09bbc3f532d5334dff
[root@MineGi containers]#

四、总结

1、Docker 网络模式

  • host:容器使用宿主机的网络直接公开服务
    • 这意味着如果你在容器中运行一个web服务,那么它就直接绑定到主机的网络接口上,而不是通过docker进行任何网络转发

与宿主机共享网络名称空间

  • container:
    • 这种模式允许容器去共享另一个容器网络命名空间,这说明两个容器可以相同的网络接口和IP地址,他们共享的是同一网络命名空间

多个容器之间共享一个network namespace(命名空间)

  • none:是最简单的网络模式
    • 此网络模式表示将容器拥有自己的网路命名空间,但不会进行任何网络配置,这实际给了用户完全的自主权来给自己配置容器的网络

自闭空间

  • bridge:默认的网络模式
    • 每个新创建的容器都将该网络分配一个IP地址,此网络模式允许所有docker容器之间以及docker宿主机之间进行互相通信

默认模式,通过VETH对连接容器docker0网桥,网桥分配给容器IP,同时docker0作为局域网内容器的网关,最后与宿主机网卡进行通讯

  • user-defined network:自定义网络
    • docker允许用户创建自己的定义的网络,用户可以定义的网络范围、子网、路由等参数,这种类型网络使用用户可以更好地对容器网络进行控住和隔离(生产业务需求;注:根据甲方指定或领导指定)

根据业务需求指定静态IP地址

2、Docker 资源控制

2.1 CPU资源控制

  • control groups:是一个1inux内核的一个特性,用于限制记录和隔离进程组系统资源使用(cpu、内存、磁盘I/0等)
  • cpu-period 周期:指的是CPU在给与当前管理 控制容器的分配资源时 ,cpu 分配周期默认1s,此配置可以在运行时直接指定
  • cpu-quota(cpu 配额):直接限制了cgroups可以使用cpu的时间,如果设置了cgroup的配额100000us(微秒),那么在每个100ms(毫秒)的是时间窗口 cgroups是最多只能使用 100000us(微秒)的cpu 时间
  • cpuset-cpu:指定容器仅能使用指定CPU,按照CPU的下标来表示

2.2 内存资源限制

  • --memory:设置容器可以使用的内存量,单位可以是字节、千字节、兆字节、千兆字节或者吉字节
  • --memory-swap:可以用来设置容器可以使用的交换空间大小。强调一下,--memory-swap 是必须要与 --memory 一起使用的

2.3 磁盘IO配额限制

  • --device-read-bps:限制某个设备上的读速度bps(数据量),单位可以是kb、mb(M)或者gb
    • 例:docker run -itd --name test9 --device-read-bps /dev/sda:1M centos:7 /bin/bash
  • --device-write-bps : 限制某个设备上的写速度bps(数据量),单位可以是kb、mb(M)或者gb
    • 例:docker run -itd --name test10 --device-write-bps /dev/sda:1mb centos:7 /bin/bash
  • --device-read-iops :限制读某个设备的iops(次数)
  • --device-write-iops :限制写入某个设备的iops(次数)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MineGi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值