目录
2.5 自定义网络(user-defined network)
3.1.4 查看容器信息(包含配置、环境、网关、挂载、cmd等信息)
3.3.2 创建 container 模式的容器centos02,共享centos01容器的网卡
3.6 配置 user-defined network 模式(自定义网络)
1.2.1 创建并运行两个容器为 c1 和 c2,并设置容器的权重,使得c1和c2的CPU资源占比为1/3和2/3
一、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(次数)