docker数据卷

解决数据持久化问题
数据创建和释放都比较频繁
docker分层文件系统,性能差,生命周期与容器相同
docker数据卷
mount到主机中,绕开分层文件系统,和主机磁盘性能相同,容器删除后依然保留,仅限本地磁盘,不能随容器迁移。
docker提供了两种卷:bind mind , docker managed volume
bind mount
是将主机上的目录或文件mount到容器里。
使用直观高效,易于理解。
使用-v选项指定路劲,格式< host path >:< container path >,:之前是宿主机的绝对路劲,后面是容器内的路劲,如果存在直接挂接,不过不存在会创建。

server1和server2
docker network prune#把不用的对象释放掉
docker ps
docker rm -f demo1
docker rm -f affectionate_jones
docker ps -a
docker network prune
docker run --rm -it -v /data1:/data1 busybox
cd /data/
ls
touch file1
ls
以上写文件实际上是写到宿主机的文件中的
docker history registry:latest

在这里插入图片描述
这里的容器是定义好的,这里运行的是个应用,应用默认情况下会写到这个容器下的路劲中,如果想把数据保存到宿主机上,就应该把之前的路劲挂接到这个路劲下。

docker run --rm -it -v /data1:./data1 -v /data2:/data2:ro -v /etc/yum.repos.d/dvd.repo:/dvd.repo:ro busybox
ro表示只读,除了可以挂接目录外,还可以挂接文件
cd /data2/
ls
touch file2 #这个里面是不允许写东西的。

docker managed volume
bind mount 必须指定host文件系统路劲,限制了移植性。
docker managed volume不需要指定mount源,docker自动为容器创建数据卷目录。。
默认创建的数据卷目录在/var/lib/docker/volumes中。
如果挂载时指向容器内已有的目录,原有数据会被复制到volume中。

docker hostory nginx:latest
docker run -d --name demo nginx
docker volume ls #如果有的话,清理卷
docker volume prune
docker volume ls
docker ps
因为容器没有定义卷的挂载,所以容器没有创建卷,所以docker引擎在运行的时候也不会为你创建。
docker rm -f demo
docker volume ls
docker run -d --name demo registry
docker volume ls
docker inspect demo
docker管理卷只能支持目录的挂载,不能支持文件的挂载。
docker rm -f demo
docker volume prune
docker volume create vol1
docker volume inspect vol1
运行时:
docker run -d --name demo -v vol1:/var/lib/registry registry
冒号前写名称,后面写容器内的数据路劲
docker inspect demo
docker volume inspect vol1
cd /var/lib/docker/volumes/vol1/_data
ls 其中没有数据

举例

docker rm -f demo
docker run -d --name demo -v vol1:/usr/share/nginx/html nginx
cd /var/lib/docker/volumes/vol1/_data/
ls 其中有数据。
docker exec -it demo bash
ls
cd /usr/share/nginx/html
ls
docker rm -f demo
docker run -d --name demo -v /data1:/usr/share/nginx/html nginx
cd /data1/
ls
docker ps
docker exec -it demo bash
cd /usr/share/nginx/html
ls
这个是以宿主机的路劲为准的,

在这里插入图片描述

docker run -d --name demo -v vol2:/usr/share/nginx/html:ro nginx #冒号前是卷,而不是一个任意的路径
docker exec -it demo bash
ls
cd /usr/share/nginx/html/
ls
touch file #不能写
但默认情况下,没有-v是没有读写权限的。
docker history registry:latest#docker管理卷默认情况下,可以通过检测镜像上的参数直接进行创建,然后挂接。

以上两种卷针对单一主机,无法支持跨节点共享数据。容器可以调度到其他节点去运行,但数据不可以。
B、跨节点集群卷
卷插件。

docker卷默认使用的是local类型的驱动,只能存在宿主机,跨主机volume就需要使用第三方的驱动,
在这里插入图片描述
docker官方只提供了卷插件的api,开发者可以根据实际需求定制卷插件驱动。
在这里插入图片描述
docker引擎不会去管控卷插件。
docker plugin是以web service 的服务运行在每一台docker host上的,通过http协议传输rpc风格的json数据完成通信。
plugin的启动和停止,并不归docker管理,docker daemon倚靠在缺省路径下查找unix socket文件,自动发现可用的插件。
当客户端与daemon交互,使用插件创建数据卷时,daemon会在后端找到插件对应的socket文件,建立连接并发起相应的API请求,最终结合daemon自身的处理完成客户端的请求。

convoy插件

docker rm -f demo
docker volume prune #删除不要的卷

下载卷插件
底层
在这里插入图片描述
convoy卷插件实现
支持三种运行方式:devicemapper、NFS、EBS
以下实验使用nfs方式
在所有节点提前挂载NFS存储。
在两个节点上有共同的NFS系统。

