docker存储卷

docker容器存储卷


一、什么是存储卷

  • Docker镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜 像层并在镜像栈顶部添加一个读写层
  • 如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会 从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在, 只是已经被读写层中该文件的副本所隐藏,此即“写时复制(COW)”机制

  • 关闭并重启容器,其数据不受影响;但删除Docker容器,则其更改将会 全部丢失
  • 存在的问题

    • 存储于联合文件系统中,不易于宿主机访问; •容器间数据共享不便
    • 删除容器其数据会丢失
    • 解决方案:“卷(volume)”
    • “卷”是容器上的一个或多个“目录”,此类目录可绕过联合文件系统,与宿主机 上的某目录“绑定(关联)”
  • Docker有两种类型的卷,每种类型都在容器中存在一个挂载点,但其在 宿主机上的位置有所不同;

    • 绑定挂载的卷
      • 宿主机上的目录是用户指定的,在容器中的目录也是用户指定的
    • docker管理的卷
      • 容器中的目录是用户指定的,在宿主机上的目录是在固定目录下自动生成的
  • 脱离容器的生命周期,也可以脱离节点的生命周期

二 、存储卷实现

1.docker管理的卷

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#########################################################
#########################docker管理的卷####################
##########################################################

#1.容器中的目录是用户指定的,在宿主机上的目录是在固定目录下自动生成的,-v选项指定绑定的卷,自动在容器中创建对应的目录,并且指定的容器中的目录与宿主机上目录建立了关联关系
#2.创建容器的命令行中使用--rm选项则退出容器时删除容器,宿主机上对应的存储卷则也将删除
#3.停止容器宿主机上的存储卷不会被删除
#3.如果使用docker container rm 容器,宿主机上对应的存储卷不会被删除

[root@centos7 ~]# docker run --name pc1 -it -v /mydata busybox
# ls
mydata

#可查看pc1容器对应的宿主机上的目录的关联关系
[root@centos7 ~]# docker volume ls
[root@centos7 ~]# docker container inspect pc1
"Mounts": [
{
"Type": "volume",
"Name": "29fd92b6acf728b23323168ff82e7e34b588b46f1698db2adb6fe3d6bc9713d0",
"Source": "/var/lib/docker/volumes/29fd92b6acf728b23323168ff82e7e34b588b46f1698db2adb6fe3d6bc9713d0/_data",
"Destination": "/mydata",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}

#容器中创建文件
/ # cd /mydata/
/mydata # ls
/mydata # touch a

#宿主机在关联的目录中查看文件是否存在
[root@centos7 ~]# cd /var/lib/docker/volumes/29fd92b6acf728b23323168ff82e7e34b588b46f1698db2adb6fe3d6bc9713d0/_data
[root@centos7 _data]# ls
a

#退出容器
/mydata # exit
#宿主机上查看对应的目录
[root@centos7 ~]# docker container ps -a
[root@centos7 _data]# ls
a

#删除容器
[root@centos7 ~]# docker container rm pc1
pc1
#宿主机上查看对应的存储卷目录
[root@centos7 _data]# ls
a

2.绑定挂载的卷

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
###########################################################
#######################绑定挂载的卷#########################
###########################################################

#宿主机上的目录是用户指定的,在容器中的目录也是用户指定的

#宿主上指定目录
[root@centos7 ~]# mkdir /daizhe

#创建容器并指定宿主机上的存储卷和指定容器中的目录进行关联
#/daizhe为手动指定的宿主机的目录
#/mydata为手动指定的容器中的目录
[root@centos7 ~]# docker run --name pc1 -it -v /daizhe:/mydata busybox
/ # ls
mydata

#测试
/ # cd /mydata/
/mydata # touch a
[root@centos7 ~]# ls /daizhe/
a

#删除容器卷不会被删除
[root@centos7 ~]# docker container rm pc1
pc1
[root@centos7 ~]# ls /daizhe/
a

3.多个容器挂载到宿主机上的同一个存储卷上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
###########################################################
#################多个容器挂载到宿主机上的同一个存储卷上########
###########################################################
#创建三个容器,同时容器到宿主机的存储卷指定为同一个目录
[root@centos7 ~]# docker run --name pc1 -it -v /daizhe:/mydata busybox
[root@centos7 ~]# docker run --name pc2 -it -v /daizhe:/mydata2 busybox
[root@centos7 ~]# docker run --name pc3 -it -v /daizhe:/mydata3 busybox

#测试是否同时挂载上宿主机上的同一个卷
#宿主机在此目录下创建文件
[root@centos7 ~]# cd /daizhe/
[root@centos7 daizhe]# touch a c ddd

#检测宿主机上文件是否存在
[root@centos7 ~]# docker container exec pc1 ls /mydata
a
c
ddd
[root@centos7 ~]# docker container exec pc2 ls /mydata2
a
c
ddd
[root@centos7 ~]# docker container exec pc3 ls /mydata3
a
c
ddd
  • 利用存储卷实现容器间共享数据
  • 名称空间共享
    • 可共享
      • Net、IPC、UTS
    • 不可共享
      • Mount、User、PID

-v,
–volume list 绑定安装卷
–volume-driver string 容器的可选卷驱动程序
–volumes-from list 从指定安装卷

4.容器间共享存储卷即容器间复制存储卷

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#创建容器,将容器中的/mydata目录与宿主机的/daizhe进行挂载实现存储卷
[root@centos7 ~]# docker run --name pc1 -it -v /daizhe:/mydata busybox
/ # ls
mydata
/ # touch /mydata/a c ddd
/ # ls /mydata/
a c ddd

#创建一个容器命令为pc2复制pc1的存储卷
[root@centos7 ~]# docker run --name pc2 -it --volumes-from pc1 busybox
/ # ls
bin etc mydata root tmp var
dev home proc sys usr
/ # ls /mydata/
a c ddd

#宿主机上查看
[root@centos7 daizhe]# ls
a c ddd

在容器中使用Volumes

1
2
3
4
5
6
7
8
- 为docker run命令使用-v选项即可使用Volume   
- Docker-managed volume
- ~]# docker run -it -name bbox1 –v /data busybox
- ~]# docker inspect -f {{.Mounts}} bbox1
- 查看bbox1容器的卷、卷标识符及挂载的主机目录
- Bind-mount Volume
- ~]# docker run -it -v HOSTDIR:VOLUMEDIR --name bbox2 busybox
- ~]# docker inspect -f {{.Mounts}} bbox2

详细信息过滤

1
2
3
4
5
6
7
8
9
10
11
#显示的文件为json的文件格式
- 字段内嵌
[root@centos7 ~]# docker container inspect pc1

#引用一级字段过滤
[root@centos7 ~]# docker container inspect -f {{.NetworkSettings}} pc1
{{ c01b6a9b6146da49e5374db58e8aae168286c29b5b2fb0a814673415a4e4d796 false 0 map[] /var/run/docker/netns/c01b6a9b6146 [] []} {3db3b94ed903cdc6e5dfa72af482b30ff16faf23a08d697e4e3d3f0c01175e42 172.17.0.1 0 172.17.0.2 16 02:42:ac:11:00:02} map[bridge:0xc4205aa000]}

#引用二级字段过滤
[root@centos7 ~]# docker container inspect -f {{.NetworkSettings.Networks.bridge.IPAddress}} pc1
172.17.0.2

josn格式文件美观显示

1
[root@centos7 ~]# yum install jq -y

-------------------码字不易尊重原创转载标注不胜感激-------------------
Yes or no?
0%