当前位置: 代码迷 >> 综合 >> docker学习4--数据管理
  详细解决方案

docker学习4--数据管理

热度:67   发布时间:2023-12-12 23:46:08.0

从上图可以看出要想在docker内部以及容器之间管理数据,主要有两种方式:数据卷(Volumes)和挂载主机目录(bind mount)

1、数据卷

    数据卷是一个可供一个或多个容器使用的特殊目录,它绕过UFS,功能主要有:

  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响到镜像
  • 数据卷会一直默认存在,即使容器被删除

数据卷的使用,类似于Linux下对目录或文件进行mount,镜像中的被指定为挂载点的目录中的文件会复制到数据卷中(仅在数据卷为空时会复制)

1)创建一个数据卷

docker volume create my-volume

如果你的机器是Linux,你会在var.lib/docker/volumes目录下看到该volume

而Mac下的docker则是在VM里面又封装了一层,mac下的查看方式为:

docker run -it --privileged --pid=host justincormack/nsenter1cd /var/lib/docker/volumesqihoodeMacBook-Pro:~ root# docker run -it --privileged --pid=host justincormack/nsenter1
/ # cd /var/lib/docker/volumes
/var/lib/docker/volumes # ls
44f4b7e0592660de2239ecce520c3e091ea168853afb542b40a2deb2cc611b18  e46753a608e641e286ac1188af1a6710b1b520c72e4ec212da3636eb342f529f
5237fa93b9522e001090757bc0727557a2c1e3616d1ce7a3fe821c7120e5d675  f8b6527b8c6dcf1c0c5d3b85e3b406eaac88c588fc22e220f53c6117502dd054
527b7abeedd6f07e8e43224c6910b10edade306075ee7f04922ae69bee7d610a  metadata.db
a701dee6c7d8f4c05631e415ce80e7ff597316da49a684a0cd6f7370bf61dbed  minikube
a9a59950d4ffa7082f5eac397081bc30302b016c031d8c210d99cb4518d13c5d  my-volume
ac64ea2e779c08e41434196b9c50757cd8242cc4d9bcc25880b8ea8219922054  test-volume
backingFsBlockDev                                                 tets-vol
/var/lib/docker/volumes # 

2)查看数据卷

docker volume ls

3)本地主机查看数据卷的详细信息

docker volume inspect my-volume
qihoodeMacBook-Pro:~ root# docker volume inspect my-volume
[{"CreatedAt": "2021-09-10T08:51:07Z","Driver": "local","Labels": {},"Mountpoint": "/var/lib/docker/volumes/my-volume/_data","Name": "my-volume","Options": {},"Scope": "local"}
]

4)启动一个挂载数据卷的容器

使用--mount标记将数据卷挂载到容器里,一个容器可以挂载多个数据卷

qihoodeMacBook-Pro:~ root# docker run -it --mount source=my-volume,target=/test ubuntu:20.04 /bin/bash
root@1c912cd98c17:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  test  tmp  usr  var

如果target对应的目录不存在,会自动创建

5)在容器下的test目录下创建文件

root@1c912cd98c17:/# cd test
root@1c912cd98c17:/test# ls
root@1c912cd98c17:/test# mkdir file1

在本机的my_volume下查看,出现file1文件

/var/lib/docker/volumes/my-volume # ls
_data
/var/lib/docker/volumes/my-volume # cd _data
/var/lib/docker/volumes/my-volume/_data # ls
file1

6)删除容器,发现数据还在

docker rm containerID

再去/var/lib/docker/volume目录下查看,file1文件仍然存在

2.挂载主机目录

     使用--mount标记还可以挂载一个本地主机的目录到容器中去

1)创建容器,指定挂载目录

docker run -it --mount type=bind,source=/myFile/test1,target=/test ubuntu:20.04 /bin/bash

source必须指定绝对路径,否则会报错。

2)在容器的test文件下创建文件

root@425be975215d:/# cd test
root@425be975215d:/test# mkdir file1

在主机的/myFile/test1目录下可以看到file1文件

3)Docker挂载主机目录的默认权限是读写,用户可以增加readonly指定为只读,如下

docker run -it --mount type=bind,source=/Users/zhouquanwei/myFile/test1,target=/test ,readonly ubuntu:20.04 /bin/bash

此时如果,再在容器的test目录下创建文件则会报错

3.tmpfs

     挂载存储在本地主机系统的内存中,而不会写入本地主机的文件系统,这种方式一般不使用。