server1 server2
mkdir /nfsshare
cd /nfsshare
ls
pwd
ls
yum install -y nfs-utils #安装客户端
ll
ll -d .
cd 
chmod 777 /nfsshare/
vim /etc/exports
/nfsshare *(rw,no_root_squash)
systemctl enable --now nfs
showmount -e
#server2
showmount -e 172.25.0.1 #能不能查看共享资源。如果可以则挂载过来
mount 172.25.0.1:/nfsshare/ /nfsshaer/
df
cd /nfsshare/
ls
这时两个主机的文件就同步了。

部署convoy卷插件

server1
tar zxf convoy-v0.5.2.tar.gz
cd convoy/
ls
cp convoy convoy-pdata_tools /usr/local/bin/
cd
创建一个docker缺省引擎的路径
mkdir -p /etc/docker/plugins/
cd /etc/docker/
cd plugins/
ls
cd ..
ls
cd plugins/ #docker引擎会自动扫描这个文件
ls
创建程序的sock文件
echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
ll
cat convoy.spec #文件内容就是本地的unix的socket套接字文件路径
convoy daemon --drivers vfs --drivers-opts vfs.path=/nfsshare &
#--drivers 驱动 --drivers-opts 指定路径
ps ax
cd /var/run/
cd convoy/
ls
ll convoy.sock
pwd
docker volume ls
convoy --help
convoy create vol1
convoy list
cd /nfsshare/
ls #其中的config目录不要删除
docker volume create -d convoy vol2
docker run -d --name demo -v vol1:/usr/share/nginx/html niginx
docker ps
docker inspect demo
curl 172.17.0.2
cd /nfsshare/
ls
cd vol1/
echo www.westos.org > index.html
curl 172.17.0.2
docker rm -f demo #假设这个容器被意外地销毁了。
在server2上
docker run -d --name demo -v vol1:/usr/share/nginx/html niginx
docker ps
curl 172.17.0.2
以上就是数据跨节点同步化
docker client -> docker daemon -> plugins -> nfs
docker客户端到docker引擎,通过固定的plugin目录,就是缺省路径,扫描plugins插件去调用底层的nfs文件系统将数据放上去,剩下的事情交由存储去完成。
systemctl status docker
回收插件
docker volume rm vol2
docker volume ls
docker volume rm vol1
cd 
docker ps -a
docker volume ls
convoy list
ps ax
fg
cd /etc/docker/
ls
cd plugins/
rm -f convoy.spec #如果不删除这个文件,docker重启会变慢。
ls
cd
systemctl restart docker
docker info

docker 安全
docker容器的安全性,很大程度上依赖于linux系统自身,评估docker安全性。
linux内核的命名空间机制提供的容器隔离安全
linux控制组机制对容器资源的控制能力安全,如果容器没有资源限制,会不断地向操作系统索要资源,会影响到系统上其他进程,
linux内核的能力机制所带来的操作权限安全
docker程序(特别是服务端)本身的抗攻击性。docker需要服务端。
其他安全增强机制对容器安全性的影响。

server1
docker ps
docker run -d --name demo nginx
docker ps
docker inspect demo | grep Pid
cd /proc/14338/#以本机为主
ls
cd ns/
ls
cd 
ll -d /var/lib/docker/

docker现在也可以使用podman机制,

自己的主机上
rpm -q podman

docker是由超级用户管理的
命名空间隔离的安全
当docker run启动一个安全容器时,docker将在后台为容器创建一个独立的命名空间,命名空间提供了最基础也最直接的隔离。
当虚拟机方式相比,通过linux namespace来实现的隔离不是那么彻底。
容器只是云翔在宿主机上的一种特殊的进程,那么多个容器之间使用的还是用一个宿主机的操作系统内核,
在linux内核中,有很多资源和对象是不能被namespace化的,比如:时间。
控制组资源控制的安全
当docker run启动一个容器时,docker将在后台为容器创建一个独立的控制组策略集合。
linux Cgroups提供了很多有用的特性,确保各容器可以公平地分享主机的内存、CPU、磁盘IO等资源。
确保当发生在容器内的资源压力不会影响到本地主机系统和其他容器,它在防止拒绝服务攻击DDOS方面必不可少。
内核能力机制
能力机制(CAPACITY)是linux内核一个强大的特性,可以提供细粒度的权限访问控制。
大部分情况下,容器并不需要“真正的”root权限,容器只需要少数的能力即可。
默认情况下,docker采用“白名单”机制,禁用“必需功能”之外的其他权限。
docker服务端防护
使用docker容器的核心是docker服务端,确保只有可信的用户才能访问到docker服务。
将容器的root用户映射到本地主机上的非root用户,减轻容器和主机之间因权限提升而引起的安全问题。
允许docker服务端在非root权限下运行,利用安全可靠的子进程来代理执行需要特权权限的操作,这些子进程只允许在特定范围内进行操作。
在这里插入图片描述
容器资源控制
Linux Cgroups的全程是linux control group
是限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等等。
对进程进行优先级设置、审计,以及将进程挂起和恢复等操作。
linux Cgroups给用户暴露出来的操作接口是文件系统。
它以文件和目录的方式组织在操作系统的/sys/fs/cgroup路径下。
执行此命令查看: mount -t cgroup

