docker

2023-12-13 05:04:30

(一)docker的基本管理和概念

1、docker:是开源的应用容器引擎,基于go语言开发的,运行在Linux系统当中的开源的、轻量级的“虚拟机”

2、docker的容器技术可以在一台主机上、轻松的为任何应用创建一个轻量级的、可移植的,自给自足的容器

3、docker的宿主机是Linux系统,集装箱可以理解为互相隔离的容器(组件、应用程序APP),每个容器都是一个独立的应用程序

4、docker的设计宗旨:build、ship and run any app, anywhere

(1)build:封装好的程序,只要部署即可使用,一次封装
(2)ship and run any app:一次封装完成之后的程序,可以在任何环境运行
(3)anywhere:任意宿主机
(4)build、ship and run any app, anywhere:一次封装、到处运行
(5)流程:封装、发布、部署、运行、维护、运行、销毁(可以以一整套的方式管理运用程序的生命周期)

(二)docker的特点

1、灵活,再复杂的应用也可以实现容器化

2、轻量级,小型的、不完整的,最小化封装的程序,与宿主机共享内核

3、可互换,可以随时的升级、更新

4、便携式,本地可以构建,在云平台也可以实现部署,在任何地方运行

5、可扩展,自动分发容器副本

6、可堆叠,在一个宿主机上可以创建不同版本的同一容器,也可以是多个相同版本的同一容器

(1)基于Linux的命名空间:namespace,是一种内核特性,允许将一组系统的资源隔离,在一个命名空间中的进程在系统中可以拥有独立的资源
(2)重点:namespace的六项隔离措施
基于这个六个隔离项,实现了容器和容器之间,以及容器和宿主机之间的资源隔离

命名空间

系统调用参数

隔离内容

UTS

CLONE_NEWUTS

隔离主机和域名

在UTS这个命名空间创建进程,进程可以看到自己的主机名和域名,与其他进程分隔开

IPC

CLONE_NEWIPC

隔离信号量、消息队列、共享内存

在IPC这个命名空间之中,进程可以拥有独立的进程间通信资源

PID

CLONE_NEWPID

每个进程都有自己独立的进程号空间

network

CLONE_NEWNET

隔离网络设备、网络栈、端口

每个进程都有一个自己独立的网络资源(端口号)

mount

CLONE_NEWNS

隔离挂载点

在mount这个命名空间之中,每个进程或者设备都有自己的文件系统挂载点,相互之间互不干扰

user

CLONE_NEWUSER

隔离同的用户和用户组

(三)docker的核心组件

1、镜像:是docker的基础,最小单位,类似于虚拟机的ISO文件。

(1)一个镜像就是一个可执行的包,包里面包含了运行这个程序的所有内容(代码、配置文件、环境变量)
(2)docker镜像也是一个压缩包,不是一个解压的文件,是一个环境部署的脚本,基本包含了完整的操作系统

2、容器:docker的容器就是基于镜像运行起来的实例,可以启动,停止,删除,每个容器的都是相互隔离的,互不可见

3、仓库:保存镜像,所有的镜像都是从仓库当中拉去的,镜像也保存在仓库之中

(1)可以有共有仓库、私有仓库
(2)下载到了本地:镜像、容器、日志都默认存储在/var/lib/docker(宿主机)

(四)docker与虚拟机之间的区别(重点)

特性

docker

虚拟机

启动速度

秒级

分钟级

计算能力损耗(占CPU)

几乎无

损耗50%

性能

接近于原生系统

弱于原生系统

系统支持量

上千个

硬件系统来看(几十个)

隔离性

资源隔离

完全隔离

安全性

安全性差

安全性高

