技术流ken

运维拯救世界

课堂记录:数据卷管理(三)–技术流ken

复习

 

image

container

 

关于镜像的操作:

pull

push

ls

inspect

rm   / rmi

save

load

tag

history

prune

 

 

容器的操作:

rename

ps -a

rm -f

stop

start

restart

kill

pause

unpause

commit   -p

run -i -t -d

exec

port

logs

stats

top

cp 把本地文件复制到容器中

 

制作镜像的两种方式:

1.commit

制作镜像是基于一个现有的容器

 

2.dockerfile

基于镜像制作镜像

 

阿里云仓库

共有

私有

 

镜像仓库:

dockerhub

registory

 

 

容器底层技术:

1.cgroup
实现了资源的使用限额,CPU,内存,以及磁盘

 

2,namespace

实现了资源隔离

PID,UTS,USER,NETWORK,MOUNT,IPC

 

 

 

数据卷volume功能特性

 

数据卷 是一个可供一个或多个容器使用的特殊目录,实现让容器中的一个目录和宿主机中的一个文件或者目录进行绑定。数据卷 是被设计用来持久化数据的
对于数据卷你可以理解为NFS中的哪个分享出来的挂载点,指宿主机共享的目录。

主要有如下的功能和特性

  • 容器中数据的持久存储
  • 容器间的资源共享
  • 容器的迁移(分布式)
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 数据卷默认会一直存在,即使容器被删除 (注意docker自主管理的会被删除,容器删除前一定要对数据卷进行备份)

 

 

 

 

实现数据卷

三种方式

1.绑定本机的特定目录

2.docker 自管理,docker会随机绑定主机的一个目录

3.基于一个现有的容器

 

1.绑定本机的特定目录 bind mount volume

[root@ken1 ~]# docker run -v /ken1:/var/www/html -d -P httpd 

-v   指定使用数据卷

/ken1:/var/www/html   #/ken1是宿主机的一个目录,/var/www/html是容器内的一个目录,如果说容器内的这个目录不存在的话,shi是会自动创建!

 

优势:

1.易于管理

2.可以实现数据的持久化

3.如果宿主机宕了,容器还是无法访问,可以使用NFS进行共享,多个宿主机进行负载均衡。

 

2.docker自管理的 docker manaagerment volume

这个和bind mount volume区别是用户无法再去管理本地的一个目录。docker会自己绑定宿主机下的一个目录

[root@ken1 ken1]# docker run -d -v /usr/local/apache2/htdocs -d -P httpd

 

可以通过下面的命令进行查看

[root@ken1 ken1]# docker container inspect 1365d65ead56

 

注意:

1.在删除容器的时候,是默认不会删除docker managerment volume中的数据卷的,如果想要在删除容器的时候顺带删掉相关的数据卷,需要加上选项-v

2.如果在删除容器的时候没有使用-v就会遗留下来数据卷,这样的数据卷叫做孤儿卷,即每人管理的卷

 

如果处理孤儿卷?

解决方案:

第一步:查看卷

[root@ken1 ken1]# docker volume ls
DRIVER              VOLUME NAME
local               986d19ec31801a630dc5209724560b074b025eacdb7cdf4fbbe3d5e6cc7f0771
local               d846455965a7bc208478bf7f6cf2f178263fe455c573504572d4a87f299800a1
local               f0d96791e2a60a6edf9b6550625bf568520988ffbaffcfa6353e924b4530dc1c
local               fa7bcf028a50a168d8b531eaff2dc74e6207421a5b3347430909d75eb4ad76a4

 

第二步:删除相应的孤儿卷

[root@ken1 ken1]# for i in `docker volume ls   | grep -v "DRIVER" | awk '{print $2}'`; do docker volume rm $i ;done

 

在删除容器的时候加上-v

[root@ken1 ken1]# docker container rm  -f -v a5e91fa77abe1a5

 

注意:

