容器卷管理
容器运行数据存放在哪里?
容器在运行的时候产生的数据文件,会存放在宿主机上吗?存在哪个地方?
首先,容器运行产生的文件是肯定存放在宿主机的文件系统上的,而且会存放在/var/lib/下,我们可以做一个测试
# 实验步骤 1. 运行一个容器,在容器内创建一个文件
# 2. 退出容器,在宿主机上查找刚刚所创建的文件是否存在,存在哪?
# 启动容器
[root@docker ~]# docker run -it --name linux1 centos:7
[root@c5befd87e9fb /]# ls
anaconda-post.log dev home lib64 mnt proc run srv tmp var
bin etc lib media opt root sbin sys usr
[root@c5befd87e9fb /]# touch container_test_file
[root@c5befd87e9fb /]# ls
anaconda-post.log container_test_file etc lib media opt root sbin sys usr
bin dev home lib64 mnt proc run srv tmp var
[root@c5befd87e9fb /]#
# 这里我们可以使用快捷键 Ctrl+p+q 可以退出容器并保持容器的运行
[root@docker ~]# find / -name container_test_file
/var/lib/docker/overlay2/339a8ce495b9b457ae048596913ea1dfa1a8ab5d7522fc9328bf4b1adf89d5be/diff/container_test_file
/var/lib/docker/overlay2/339a8ce495b9b457ae048596913ea1dfa1a8ab5d7522fc9328bf4b1adf89d5be/merged/container_test_file
这里我们可以看到可以查找到这2个文件,他们都是在/var/lib/overlay2/339a8ce495b9b457ae048596913ea1dfa1a8ab5d7522fc9328bf4b1adf89d5be/下
但是有一个是在diff下,有一个是在merged下
我们首先说这个merged,这个目录是容器运行的时候才会出现的目录,我们可以将容器停掉,再次查看,这个目录就不存在了
[root@docker ~]# docker stop linux1
linux1
[root@docker ~]# find / -name container_test_file
/var/lib/docker/overlay2/339a8ce495b9b457ae048596913ea1dfa1a8ab5d7522fc9328bf4b1adf89d5be/diff/container_test_file
现在我们可以看见,merged确实不存在了,现在只有diff存在
那么这俩目录有什么差别呢
首先是diff,这个是different这个单词的缩写,也就是差异的意思,这个目录代表这是一个差分卷,不管容器运不运行,都会存在
然后是merged,这个单词是整合的意思,只有当容器运行时存在
那么既然在宿主机上存在这个目录,那我们能不能直接在宿主机上修改文件呢,可以!
# 我们停止容器,尝试修改container_test_file内容
[root@docker ~]# docker stop linux1
linux1
# 因为容器已经停止了,所以只有diff目录存在
[root@docker ~]# cd /var/lib/docker/overlay2/339a8ce495b9b457ae048596913ea1dfa1a8ab5d7522fc9328bf4b1adf89d5be/diff/
[root@docker diff]# ls
container_test_file root
# 将文件内容修改
[root@docker diff]# echo "change file tag" > container_test_file
[root@docker diff]# cat container_test_file
change file tag
# 重新启动容器,查看文件内容
[root@docker diff]# docker exec -it linux1 /bin/bash
[root@c5befd87e9fb /]# ls
anaconda-post.log container_test_file etc lib media opt root sbin sys usr
bin dev home lib64 mnt proc run srv tmp var
[root@c5befd87e9fb /]# cat container_test_file
change file tag
我们可以看到容器内部的这个文件也是发生了变动,那我们来看看merged目录内是否也发生了改变
[root@docker 339a8ce495b9b457ae048596913ea1dfa1a8ab5d7522fc9328bf4b1adf89d5be]# cd merged/
[root@docker merged]# ls
anaconda-post.log container_test_file etc lib media opt root sbin sys usr
bin dev home lib64 mnt proc run srv tmp var
[root@docker merged]# cat container_test_file
change file tag
我们可以看到,merged里面的内容也是一样的,在容器运行的时候merged会整合差分卷里面的内容,也就是说,在容器运行的时候diff和merged里面的内容是没有区别的
容器数据持久化存储
刚刚可以看到,容器运行时产生的数据是可以在宿主机上找到的,那如果容器被删除了呢,那么这些数据也会被删除
# 删除容器,查看目录是否被删除
[root@docker ~]# docker rm -f linux1
linux1
[root@docker ~]# find / -name container_test_file
[root@docker ~]#
可以看到,这个文件确实不存在了,那么我想把容器运行时产生的数据永久保存在我的宿主机上该怎么办呢
想要持久化存储,我们可以在启动容器的时候使用 -v 参数
用法1
[root@docker ~]# docker run -itd --name linux1 -v /linux centos:7
dcb387e00d63e2817e181112fff36db2b361fedfc34f96287ee3f55f117f7168
我们直接在-v后面跟上一个目录,那么在容器内部就会创建出来这个目录
[root@docker ~]# docker exec -it linux1 /bin/bash
[root@dcb387e00d63 /]# ls
anaconda-post.log dev home lib64 media opt root sbin sys usr
bin etc lib linux mnt proc run srv tmp var
# 我们可以看到,/linux这个目录确实已经存在了,那么我们在这个目录创建一个文件
[root@dcb387e00d63 linux]# touch linux_file
[root@dcb387e00d63 linux]# ls
linux_file
那么这个文件我们是否也可以在宿主机上查到呢
[root@docker ~]# find / -name linux_file
/var/lib/docker/volumes/57fb9707b64a6d521389c4f67cbba75a3847ed1de612bf539db1890db9019a13/_data/linux_file
那我们删除容器,看这个文件是否依旧存在
[root@docker _data]# docker rm -f linux1
linux1
[root@docker _data]# find / -name linux_file
/var/lib/docker/volumes/57fb9707b64a6d521389c4f67cbba75a3847ed1de612bf539db1890db9019a13/_data/linux_file
我们可以看到,虽然容器被删除了,但是存在容器里的文件依旧被保留在了宿主机上了
用法2
刚刚那种方法确实可以把容器内的文件给保留下来,但是存在宿主机上的位置太长了,不容易记,那我想指定他保存在我宿主机的某个地方,可以做到吗? 可以的
[root@docker ~]# docker run -itd --name linux1 -v /media:/linux centos:7
d250e0d2ffcae00834107935a97afc854ede4a4b27fb843a1e268cd6191976a5
这里的 -v 后面是 /media:/linux 这个意思是将宿主机的/media这个目录映射到容器内的/linux目录
也就是说你在宿主机上的/media目录内创建文件,那么容器内的/linux目录也会相应的创建一个文件,反之亦然
[root@docker ~]# cd /media/
[root@docker media]# echo test_volume > test
[root@docker media]# ls
test
# 进入容器内部查看文件
[root@docker media]# docker exec -it linux1 /bin/bash
[root@d250e0d2ffca /]# cd linux/
[root@d250e0d2ffca linux]# ls
test
[root@d250e0d2ffca linux]# cat test
test_volume
是没有任何问题的,当然我演示的是在外面创建,在容器内查看,反过来操作也是一样的,在容器内创建文件,在外面去查看,结果是一样的
实验
实验需求
1.使用nginx镜像启动容器
2.将本地的/html目录映射到容器内,使容器读取index.html文件
3.要求可以在宿主机上修改index.html文件,容器内也会同步修改
# 实验步骤 1.拉取nginx镜像
# 2.启动容器指定必要的参数
# 3.修改index文件,通过curl命令查看是否生效
# 1. 拉取nginx镜像
[root@docker ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
Digest: sha256:1a53eb723d17523512bd25c27299046cfa034cce309f4ed330c943a304513f59
Status: Image is up to date for nginx:latest
docker.io/library/nginx:latest
# 2.使用nginx启动容器,并指定 -v 参数
[root@docker ~]# mkdir /html
[root@docker ~]# docker run -itd --name web -v /html:/usr/share/nginx/html -p 8080:80 nginx
5149ebd97d88978a4656433a23a3c4cb440a48f8113593106a86405b3391d3e6
# 3.进入宿主机/html目录,创建index.html文件
[root@docker html]# echo 123 > index.html
[root@docker html]# curl localhost:8080
123
# 4.修改文件内容,重新使用curl命令查看
[root@docker html]# echo hello > index.html
[root@docker html]# curl localhost:8080
hello
本文来自博客园,作者:FuShudi,转载请注明原文链接:https://www.cnblogs.com/fsdstudy/p/17946915