mysql、redis等不会用docker和k8s(核心数据不会上云、还是部署在本地

(五)部署docker(2核4G,硬盘300G)

1、安装相关依赖包

yum install -y yum-utils device-mapper-persistent-data lvm2

yum-utils:提供一个yum-config-manager工具,可以远程自定义获取yum源

device-mapper-persistent-data lvm2

device-mapper:进行逻辑卷管理的通用设备的映射机制、lvm

2、设置阿里云镜像源

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3、安装组件

yum install -y docker-ce docker-ce-cli containerd.io

docker-ce

docker的社区办,免费,面向开发者,小型团队和个人使用

docker-ce-cli

提供docker的命令行工具

contarnerd.io

负责管理容器的生命周期(创建、运行、停止、运行、销毁)

systemctl start docker.service
systemctl enable docker.service

3、docker的相关命令

(1)docker version:查看docker的版本(docker24版本
docker只能支持64位系统

(2)docker info:查看docker的所有信息
docker安装完毕之后,客户端和服务端都在一起,都运行在一台机器上

overlay2:docker使用的文件系统驱动

overlayFS

overlay file system:联合文件系统,用于适配宿主机的文件系统,可以自动适配

lowerDir

底层目录,docker的底层文件系统,是一个或者多个镜像文件的根文件系统

UpperDir

可写目录,可以在容器运行时,在容器内进行写操作,实现容器的可写性

MergeDir

合并目录,合并lowerDir和UpperDir,就是容器的文件系统,用户看到的也就是这个合并的视图

WorkDir

工作目录,处理文件系统变更,当在容器内进行写操作时,overlayFS使用WorkDir来跟踪文件系统的变更

(六)对docker的镜像和容器的增删改查

docker的增删改查

查看docker的版本

docker version

查看docker的所有信息

docker info

停止容器

docker stop 容器名/ID

重启容器

docker restart 容器名/ID

搜索镜像

docker search 镜像名称

获取镜像(镜像拉取)

docker pull 镜像名称

docker pull centos

docker pull centos:7

查看下载的镜像

docker images

查看镜像的详细信息

docker inspect 镜像名称/镜像ID

docker inspect centos:7(镜像名)

docker inspect 5d0da3dc9764(镜像ID)

给镜像上不同的标签

docker tag?centos:latest centos:new

(标签—硬链接、复制了源镜像)

删除镜像

docker rmi 镜像名称/镜像ID

docker rmi centos:new

docker rmi -f 5d0da3dc9764(强制删除)

把镜像保存为本地文件

(镜像导出)

docker save -o /opt/xx.tar 镜像名称/镜像ID

docker save -o /opt/centos.tar centos:7

docker save -o /opt/centos1.tar 5d0da3dc9764

将镜像文件导入到镜像库中(镜像导入)

docker load -i centos.tar

上传镜像(先添加标签、再上传镜像)

docker tag centos:latest hydedidi/centos:hyde

docker login登录公用仓库

docker push hydedidi/centos:hyde上传镜像

基于镜像创建容器

docker create?-it centos:7 /bin/bash

查看容器

查看正在运行的容器

docker ps

查看所有的容器

docker ps -a

启动容器

docker start 容器名称/ID

docker start friendly_bardeen

docker start 0d9aef184f4a

进入正在运行的容器

docker exec -it 容器名称/ID bash

docker exec -it 0d9aef184f4a bash

docker exec -it friendly_bardeen bash

同时创建和运行容器(且未创建镜像)

docker run -itd?--name hyde1 nginx /bin/bash

把文件从容器中复制到主机

docker cp hyde1:/etc/nginx/nginx.conf?/opt/

把主机的文件复制回容器

docker cp /opt/nginx.conf?hyde1:/etc/nginx/

容器导出为快照文件(xx.tar格式的文件名)

docker export -o nginx.tar hyde1

docker export hyde1 > nginx1.tar

(不指定目录,默认是当前目录)

docker export -o /opt/data/nginx.tar hyde1

docker export hyde1 > ?/opt/data/nginx.tar

容器导入(导入为镜像

docker import nginx.tar -- nginx:hyde2镜像名称:标签名

标签名不能重复,否则会出现none

删除容器

删除未在运行的容器

docker rm test1容器名/ID

删除正在运行的容器

docker rm -f?test1

先停止:docker?stop test1

再删除:docker rm test1

批量操作

批量停止容器:

docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash

批量删除后台停止的容器:

docker rm $(docker ps -a -q)

批量删除所有容器(先停再删、慎用):

docker ps -a | awk 'NR>=2{print $1}'| xargs docker rm

批量删除none镜像(推荐)

docker images | grep "none" | awk '{print $3}' | xargs docker rmi -f

docker的网络模式

bridge模式,默认桥接模式,在创建docker时不需要指定网络类型

host模式,容器将不会虚拟出自己的网卡、IP地址,全部使用宿主机的IP地址和端口

container模式,容器和容器之间共用一个ip和端口,不能同时起

none模式:没有网卡、ip、路由,只有本地lo回环网络(127.0.0.1),容器不可以联网

自定义网络:自定义网络在创建容器时,可以给容器指定ip地址(可以给docker创建一个自己定义的网段)

随机分配端口

docker run -itd --name hyde1?-P?nginx /bin/bash

指定分配端口

docker run -itd --name hyde4?-p 4300:80?nginx:1.22.0 /bin/bash

查看日志

docker run -itd --name hyde3 -P nginx(创建容器时不加/bin/bash)

查看日志

docker logs hyde3容器名/ID

动态查看

docker logs -f hyde3

从尾部查看10条

docker logs --tail=10 hyde3

动态从尾部查看10条

docker logs --tail=10 -f hyde3

创建host模式

(使用宿主机的ip和端口)

docker run -itd --name hyde4 --network host(网络模式) nginx /bin/bash

创建container模式

(容器和容器之间共用一个ip和端口)

docker run -itd --name hyde5 --network=container:hyde1?nginx /bin/bash

创建none模式

docker run -itd --name hyde6 --network=none?nginx /bin/bash

查看docker的网络

docker network ls

删除docker网络

docker network rm 网络名称

创建自定义网段

先创建自定义网络:

docker network create?--subnet=172.18.0.0/16?--opt "com.docker.network.bridge.name"="docker1"?mynetwork

再在创建容器时指定IP地址:

docker run -itd --name hyde3 --network mynetwork --ip 172.18.0.10?nginx /bin/bash

宿主机和容器实现数据共享

创建容器+数据卷(-v):

docker run -itd --name hyde1 -v /opt/test1:/opt/test?centos:7 /bin/bash

设置容器的挂载目录为只读模式:

docker run -itd --name hyde2 -v /opt/test2:/opt/test1:ro?centos:7 /bin/bash

容器和容器之间实现数据共享

docker run -itd --name hyde3 -v /opt/data1 -v /opt/data2?centos:7 /bin/bash

创建交互:

docker run -itd --volumes-from hyde3?--name hyde4 centos:7 /bin/bash

容器互联

(两个容器之间实现网络通信,network模式不需要做映射)

docker run -itd -P?--name test11 --network=mynetwork?centos:7 /bin/bash

docker run -itd -P --name test22 --network=mynetwork centos:7 /bin/bash

指定端口创建数据库容器

docker run -itd --name mysql1?-p 33066:3306?-v /log/mysql_log:/var/log/mysql?-e MYSQL_ROOT_PASSWORD=123456?mysql:5.7.20

cat cpu.cfs_period_us

100000

cat cpu.cfs_quota_us

-1

CPU的资源控制

创建容器时限制占用CPU的时间

docker run -itd --name test2 --cpu-quota 40000?centos:7 /bin/bash

设置容器占用cpu的权重

(多个容器才能生效)

docker run -itd --name test3 --cpu-shares 512?centos:7 /bin/bash

docker run -itd --name test4 --cpu-shares 1024?centos:7 /bin/bash

设置容器绑定cpu

docker run -itd --name test5 --cpuset-cpus 0,2?centos:7 /bin/bash

内存的资源控制

创建容器时限制内存

docker run -itd --name test6 -m 512m?centos:7 /bin/bash

--(了解):

docker run -itd --name test7 -m 512m --memory-swap=1g?centos:7 /bin/bash

磁盘I/O的资源限制(了解):

限制容器在磁盘上的读速度

docker run -itd --name test8 --device-read-bps /dev/sda:1M?centos:7 /bin/bash

限制容器在磁盘上的写速度

docker run -itd --name test9 --device-write-bps /dev/sda:1mb?centos:7 /bin/bash

限制容器读取的次数

docker run -itd --name test1?--device-read-iops /dev/sda:100?centos:7 /bin/bash每秒读100次

限制容器写入的次数

docker run -itd --name test2 --device-write-iops /dev/sda:50?centos:7 /bin/bash(每秒写50次)

清理docker占用的磁盘空间

docker system prune -a

占用CPU的时间10000,占用CPU的权重256,占用内存1G,只能使用CPU1

CPU1docker run -itd --name centos1 --cpu-quota 10000?--cpu-shares 256?-m 1g --cpuset-cpus 1?centos:7 /bin/bash

1、搜索镜像:docker search 镜像名称

name

表示镜像名称

DESCRIPTION

描述信息

stars

好评数量

OFFICIAL

表示官方镜像

AUTOMATED

是否是自动化构建

3、获取镜像(镜像拉取):docker pull 镜像名称

什么都不加,默认是centos的最近版本
(1)指定版本下载:docker pull centos:7

4、查看下载的镜像:docker images

REPOSITORY

镜像所属的仓库

TAG

标签,可以理解为版本,标记一个仓库的不同镜像

IMAGE ID

镜像的唯一标识,不会重复

CREATED

镜像的创建时间

SIZE

镜像的大小

5、查看镜像的详细信息:docker inspect 镜像名称/镜像ID

6、给镜像打上不同的标签:docker tag centos:latest centos:new

标签的作用:相当于硬链接(复制了源镜像)

7、删除镜像:docker rmi?镜像名称/镜像ID

docker rmi?-f 5d0da3dc9764(强制删除)
(1)一个镜像如果有多个标签,删除的只是标签。如果只剩最后一个,删除的就是镜像本身
(2)如果镜像已经被容器使用,要先停容器,再删除容器,最后再删除镜像
(3)删除了在运行的容器的镜像,对容器会有影响吗

8、把镜像保存为本地文件:docker save -o /opt/xx.tar 镜像名称/镜像ID(镜像导出)

9、将镜像文件导入到镜像库中(镜像导入):docker load -i centos.tar

10、上传镜像(先添加标签、再上传镜像)

11、基于镜像创建容器:docker create -it centos:7 /bin/bash

-i

表示让容器开启标准输入,用于接受用户的输入命名

-t

给这个容器分配一个终端,这是一个虚拟的伪终端

-it

形成一个宿主机和容器之间的一个可以交互的shell命令行

12、查看容器

(1)docker ps:查看正在运行的容器
(2)docker ps -a :查看所有的容器(运行的和未运行的)

CONTAINER ID

容器的ID号

IMAGE ?

加载的镜像

COMMAND ?

运行的程序

CREATED

创建时间

STATUS

当前的状态

PORTS

端口映射

NAMES

名称

13、启动容器:docker start 容器名称/ID

14、进入正在运行的容器:docker exec -it 容器名称/ID bash

15、同时创建和运行容器:docker run -itd --name hyde1?nginx /bin/bash
基于nginx安装的最小化的带有nginx功能的程序
只要run,无论对错,都会创建

-d

可以让创建的容器以守护进程在后台运行,容器所运行的程序不会结束

  1. 没有镜像也能自动拉取镜像、run

(2)运行的程序是 /bin/bash,和-d结合,给容器一个持续运行的命令,若后台没有指令,容器没有可运行的程序,将会直接退出

-it

形成交互式会话

-d

后台运行 /bin/bash

--name

给容器命名

nginx:1.22.0

镜像名称和标签,如果本地没有,可以自动下载(不指定,默认最新版本)

16、把文件从容器中复制到主机:docker cp hyde1:/etc/nginx/nginx.conf /opt/

17、把主机的文件复制回容器:docker cp /opt/nginx.conf hyde1:/etc/nginx/

18、容器导出和导入(docker export/import)

1用户可以将任何一个 Docker 容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export 命令将已经创建好的容器导出为容器快照文件,无论这个容器是处于运行状态还是停止状态均可导出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。
①导出的容器还是一个镜像,必须run 或create才能成为容器
②已经配置好的导出的容器镜像,可以直接创建、运行使用(在工作,我们使用的都是开发已经设置、配置好的容器镜像)
③docker的特性:即使在创建过程中报错,容器还是会被创建,但是这个容器不可用
④导入镜像或者导入容器镜像,如果标签和已有标签重复,导入的镜像或者容器镜像,tag这一项就会变成none
(2)容器导出为快照文件:docker export -o nginx.tar(xx.tar格式的文件名) hyde1

(3)容器导入(导入为镜像):docker import nginx.tar -- nginx:hyde2镜像名称:标签名标签名不能重复

19、删除容器:

20、批量操作

(1)批量停止容器(不要使用):docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash

(2)批量删除后台停止的容器:docker rm $(docker ps -a -q)

(3)批量删除所有容器(先停再删、慎用):docker ps -a | awk 'NR>=2{print $1}'| xargs docker rm

(4)批量删除none镜像(推荐):docker images | grep "none" | awk '{print $3}' | xargs docker rmi -f

docker网络(重点)

1、docker的网络模式(重点)

(1)bridge模式,默认桥接模式,在创建docker时不需要指定网络类型,默认就是bridge
(2)host模式,容器将不会虚拟出自己的网卡,也没有自己的ip地址,全部使用宿主机的IP地址和端口
①特点:公用模式,如果是单个容器运行,可以使用host模式
(3)container模式,容器和容器之间共用一个ip和端口,但是这两个不能同时起

hyde1:使用的是宿主机的20.0.0.10:80(宿主机的80端口)

hyde2:使用的也是宿主机的20.0.0.10:80(宿主机的80端口)

(4)none模式:docker容器有自己的network-space,但是这个容器没有任何网络设置,这个容器没有网卡、ip、路由,只有本地lo回环网络(127.0.0.1),容器不可以联网(类似于飞行模式),一般用于容器功能测试
(5)自定义网络,创建容器时,默认使用docker0网桥是无法给容器定义ip地址的,只能自动分配,自定义网络在创建容器时,可以给容器指定ip地址(可以给docker创建一个自己定义的网段)

2、桥接模式:用于连接两个不同网络段的设备,共享通信的一种方式

1桥接设备:工作在OSI模型的第二层(数据链路层),根据Mac地址转发数据帧
(2)类似于交换机,只能转发同一网段,通过泛洪广播来找目标设备的Mac地址

3、docker的网络就是基于桥接模式实现的

4、docker网络的工作模式

1虚拟网络桥:安装开启docker之后,docker进程就会自动创建一个虚拟网络桥(docker0),是一个虚拟的网络设备,类似于物理网络设备的交换机
2分配唯一的ip地址,每次运行一个容器,docker进程都会分配唯一的且未被其他容器占用的ip地址给容器,这个ip地址是在桥接模式网络的子网中
3容器和主机通信:通过桥接模式,容器可以与主机直接通信,容器可以访问主机上的运行服务,主机可以通过桥接网络docker0来访问容器内部的进程iptables的nat地址转换,在主机上做了地址转换
①问题:docker的网桥是宿主机虚拟出来的,并不是一个真正存在的网络设备,外部网络无法寻址找到,外部网络无法直接访问docker0分配给容器的ip地址
②解决:可以给容器做一个端口映射(-P)

5、docker在宿主机和容器之间做iptables的NAT地址转换(端口映射)

(1)随机分配端口:docker run -itd --name hyde1?-P?nginx /bin/bash

随机分配端口:docker run -itd --name hyde1?-P?nginx /bin/bash

指定分配端口:docker run -itd --name hyde4?-p 4300:80?nginx:1.22.0 /bin/bash

-P在创建容器时,在宿主机和容器之间做一个端口映射,-P随机分配一个端口给宿主机,容器的端口是不变的

-p:指定端口,人为设置固定的端口映射(指定端口映射,宿主机的端口一定不能被占用

-P 32768开始

实际上,docker是在宿主机和容器之间做一个iptables的NAT地址转换

①修改nginx的访问页面、进入容器开启一下nginx服务

②访问32769就是访问容器nginx的80端口

2指定分配端口:docker run -itd --name hyde2?-p 4200:80?nginx /bin/bash

(3)查看容器内部运行的日志

/bin/bash

为了让容器后台有一个运行程序,保证容器不会退出

-d

后台守护运行,但时间一长容器可能会自动退出

/bin/bash就是容器的标准输出,docker logs捕获的是cmd和entrypoint的标准输出,/bin/bash和捕获日志会冲突

①创建容器:docker run -itd --name hyde3 -P nginx

②查看日志

查看日志

docker logs hyde3容器名/ID

动态查看

docker logs -f hyde3

从尾部查看10条

docker logs --tail=10 hyde3

动态从尾部查看10条

docker logs --tail=10 -f hyde3

6、创建host模式:使用宿主机的ip和端口

1创建容器时指定网络模式:docker run -itd --name hyde4 --network host(网络模式) nginx /bin/bash

(2)使用的本机的ip地址和端口

7、创建container模式:容器和容器之间共用一个ip和端口

(1)创建容器:docker run -itd --name hyde5 --network=container:hyde1 nginx /bin/bash

(2)解决:关闭hyde1的端口

8、创建none模式:没有网卡、ip、路由,只有本地lo回环网络(127.0.0.1)

只能在自己的容器中访问测试

(1)创建容器:docker run -itd --name hyde6 --network=none nginx /bin/bash

9、创建自定义网段:基于bridge模式,可以给docker创建一个自己定义的网段

1查看docker的网络:docker network ls

NETWORK ID

是docker网络唯一的网络id

NAME

docker网络的名称

DRIVER

docker网络的驱动程序

SCOPE

表示网络的作用范围

(2)创建容器时指定IP地址

在使用默认docker0网桥时,创建容器是不能指定IP地址的,只能由docker网桥自动分配,除非用户自定义的网络才可以给容易自定义ip地址
①先创建自定义网络:创建docker1的虚拟网卡
docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork

--opt “com.docker.network.bridge.name”=docker1

可以不加,但是网卡名称会比较难以识别

--subnet=172.0.0.0/16

声明网段

mynetwork

自定义网络的名称

②再在创建容器时指定IP地址:docker run -itd --name hyde3 --network mynetwork --ip 172.18.0.10 nginx /bin/bash

③浏览器无法访问,虚拟机内可以访问

(八)数据卷

1、数据卷:容器如何与宿主之间进行数据共享

2、数据卷是一个供容器使用的特殊目录,在容器中,和宿主机的目录进行映射,主机和宿主机之间都可以对目录中的文件进行修改,双方同步生效,对镜像也没有影响,宿主机到容器实现数据迁移

3、宿主机的目录和容器中的目录进行挂载(映射关系)

(1)创建容器+数据卷(-v):docker run -itd --name hyde1 -v /opt/test1:/opt/test centos:7 /bin/bash

(2)测试同步

(3)设置容器的挂载目录为只读模式(只可以在宿主机修改,容器内只能看)
①创建容器:docker run -itd --name hyde2 -v /opt/test2:/opt/test1:ro?centos:7 /bin/bash
②测试

4、容器和容器之间实现数据共享(数据卷容器)

(1)容器1和容器2之间可以有1个或者多个映射目录,实现数据互传,数据同步
(2)数据卷容器:只提供挂载点,让另一方收集数据
(3)实验过程
①创建容器:docker run -itd --name hyde3 -v /opt/data1 -v /opt/data2?centos:7 /bin/bash
②创建交互:docker run -itd --volumes-from hyde3?--name hyde4 centos:7 /bin/bash

③测试

6、容器互联:两个容器之间实现网络通信

(1)新版本(network自定义网络实现网段互ping)

①创建容器

docker run -itd -P --name test11 --network=mynetwork centos:7 /bin/bash

docker run -itd -P --name test22 --network=mynetwork centos:7 /bin/bash

②测试:network模式不需要做映射

访问主机名——访问IP地址

(十)docker之资源控制

1、docker的资源控制:对容器使用宿主机的资源进行控制(CPU、内存、磁盘I/O)

2、docker使用Linux自带的功能cgroup

3、cgroup(control group),是Linux内核系统提供的一种可以限制、记录、隔离进程组所使用的物理资源的机制,docker借助这个机制,来实现资源的控制

4、cgroup本身是提供将进程进行分组化管理的功能和接口的基础结构,分配控制的机制来实现资源控制

(1)host:容器和宿主机共用一个网络命名空间
(2)container:容器和容器之间共用一个网络命名空间
(3)cgroup:其他资源依然是隔离的

4、CPU的资源控制(重点)

(1)Linux通过CFS(completely fair scheduler,完全公平调度器),来调度各个进程对CPU的使用,CFS的调度100ms,也可以自定义容器的调度周期,以及在这个周期时间之内各个容器能够使用CPU的调度时间

--cpu-period

设置容器调度CPU的周期

--cpu-quota

设置在每个周期内,容器可以使用CPU的时间

*以上两个可以配合使用

*CFS周期的有效范围:1ms-1s,--cpu-period(1000-1000000)

*容器使用CPU的配额时间必须大于1ms,--cpu-quota的值必须是>=1000

docker stats 容器名/ID

查看容器的运行、占用宿主机资源的情况

docker top 容器名/ID

可以查看容器内PID和宿主机PID的映射关系

(2)查看CFS调度

cat cpu.cfs_period_us

100000

* 100毫秒,CFS调度周期的长度(微妙),在每一周期内,容器可以使用指定比例的CPU时间,默认情况都是100毫秒

* 每100毫秒调度一次容器请求CPU的资源,然后内核把CPU资源分配给容器

cat cpu.cfs_quota_us

-1

* 表示容器使用宿主机CPU的时间没有任何限制

* 调度请求之后,请求配额,内核分配给容器使用cpu的时间

(3)容器占用CPU时间的资源限制
①修改配置文件

50000(50毫秒),只能占用一半

②创建容器时限制占用CPU时间:docker run -itd --name test2 --cpu-quota 40000?centos:7 /bin/bash

(4)设置容器占用cpu的权重比:多个容器才能生效

--cpu-shares

指定容器占用cpu的份额,模式权重1024,设置的值只能是1024的倍数

--cpu-shares是给每个容器使用cpu设置了相对的权重,权重高的,可以使用cpu的资源更多,但是,如果只有一个容器在运行,即便设置了权重,但是没有其他更高的权重的容器来占用资源,权重低的容器依然不受限

①创建容器:
docker run -itd --name test3 --cpu-shares 512?centos:7 /bin/bash

docker run -itd --name test4 --cpu-shares 1024?centos:7 /bin/bash

②分别进入容器,进行压力测试
yum install -y epel-release
yum install -y stress(stress模拟系统负载的工具)

(5)设置容器绑定cpu(容器只能使用指定的cpu内核)
①创建容器:docker run -itd --name test5 --cpuset-cpus 0,2 centos:7 /bin/bash

②压力测试
yum install -y epel-release
yum install -y stress

5、内存的资源控制

(1)创建容器时限制内存使用
①限制内存创建容器:docker run -itd --name test6 -m 512m centos:7 /bin/bash

6、限制使用swap(了解)

docker run -itd --name test7 -m 512m --memory-swap=1g?centos:7 /bin/bash

要限制容器使用swap,必须和限制内存一起使用

-m 512m --memory-swap=1g

容器实际上能够使用的swap空间是1G-512m=512m

-m 512m(不限制swap空间)

器实际上能够使用的swap空间是容器内存限制的2倍,512m*2=1G

-m 512m --memory-swap=512m

容器不能使用swap空间

-m 512m --memory-swap=-1

内存受限还是512m,但是容器使用swap空间不再限制

7、磁盘I/O的资源限制(对读、写进行限制)

(1)限制容器在磁盘上的读速度
docker run -itd --name test8 --device-read-bps /dev/sda:1M?centos:7 /bin/bash

限制每秒1M
(2)限制容器在磁盘上的写速度
docker run -itd --name test9 --device-write-bps /dev/sda:1mb?centos:7 /bin/bash

①为什么还是2.1GB/s
在使用dd获取空字符集是直接从文件系统的缓存当中输入,速度是比较快的
②oflag=direct,禁用文件系统缓存,直接把数据写入磁盘,可以更真实的测试设备的性能,模拟直接写入物理设备的情况

(3)限制容器读取的次数

docker run -itd --name test1?--device-read-iops /dev/sda:100?centos:7 /bin/bash

限制读取的操作,每秒读100次
(4)限制容器写入的次数
docker run -itd --name test2 --device-write-iops /dev/sda:50?centos:7 /bin/bash

限制写入的操作,每秒写50次

8、清理docker占用的磁盘空间

docker system prune -a

文章来源:https://blog.csdn.net/weixin_48145965/article/details/134836811
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。