如果使用-v, 相应的数据卷也会被删掉,如果是在生产环境当中,应当做好数据备份工作!

 

 

3.基于一个容器

[root@ken1 ken1]# docker run -d --volumes-from 1e9a4c3b0bc30295d httpd

–volumes-from是基于一个现有的容器进行数据共享,这个参数后面应当跟上相应的容器ID或者容器名

 

数据卷的生命周期管理

 

1.备份

2.迁移

3.恢复

4.销毁

 

1.备份

备份只需要备份相应的数据卷即可,例如:

[root@ken1 ken1]# docker run -d  -v /ken:/var/www/html httpd

再上面的额例子中我们只需要做好/ken这个目录下的文件备份即可!

 

2.恢复

只需要重启一个容器,并且绑定ken下面备份的数据即可

 

3.迁移

把ken下面备份好的数据,发送到相应的节点即可,并使用bind mount volume方式运行容器即可

 

4.销毁

情况一:bind mount volumes

这种情况是绑定宿主机的一个目录,如果想要删除数据,只需要删掉宿主机的目录即可

 

情况二:docker managerment volume

需要在删除容器的时候加上选择-v

 

情况三:基于一个容器

 

分为两种情况:

1,如果是docker自管理,删除容器时使用-v

2.宿主机特定目录,需要删除宿主机上的特定目录

 

 

 

验证:数据卷被其他容器使用是否能够删掉

第一步:创建一个新的容器

[root@ken1 ken1]# docker run -d -v /data httpd

 

第二步:查看数据卷

[root@ken1 ken1]# docker inspect 3b1ce4b5f96150e866f322a600f93cd
...
/var/lib/docker/volumes/b0cfa7ae0abe933392c3e649f3d0bec0185c8357c9673ebc0322920cdab8235e/_data

 

第三步:基于现有容器在创建一个容器并绑定数据卷

[root@ken1 ken1]# docker run -d --volumes-from 3b1ce4b5f96150e866 httpd

 

第四步;查看第二个容器的数据卷

发现数据卷和第一个容器使用的数据卷是一致,说明两个容器现在共用一个数据卷

 "Name": "b0cfa7ae0abe933392c3e649f3d0bec0185c8357c9673ebc0322920cdab8235e",

 

 

第五步:查看数据卷

[root@ken1 ken1]# docker volume ls
DRIVER              VOLUME NAME
local               b0cfa7ae0abe933392c3e649f3d0bec0185c8357c9673ebc0322920cdab8235e

 

第六步:删除第一个容器并加上-v选择

[root@ken1 ken1]# docker rm -f -v 3b1ce4b5f961 
3b1ce4b5f961
[root@ken1 ken1]# docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                   NAMES
70df334b3f25        httpd               "httpd-foreground"   2 minutes ago       Up 2 minutes        80/tcp                  wonderful_shamir
39d5f620493b        httpd               "httpd-foreground"   9 minutes ago       Up 9 minutes        80/tcp                  goofy_herschel
c42a2a22c533        httpd               "httpd-foreground"   12 minutes ago      Up 12 minutes       80/tcp                  admiring_wilbur
1e9a4c3b0bc3        httpd               "httpd-foreground"   24 minutes ago      Up 23 minutes       80/tcp                  blissful_haslett
a6304e984f93        httpd               "httpd-foreground"   About an hour ago   Up About an hour    0.0.0.0:32778->80/tcp   brave_varahamihira
[root@ken1 ken1]# docker volumes ls
docker: 'volumes' is not a docker command.
See 'docker --help'
[root@ken1 ken1]# docker volume ls
DRIVER              VOLUME NAME
local               b0cfa7ae0abe933392c3e649f3d0bec0185c8357c9673ebc0322920cdab8235e

 

验证总结:

两个容器如果共享了一个数据卷的话,删除一个容器的时候即使加上-v选线的话,即使删除源容器的话数据卷并不会被删除。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

发表评论

电子邮件地址不会被公开。