Docker与虚拟化

Docker与虚拟化

引言:美国环境保护EPA报告曾经统计过一组数据:EPA研究服务器和数据中心的能源效率时发现,实际上服务器只有5%的时间在工作,其他时间一直处于休眠状态。
为了提高服务器的利用率,研发出一种虚拟化技术。

一.虚拟化

1.1虚拟化概述

通过虚拟化技术将一台计算机虚拟为多台逻辑计算机,在一台计算机上同时运行多个逻辑计算机,同时每个逻辑计算机可运行不同的操作系统。应用程序都可以在相互独立的空间内运行而互相不影响,从而提高计算机的工作效率。

①在一个操作系统中(win10)模拟多个操作系统(centos、win10、suse),同时每个操作系统可以跑不同的服务(ngint tomcat),从而实现一台宿主机搭建一个集群(从整体)

②通过软件/应用程序的方式,来实现物理硬件的功能(ensp)

以软件形式实现物理设备的功能(二层交换机、路由器、三层交换机等)

虚拟化将应用程序和系统内核资源进行解耦,以操作系统级别进行隔离,目的是提高资源利用率

1.2cpu时间分片

正常每个任务以轮询的方式去处理,这个时候一个CPU一个整体。
以下是针对的CPU单位时间内的一个资源。按时间划分,1秒划分成10个0.1秒,每个0.1秒可以全力处理10单位的任务。在1秒内,都在全力工作。
cpu 1s全力运转的性能——》逻辑分割成分成了10份,可以理解为在单位时间内可以处理10个任务,每一个0.1s cpu是满的。原先分片前100M以下的任务一次只可以处理1个,现在100M的任务一次可以处理10个。这就是时间分片的一个概念。
虚拟化作用——》缓解/解决了资源利用率的问题

image-20220905085534476

1.3 CPU虚拟化瓶颈

cpu分片后每个任务处理性能会打对折。

如果是50m及50m以下的任务的话,虚拟化后的,1s模拟10个cpu,可以处理10个。虚拟化后的性能更高。
如果是50+m的任务的话,物理硬件的性能就会比虚拟化的性能高了。虚拟化的cpu会卡顿。所以在极度吃资源的情况下,例如mysql高并发这种,就不适合用虚拟化。

image-20220905085601209

1.4 虚拟化工作原理

image-20220905085627972

虚拟机管理器功能:调用资源

两大核心组件:QEMU、KVM

QEMU:

①可以理解为队列,核心目的是调用资源内核中的资源,需要把KVM逻辑分割出来的资源运输给QEMU,再给虚拟机。

②QEMU它并不是直接调用,而是用I/O方式调用,QEMU把资源调用来的过程借用ioctl,QEMU借助libvirt这个工具调用ioctl,再通过接口,给虚拟机应用程序。

KVM:

①用来逻辑分割物理资源,抽象化为虚拟化资源,根据VMM里的配置,会逻辑分割出多少G,给应用程序,去进行虚拟化。

②只接受来自QEMU的请求指令。对于应用程序直接过来的敏感指令会拦截,然后通过接口发给QEMU,让QEMU判断是否需要执行,可以的话,再下来,不可以的话,打回去,不执行该敏感指令。

对于workstation而言——》硬件辅助虚拟化,表现形式在处理器里面有一个虚拟化引擎,可以勾取硬件辅助虚拟化,看到虚拟接口/dev/kvm,可以加强辅助调用,在应用程序需要频繁调用的时候,需要开启。比如openstack。

1.5 虚拟化类型

**全虚拟化:**将物理硬件资源全部通过软件的方式抽象化,最后进行调用
**半虚拟化:**需要修改操作系统
**直通:**直接使用物理硬件资源

全虚拟化:KVM——>>产品vmware—ce

半虚拟化:EXSI——>>workststion vsphere
虚拟化功能
①在一个操作系统内,模拟多个操作系统

② 以软件的方式模拟物理设备的功能