docker run --help|grep memory
docker ps #倘若有容器,则删掉
docker rm -f demo
docker run --rm -it --memory 200M busybox
free -m

容器和宿主机的很多资源是没有被隔离的。刚才的代码已经生效了,只是看不出来。

ll -d /proc/meminfo
docker ps
docker rm -f flamboyant_franklin
docker run -d --name demo -m 200M nginx
mount - t cgroup
cd /sys/fs/cgroup/
ls
cd memeory/
ls
cd docker/ 所有的docker容器都在docker目录中
ls
cd ..
控制宿主机上的某个进程
mkdir x1
ls
cd x1/
ls #其中的内容继承父级的。
cat memory.limit_in_bytes
echo 209715200 > memory.limit_in_bytes
cat memory.limit_in_bytes
cd 
df
cd /dev/shm/
ls
free -m
判断操作系统可用内存量是多少?
vmstat,有没有什么前提条件,内存管理是什么样的,进程是什么状态,或者是单纯的命令
操作系统上运行了很多程序,内存有什么管理方式,有些是独占的,不能共享,管理方式是不一样的?
dd if=/dev/zero of=bigfile bs=1M count=100
free -m
rm -f bigfile
cd /sys/fs/cgroup/memory/
cd x1/
ls
cat tasks
yum search cgroup
yum install -y libcgroup-tools.x96_64
cd /dev/shm
ls
cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=100

swap交换分区是物理分区不能用时开始用的。以上超出200M了,还可以用是因为,可以使用SWAP分区的。

rm -f bigfile
cd -
ls
docker run --help|grep memory
其中memory-swap对应的是memory.memsw.limit_in_bytes 是内存加swap总共多少

容器就是进程

docker inspect demo|grep Pid
ls
cd /sys/fs/cgroup/memory
ls
cd docker/
ls #容器目录全在tasks中

CPU限额
控制CPU使用率

cd /sys/fs/cgroup/
ls
cd cpu
ls
mkdir x2
cd x2/
ls
echo 20000> cpu.cfs_quota_us
cat cpu.cfs_quota_us
dd if=/dev/zero of=/dev/null & 这种动作会直接占cpu
top

CPU限额,控制CPU的使用率

cd /sys/fs/cgroup/
ls
cd cpu
ls
mkdir x2
cd x2/
ls
cat cpu.cfs_period_us
cat cpu.cfs_quota_us
echo 20000 > cpu.cfs_period_us

dd if=/dev/zero of=/dev/null & 这种动作会直接占cpu
top
若cpu有多个
cd sys/
ls
cd devices/
ls
cd system/
ls
cd cpu/
ls
cd cpu1/
ls
cat online
echo 0 > online

在这里插入图片描述

若想把cpu只用20%
cd /sys/fs/cgroup/
cd cpu/
ls
cd x2/
echo 15911 > tasks
top
ls
kill 15911

容器是怎么使用的。
cd
ls
docker ps
删除原先的
docker rm -f demo
docker rm -f demo2
docker run -d --cpu-period=100000 --cpu-quota=20000 --name demo nginx
表示给的100000CPU时间分片中,能用20000,这个设置表示20%的cpu时间。
docker ps
cd /sys/fs/cgroup/
ls
cd cpu
ls
cd docker/
ls
cd 容器名/
ls
cat cpu.cfs_quota_us

cpu按时间分片的

block IO限制

docker run -it --device-write-bps /dev/sda:30MB centos:7 获取一个shell #设置吞吐量的,bps表示写入量 vda虚拟设备
dd if=/dev/zeros of=file bs=1M count=100 oflag=direct#表示使用的是直连IO的。不能文件缓存
exit
docker container prune
docker ps -a
docker rm -f demo

隔离
docker 安全加固
利用LXCFS增强docker容器隔离性和资源可见性

docker run --rm -it --memory 200M busybox
free -m
cd /proc/
ls
cd

在这里插入图片描述

lxcfs /var/lib/lxcfs &
hierarchies:
ps ax
cd /var/lib/lxcfs/
ls
cd cgroup/
ls
cd ..
cd proc/
cd

在这里插入图片描述

free -m

设置特权级运行的容器:–privileged=true 这种权限是全开,
有时我们需要容器具备更多的权限,比如操作内核模块,控制swap交换分区,挂载USB磁盘,修改MAC地址等。

docker container prune
docker run --rm -it busybox
ip addr #报错
ip link set down dev eth0
id #超户没有权限,这个是因为在容器内权限是降低的,不像在宿主机上的权限
docker run --rm -it --privileged=true busybox
ip addr
ip link set down dev eth0
ip addr
ip link set up dev eth0
mtu 1500 qdisc noqueue

设置白名单
capabilities手册地址
在这里插入图片描述

docker run --rm -it --cap-add NET_ADMIN busybox
ip addr
ip addr add 172.17.0.10 dev eth0
ip addr
ip addr del 172.17.0.10 dev eth0
fdisk -l #看不了

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值