Docker容器持久化

问题:当容器停止运行或意外关闭之后,容器内部的项目和数据也会随之丢失,所以要用到容器存储部分

数据卷

1.数据卷的特性:生命周期和docker容器一致,有写时复制机制(#写时复制机制意思是当容器正在运行时,如果有现有的文件发生修改,那么源文件依然存在,只是被隐藏起来,相当于一个备份)

2.数据卷的意义

关闭并重启容器,其数据不受影响(start或者stop);但删除 Docker 容器,则其改变将会全部丢失

问题:存在于联合文件系统中,不利于访问,容器间数据共享不便,删除容器数据会丢失

解决方案:

“卷”,也就是指容器上的一个或多个目录能与物理机上的某个目录相绑定

3.数据卷的结构

docker几秒就退出 docker容器退出后数据会丢失_docker几秒就退出

 

docker容器具有自己的CSI接口,如果想要有存储服务要连接到docker容器,需要有和CSI接口的配置,从而达到存储效果

4.数据卷的分类(绑定卷和管理卷)

①绑定卷:

docker run --name test -v 宿主机的目录或文件(需已存在):(容器内的共享目录或文件) -d nginx1

例:

docker run --name test -v /data/:/usr/local/nginx/html -d nginx1
cd /data/
docker exec -it test /bin/bash

总结:进入到/usr/local/nginx/html目录下这时候在此目录下创建的文件在宿主机的/data目录下就可看到,这时,就算删除掉test这个容器,数据也能在宿主机的/data目录下显示了,就能达到一个备份的效果,应用场景:比如当nginx的配置文件可以共享到宿主机的文件,这样如果有多个nginx服务器需要修改配置文件,创建好多个容器共享目录后,直接修改宿主机的共享文件即可。

②管理卷:

管理卷的意思是在创建镜像的时候,用Dockerfile制作时,就要提前想到用容器内的哪个目录作为共享目录,比如在制作Dockerfile时,(VOLUME /usr/local/nginx/html)VALUE + 容器内共享的目录

查看容器内目录绑定的宿主机的目录命令 docker inspect 运行的容器名 (找到Mount下的目录就是共享的目录),一般在宿主机的/var/lib/docker/volumes/下的随机目录下

总结:当在Dockerfile中设置了VOLUME的值后,在宿主机上用docker inspect 容器名 查看,就会看到宿主机的共享目录(一般是在/var/lib/docker/volumes)。

①和②对比:

绑定卷的优先级要高于管理卷,-v选项指定的目录会覆盖掉Dockerfile中的VOLUME的选项,因为优先级更高,作用域更小,如果设置了-v 选项的话,Dockerfile的VOLUME的选项不在生效

容器共享目录(--volumes-from)

如果有多个容器(需要同一个镜像),需要指定一个宿主机共享目录去同步,可以用--volumes-from 选项

实验原理:利用-v选项或Dockerfile中的VOLUME,当创建好第一个容器共享目录后,后面的容器直接跟docker run --name 名字 --volumes-from +运行的容器名 -d 镜像 指定即可

例:

docker run --name test -v /data/:/usr/local/nginx/html -d nginx1
docker run --name test1 --volumes-from test -d nginx1
docker run --name test2 --volumes-from test -d nginx1

总结:

这时候,分别进入到test、test1、test2的容器内部的/usr/local/nginx/html下,就实现了文件共享,在test中创建文件,test1和test2中也可同步,宿主机的/data/目录下也同步,进行持久化

Docker存储驱动

Docker 存储驱动 ( storage driver ) Docker 的核心组件,它是 Docker 实现分成镜像的基础

1 、 device mapper ( DM ) :性能和稳定性存在问题,不推荐生产环境使用

2 、 btrfs :社区实现了 btrfs driver ,稳定性和性能存在问题(TrueNas和FreeNas)实现数据快照共呢个

3 、 overlayfs :内核 3.18 overlayfs 进入主线,性能和稳定性优异,第一选择(一种内核的机制,联合文件系统)

Container mount —— merged 挂载点

image layer —— lowerdir #镜像层,只读

Container layer —— upperdir #容器可写层

docker几秒就退出 docker容器退出后数据会丢失_docker_02

 如果docker info 查看当前docker版本时,看到下图 ,如果不是overlayfs需要尽快修改。

docker几秒就退出 docker容器退出后数据会丢失_docker几秒就退出_03

 

修改方法:

echo "overlay" > /etc/modules-load.d/overlay.conf
cat /proc/modules|grep overlay
reboot (前提内核1.8版本以上)
vim /etc/systemd/system/docker.service
--storage-driver=overlay

Docker资源限制

问题:默认情况下,如果不对容器资源做任何限制,容器内使用宿主机内所有资源,Docker限制可以从Memory、CPU、Block I/O三个方面,OOME:内存退出异常,一旦出现OOME,内存占满时会随机杀死进程,占用内存,所以要资源限制

Cgroup

Linux Cgroup 全称 Linux Control Group , 是Linux 内核的一个功能,用来限制,控制与分离一个进程组群的资源(如 CPU 、内存、磁盘输入输出等)。这个项目最早是由 Google 的工程师在 2006 年发起,最早的名称为进程容器( process containers )。在 2007 年时,因为在 Linux 内核中,容器( container )这个名词太过广泛,为避免混乱,被重命名为 cgroup ,并且被合并到 2.6.24 版的内核中去

Docker资源限制是基于Cgroup去实现的

限制资源使用

优先级控制

一些审计或一些统计

挂起进程,恢复执行进程

实验1:去利用Cgroup去限制一下CPU的使用率

1.安装gcc gcc-c++

2.vim main.c #编写c语言
int main(void)
{
int i = 0;
for(;;) i++;
return 0;
}
  1. gcc main.c #执行c语言,实现死循环,实现cpu占用率100%
  2. 执行 ./a.out
  3. 再开另一个终端 执行top 查看cpu使用率

查看 Cgroup 挂载点

[ root@master ~]# mount -t cgroup

1. 创建隔离组 cd /sys/fs/cgroup/cpu
mkdir cpu_test
echo “ 3848 ” >> sys/fs/cgroup/cpu/cpu_ test/tasks
#将cpu的进程号(可以用top查看),放在tasks文件下
8.echo 20000 > sys/fs/cgroup/cpu/cpu_ test/cpu.cfs_quota_us #限制cpu使用率到20%(总数是100000,分配了20000,所以是20%)

总结:限制cpu的使用率达到20%,

对Docker容器内存资源限制

资源分类:

可压缩性资源:blik i/o 、 cpu (基本上除了内存之外都是可压缩性资源)

不可压缩资源:内存 (不能压缩)

docker几秒就退出 docker容器退出后数据会丢失_云计算_04

 

-m或者 --memory #物理内存

--memory-swqp #虚拟内存+物理内存大小

docker几秒就退出 docker容器退出后数据会丢失_容器_05

 

对Docker容器CPU资源限制

docker几秒就退出 docker容器退出后数据会丢失_容器_06

 

docker几秒就退出 docker容器退出后数据会丢失_容器_07

 

Docker资源限制实验

①docker run --name stress -it --rm -m 256m (代表限制256m内存大小) lorel/docker-stress-ng:latest stress -vm 2

#基于乌班图的镜像用2个线程进行内存压测,-m 256m 代表限制256m,用docker stats 查看
free -m #查看内存数量
cpu info #查看cpu数量

②docker run --name stress -it --rm --cpus 2 (限制容器的cpu使用率,因为本机现在只有两个cpu,根据实际情况去限制)lorel/docker-stress-ng:latest stress --cpu 8

#使用8个线程进行cpu压测,--cpus 2 代表可以使用两个cpu,用docker stats 查看

③docker run --name stress -it --rm --cpuset-cpus 0 lorel/docker-stress-ng:latest stress --cpu 8

#使用8个线程进行cpu压测, --cpuset-cpus 0,代表第一个cpu的全部使用率去给这个容器去使用。 --cpuset-cpus 1代表第二个cpu的全部使用率去给这个容器去使用,--cpuset-cpus 1
docker run --name stress -it --rm --cpuset-cpus 0 --cpus 0.5 lorel/docker-stress-ng:latest stress --cpu 8
#代表第1个cpu(--cpuset-cpus 0)去给容器使用,并且使用率0.5( --cpus 0.5 ),用8个线程进行cpu压测,如果想要放入后台,+(-d)选项