image-20220905085452171

image-20220905085913910

1.6 虚拟化优缺点

优势

①集中化管理(远程管理、维护)

②提高硬件利用率(物理资源利用率低-例如峰值,虚拟化解决了"空闲"容量)

③动态调整机器/资源配置(虚拟化把系统的应用程序和服务硬件分离、提高了灵活性)

④高可靠(可部署额外的功能和方案,可提高透明负载均衡、迁移、恢复复制等应用环境)

劣势

①前期高额费用(初期的硬件支持)

②降低硬件利用率(特定场景-例如极度吃资源的应用不一定适合虚拟化)

③更大的错误影响面(本地物理机down机会导致虚拟机均不可用,同时可能虚拟机中文件全部损坏)

④实施配置复杂、管理复杂((管理人员运维、排障困难)

⑤一定的限制性(虚拟化技术涉及各种限制,必须与支持/兼容虚拟化的服务器、应用程序及供应商结合使用)

⑥安全性(虚拟化技术自身的安全隐患)

一、Docker 概述

  • Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源
  • Docker是在Linux容器里运行应用的开源工具,是一种轻量级的“虚拟机”
  • Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器

Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱

鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序

1、Docker的设计宗旨:

Build,Ship and Run Any App,Anywhere,
即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统

2、容器化越来越受欢迎,因为容器是:

  • 灵活:即使是最复杂的应用也可以集装箱化。
  • 轻量级:容器利用并共享主机内核。
  • 可互换:可以即时部署更新和升级。
  • 便携式:可以在本地构建,部署到云,并在任何地方运行。
  • 可扩展:可以增加并自动分发容器副本。
  • 可堆叠:可以垂直和即时堆叠服务。

• 容器是在linux上本机运行,并与其他容器共享主机的内核,它运行的是一个独立的进程,不占用其他任何可执行文件的内存,非常轻量

• 虚拟机运行的是一个完成的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多

3、Docker与虚拟机的区别:

特性Docker容器虚拟机
启动速度秒级分钟级
计算能力损耗几乎无损耗 50%左右
性能接近原生弱于
系统支持量(单机)上千个几十个
隔离性资源隔离/限制完全隔离

4、容器在内核中支持2种重要技术:

docker本质就是宿主机的一个进程,docker是通过namespace实现资源隔离,通过cgroup实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘500g)

二、Docker核心概念

● 镜像
Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向 Docker 容器引擎的只读模板

通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件
● 容器
Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性

可以把容器看做是要给简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序。

● 仓库
Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取

Docker 的镜像、容器、日志等内容全部都默认存储在 /var/lib/docker 目录下。

三、安装 Docker

1.安装

目前 Docker 只能支持 64 位系统。
 
systemctl stop firewalld.service
setenforce 0
 
#安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2

yum-utils:提供了 yum-config-manager 工具。
device mapper: 是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
device mapper存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
 
#设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
 
#安装 Docker-CE并设置为开机自动启动
yum makecache fast 
yum install -y docker-ce
 
systemctl start docker.service
systemctl enable docker.service
 
#查看 docker 版本信息
docker version

img

img

img

img

image-20220905161152634

2.Docker网络优化

vim /etc/sysctl.conf
net.ipv4.ip_forward=1  #开启路由转发

sysctl -p
systemctl restart network
systemctl restart docker
  • 为什么开启路由转发
    开启路由转发 是让docker0能根据虚拟机ip为自己所有的docker容器分配虚拟ip

image-20220905161741793

3 docker-server端配置文件

/etc/docker/daemon.json

#在daemon. json文件中配置
{
  "graph":"/data/docker",		#数据目录,数据存储位置
  "storage-driver":"overlay2",	#存储引擎,docker1.18以上版本默认使用overlay2存储引擎。早期的适合存储引擎使用的aufs
  "insecure-registries":["registry.access.redhat.com","quary.io"],	#私有仓库
#registry-mirrors 以下添加
  "bip":"172.17.0.1/24",		#docker0ip地址,可用ifconfig查看
  "exec-opts":["native.cgroupdriver-systemd"],	#启动时的额外参数,(是一种挂在驱动,k8s使用)
  "live-restore":true	#当docker容器引擎挂掉的时候,使用docker跑起来的容器还能继续运行
}
#重启守护进程和docker
systemctl daemon-reload
systemctl restart docker

{
“graph”:“/data/docker”,
“storage-driver”:“overlay2”,
“insecure-registries”:[“registry.access.redhat.com”,“quary.io”],
“registry-mirrors”: [“https://up7x1ecd.mirror.aliyuncs.com”]
“bip”:“172.17.0.1/24”,
“exec-opts”:[“native.cgroupdriver-systemd”],
“live-restore”:true
}

image-20220905162805727

image-20220905163745046

四、Docker 镜像操作

1.#搜索镜像docker search

格式:docker search 关键字

docker search nginx

img

2.#获取镜像docker pull

格式:docker pull 仓库名称[:标签]
#如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest 标签。

docker pull nginx

img

3.#镜像加速下载

浏览器访问 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 获取镜像加速器配置

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://up7x1ecd.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

4.#查看镜像信息

镜像下载后存放在 /var/lib/docker

5.#查看下载的镜像文件信息

cat /var/lib/docker/image/overlay2/repositories.json

image-20220905105827099

6.#查看下载到本地的所有镜像docker images

docker images

REPOSITORY:镜像属于的仓库;
TAG:镜像的标签信息,标记同一个仓库中的不同镜像;
IMAGE ID:镜像的唯一ID 号,唯一标识一个镜像;
CREATED:镜像创建时间;
VIRTUAL SIZE:镜像大小;

image-20220905110052855

7.#获取镜像详细信息docker inspect

根据镜像的唯一标识 ID 号,获取镜像详细信息

格式:docker inspect 镜像ID号
docker inspect ae2feff98a0c

-f:指定返回值的模板文件。
-s:显示总的文件大小。
–type:为指定类型返回JSON。

image-20220905170054755

image-20220905170700453

8.#添加新的标签docker tag

为本地的镜像添加新的标签

格式:docker tag 名称:[标签] 新名称:[新标签]
docker tag nginx:latest nginx:web
docker images | grep nginx

image-20220905110338732

9.#删除镜像docker rmi

1.格式:
docker rmi 仓库名称:标签              #当一个镜像有多个标签时,只是删除其中指定的标签
或者
docker rmi 镜像ID号                        #会彻底删除该镜像

注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。
docker rmi nginx:web

2.批量删除镜像
#查看所有的镜像id
docker images -aq 
#批量删除所有镜像
docker rmi `docker images -q`
docker rmi -f `docker images -q` 
#批量删除nginx镜像
docker rmi `docker images|grep "nginx"`

image-20220905110527320

image-20220905111034260

10.#存储镜像:将镜像保存成为本地文件save -o

格式:docker save -o 存储文件名 存储的镜像
docker save -o nginx nginx:latest           #存出镜像命名为nginx存在当前目录下
scp nginx root@20.0.0.38:/opt   #将导出的镜像以scp方式导到别的服务器上

ls -lh

image-20220905111705268

image-20220905184523382

11.#载入镜像:将镜像文件导入到镜像库中docker load

格式:
docker load < 存出的文件
或者
docker load -i 存出的文件

docker load < nginx

image-20220905111950710

12.#上传镜像 push

默认上传到 docker Hub 官方公共仓库,需要注册使用公共仓库的账号。https://hub.docker.com
可以使用 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。
在上传镜像之前,还需要先对本地镜像添加新的标签,然后再使用 docker push 命令进行上传。

docker tag nginx:latest orangeoli/nginx:web       #添加新的标签
docker login                                #登录公共仓库
Username:
password:
docker push orangeoli/nginx:web                    #上传镜像

image-20220905183209545

五、Docker 容器操作

1.#容器创建docker create

就是将镜像加载到容器的过程。
新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。

格式:docker create [选项] 镜像
常用选项:
-i:让容器的输入保持打开
-t:让 Docker 分配一个伪终端

docker create -it nginx:latest /bin/bash

image-20220905112523555

2.#查看容器的运行状态docker ps -a

docker ps -a            #-a 选项可以显示所有的容器

image-20220905112731779

3.#启动容器docker start

格式:docker start 容器的ID/名称
docker start 8b0a7be0ff58
docker ps -a

image-20220905112855778

4.#创建并启动容器 docker run

可以直接执行 docker run 命令, 等同于先执行 docker create 命令,再执行 docker start 命令。
注意:容器是一个与其中运行的 shell 命令共存亡的终端,命令运行容器运行, 命令结束容器退出。

当利用 docker run 来创建容器时, Docker 在后台的标准运行过程是:
(1)检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;
(2)利用镜像创建并启动一个容器;
(3)分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;
(4)从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中;
(5)分配一个地址池中的 IP 地址给容器;
(6)执行用户指定的应用程序,执行完毕后容器被终止运行。

docker run centos:7 /usr/bin/bash -c ls /
docker ps -a                    
#会发现创建了一个新容器并启动执行一条 shell 命令,之后就停止了

image-20220905114533928

image-20220905114550409

5.#在后台持续运行 docker run 创建的容器

需要在 docker run 命令之后添加 -d 选项让 Docker 容器以守护形式在后台运行。并且容器所运行的程序不能结束。

docker run -d centos:7 bash -c "while true;do echo hello;done"
docker ps -a                    #可以看出容器始终处于 UP,运行状态

docker run -itd --name test1 centos:7 /bin/bash

image-20220905114847035

总结

#示例1:
docker run -itd nginx:latest /bin/bash

#示例2:执行后退出
docker run centos:7 /usr/local/bash -c ls /   

#示例3:执行后不退出,以守护进程方式执行持续性任务
docker run -d centos:7 /usr/local/bash -c "while true;do echo hello;done" 

-i: 以交互模式运行容器,通常与 -t 同时使用;
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-d: 后台运行容器,并返回容器ID;
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-p: 端口映射,格式为:主机(宿主)端口:容器端口
--name="nginx-lb": 为容器指定一个名称;
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 设置环境变量;
--env-file=[]: 从指定文件读入环境变量;
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-m :设置容器使用内存最大值;
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;

6.#终止容器运行docker stop

格式:docker stop 容器的ID/名称
docker stop 2592d3fad0fb
docker ps -a

image-20220905115028406

7.#容器的进入docker exec -it

需要进入容器进行命令操作时,可以使用 docker exec 命令进入运行着的容器。

格式:docker exec -it 容器ID/名称 /bin/bash
-i 选项表示让容器的输入保持打开;
-t 选项表示让 Docker 分配一个伪终端。

docker start 2592d3fad0fb                   #进入容器前,确保容器正在运行
docker exec -it 2592d3fad0fb /bin/bash 
ls
exit                #退出容器后,容器仍在运行
docker ps -a

image-20220905115747457

8.#容器的导出与导入

用户可以将任何一个 Docker 容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export 命令将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态均可导出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。

docker run -dit -p 1081:80 -v $pwd/nginx-html:/usr/share/nginx/html --name ng_text orangeoli/nginx:web
echo "this is text !" > /usr/share/nginx/html/index.html

image-20220905191052958

image-20220905191418305

image-20220905191612430

在38机器导入镜像

image-20220905192641565

9.#导出格式:docker export

docker export 容器ID/名称 > 文件名

docker export 2592d3fad0fb > centos7tar

image-20220905120150156

10.#导入格式:docker import

cat 文件名 | docker import – 镜像名称:标签

docker import 镜像 镜像

cat centos7tar | docker import - nginx:text         #导入后会生成镜像,但不会创建容器

image-20220905120526004

1662350763857

11.#删除容器docker rm

格式:docker rm [-f] 容器ID/名称
docker stop 2592d3fad0fb
docker rm 2592d3fad0fb              #删除已经终止状态的容器

docker rm -f 2592d3fad0fb           #强制删除正在运行的容器

docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash            #批量停止容器

docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash              #批量删除所有容器

docker images | awk 'NR>=2{print "docker rmi "$3}' | bash            #批量删除镜像

image-20220905121502390

image-20220905121811608

12.#docker容器运行时自启动

建议在运行容器时就设置容器自启动

使用 run --restart=always 命令

docker run --restart=always 容器名称或容器ID

13.#docker容器运行后设置自启动

使用 update --restart=always 命令

docker update --restart=always 容器名称或容器ID
  • –restart=always : 开机启动,失败也会一直重启;

  • –restart=on-failure:10 : 表示最多重启10次

–restart具体参数值详细信息:

  1. no - 容器退出时,不重启容器;
  2. on-failure - 只有在非0状态退出时才从新启动容器;
  3. always - 无论退出状态是如何,都重启容器;

六、Docker 网络

1、Docker 网络实现原理

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

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

docker run -d --name test1 -P nginx
#随机映射端口( 从32768开始)
docker run -d --name test2 -p 43000:80 nginx
#指定映射端口

image-20220906093738323

image-20220906094606037

2、Docker 的网络模式
●Host:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
●Container:创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。
●None:该模式关闭了容器的网络功能。
●Bridge:默认为该模式,此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及iptables nat 表配置与宿主机通信。
●自定义网络

#########使用docker run创建Docker容器时,可以用 --net 或 --network #######

●host模式:使用 --net=host 指定。
●none模式:使用 --net=none 指定。
●container模式:使用 --net=container:NAME_or_ID 指定。
●bridge模式:使用 --net=bridge 指定,默认设置,可省略。

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

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

image-20220906101017160

3、网络模式详解
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和端口。

2.container模式

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

docker run -itd --name test2 nginx /bin/bash         #--name 选项可以给容器创建一个友好的自定义名称

image-20220906110714864

docker inspect -f '{{.State.Pid}}' aedf459393ee        #查看容器进程号!

-f:指定返回值的模板文件。
-s:显示总的文件大小。
–type:为指定类型返回JSON。

img

ls -l /proc/25495/ns                    #查看容器的进程、 网络、文件系统等命名空间编号

image-20220906111306447

docker run -itd --name test2 --net=container:3ed82355f811 centos:7 /bin/bash
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ff96bc43dd27 centos:7 “/bin/bash” 48 seconds ago Up 46 seconds test2
3ed82355f811 centos:7 “/bin/bash” 58 minutes ago Up 58 minutes test1

docker inspect -f ‘{{.State.Pid}}’ ff96bc43dd27
27123

ls -l /proc/27123/ns #查看可以发现两个容器的 net namespace 编号相同
lrwxrwxrwx 1 root root 0 1月 7 12:27 ipc -> ipc:[4026532692]
lrwxrwxrwx 1 root root 0 1月 7 12:27 mnt -> mnt:[4026532690]
lrwxrwxrwx 1 root root 0 1月 7 12:27 net -> net:[4026532575]
lrwxrwxrwx 1 root root 0 1月 7 12:27 pid -> pid:[4026532693]
lrwxrwxrwx 1 root root 0 1月 7 12:27 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 1月 7 12:27 uts -> uts:[4026532691]

3.none模式

使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。 也就是说,这个Docker容器没有网卡、IP、路由等信息。这种网络模式下容器只有lo回环网络,没有其他网卡。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。

4.Bridge模式

bridge模式是docker的默认网络模式,不写–net参数,就是bridge模式。

相当于Vmware中的 nat 模式,容器使用独立network Namespace,并连接到docker0虚拟网卡。通过docker0网桥以及iptables nat表配置与宿主机通信,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的 Docker 容器连接到一个虚拟网桥上。

(1)当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

(2)从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。

(3)Docker将veth pair 设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中, 以veth*这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过 brctl show 命令查看。

(4)使用 docker run -p 时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL 查看。

5.自定义网络
#直接使用bridge,无法支持指定IP运行docker
××docker run -itd --name test1 --network bridge --ip 172.17.0.10 centos:7 /bin/bash

#可以先自定义网络,再使用指定IP运行docker
docker network create --subnet=172.18.0.0/24 mynetwork
docker run -itd --name test2 --net mynetwork --ip 172.18.0.10 centos:7 /bin/bash

七、资源控制

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

2、cgroups四大功能:

  • 资源限制:可以对任务使用的资源总额进行限制
  • 优先级分配:通过分配的cpu时间片数量以及磁盘IO带宽大小,实际上相当于控制了任务运行优先级
  • 资源统计:可以统计系统的资源使用量,如cpu时长,内存用量等
  • 任务控制:cgroup可以对任务执行挂起、恢复等操作
(1)设置CPU使用率上限
Linux 通过 CFS(Completely Fair Scheduler,完全公平调度器)来调度各个进程对 CPU 的使用。CFS 默认的调度周期是 100ms。
我们可以设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少 CPU 时间。
 
使用 --cpu-period 即可设置调度周期,使用 --cpu-quota 即可设置在每个周期内容器能使用的 CPU 时间。两者可以配合使用。
CFS 周期的有效范围是 1ms~1s,对应的 --cpu-period 的数值范围是 1000~100000。
而容器的 CPU 配额必须不小于 1ms,即 --cpu-quota 的值必须 >= 1000。
 
docker run -itd --name test1 centos:7 /bin/bash
 
docker ps -a
CONTAINER ID   IMAGE      COMMAND       CREATED      STATUS       PORTS     NAMES
3ed82355f811   centos:7   "/bin/bash"   5 days ago   Up 6 hours             test1
 
cd /sys/fs/cgroup/cpu/docker/3ed82355f81151c4568aaa6e7bc60ba6984201c119125360924bf7dfd6eaa42b/
cat cpu.cfs_quota_us
-1
 
cat cpu.cfs_period_us
100000
---------------------------------------------------------------------------------------------------------
#cpu.cfs_period_us:cpu分配的周期(微秒,所以文件名中用 us 表示),默认为100000。
#cpu.cfs_quota_us:表示该control group限制占用的时间(微秒),默认为-1,表示不限制。 如果设为50000,表示占用50000/100000=50%的CPU。
---------------------------------------------------------------------------------------------------------
 
#进行CPU压力测试
docker exec -it 3ed82355f811 /bin/bash
vim /cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done
 
chmod +x /cpu.sh
./cpu.sh
exit
 
top                 #可以看到这个脚本占了很多的cpu资源
 
#设置50%的比例分配CPU使用时间上限
docker run -itd --name test2 --cpu-quota 50000 centos:7 /bin/bash   #可以重新创建一个容器并设置限额
或者
cd /sys/fs/cgroup/cpu/docker/3ed82355f81151c4568aaa6e7bc60ba6984201c119125360924bf7dfd6eaa42b/
echo 50000 > cpu.cfs_quota_us
docker exec -it 3ed82355f811 /bin/bash
./cpu.sh
exit
 
top                 #可以看到cpu占用率接近50%,cgroups对cpu的控制起了效果
 
 
(2)设置CPU资源占用比(设置多个容器时才有效)
Docker 通过--cpu-shares 指定 CPU 份额,默认值为1024,值为1024的倍数。
#创建两个容器为 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
 
#分别进入容器,进行压力测试
yum install -y epel-release
yum install stress -y
stress -c 4             #产生四个进程,每个进程都反复不停的计算随机数的平方根
exit
 
#查看容器运行状态(动态更新)
docker stats
CONTAINER ID   NAME             CPU %     MEM USAGE / LIMIT     MEM %     NET I/O          BLOCK I/O         PIDS
c3ee18e65852   c2               66.50%    5.5MiB / 976.3MiB     0.56%     20.4MB / 265kB   115MB / 14.2MB    4
bb02d3b345d8   c1               32.68%    2.625MiB / 976.3MiB   0.27%     20.4MB / 325kB   191MB / 12.7MB    4
 
(3)设置容器绑定指定的CPU
#先分配虚拟机4个CPU核数
docker run -itd --name test2 --cpuset-cpus 1,3 centos:7 /bin/bash
 
#进入容器,进行压力测试
yum install -y epel-release
yum install stress -y
stress -c 4
exit
 
#退出容器,执行 top 命令再按 1 查看CPU使用情况。
(1)设置CPU使用上限
img

img

img

img

img

img

(2)设置CPU资源占用比

img

img

img

img

3、对内存使用的限制

//-m(–memory=)选项用于限制容器可以使用的最大内存

docker run -itd --name test8 -m 512m centos:7 /bin/bash
docker stats

//限制可用的swap大小,

–memory-swap

强调一下,–memory-swap是必须要与–memory一起使用的。
正常情况下,–memory-swap的值包含容器可用内存和可用swap.
所以-m300m-memory-swap=1g的含义为:容器可以使用300M的物理内存,并且可以使用700M(1G-300)的swap。

如果:–memory-swap设置为0或者不设置,则容器可以使用的swap大小为-m值的两倍。
如果–memory-swap的值和-m值相同,则容器不能使用swap.
如果-memory-swap值为-l,它表示容器程序使用的内存受限,而可以使用的swap
空间使用不受限制(宿主机有多少swp容器就可以使用多少)

docker run -itd --name test3 -m 512m centos:7 /bin/bash
docker stats

img

img

4、对磁盘IO配额控制(blkio)的限制
--device-read-bps:限制某个设备上的读速度bps(数据量),单位可以是kb、mb(M)或者gb。
例:docker run -itd --name test4 --device-read-bps /dev/sda:1M  centos:7 /bin/bash
 
--device-write-bps : 限制某个设备上的写速度bps(数据量),单位可以是kb、mb(M)或者gb。
例:docker run -itd --name test5 --device-write-bps /dev/sda:1mb centos:7 /bin/bash
 
--device-read-iops :限制读某个设备的iops(次数)
  
--device-write-iops :限制写入某个设备的iops(次数)
 
#创建容器,并限制写速度
docker run -it --name test5 --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
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 10.0025 s, 1.0 MB/s<br><br>#清理docker占用的磁盘空间<br>docker system prune -a         #可以用于清理磁盘,删除关闭的容器,无用的数据卷和网络

img

m centos:7 /bin/bash
docker stats


[外链图片转存中...(img-M3YXtM4l-1663404016106)]

 

[外链图片转存中...(img-JGyCtpEr-1663404016106)]

 

 

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

```powershell
--device-read-bps:限制某个设备上的读速度bps(数据量),单位可以是kb、mb(M)或者gb。
例:docker run -itd --name test4 --device-read-bps /dev/sda:1M  centos:7 /bin/bash
 
--device-write-bps : 限制某个设备上的写速度bps(数据量),单位可以是kb、mb(M)或者gb。
例:docker run -itd --name test5 --device-write-bps /dev/sda:1mb centos:7 /bin/bash
 
--device-read-iops :限制读某个设备的iops(次数)
  
--device-write-iops :限制写入某个设备的iops(次数)
 
#创建容器,并限制写速度
docker run -it --name test5 --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
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 10.0025 s, 1.0 MB/s<br><br>#清理docker占用的磁盘空间<br>docker system prune -a         #可以用于清理磁盘,删除关闭的容器,无用的数据卷和网络

[外链图片转存中…(img-HzE1TrIo-1663404016106)]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值