dsfafaadfsa

docker 数据卷详解

docker 数据卷

参考:
docker volumes

1. 为什么需要数据卷?

一个容器运行一段时间,会产生一些数据,日志等,如果数据放到容器中,如果容器删除了,数据就没了。

2. 什么是数据卷?

可以将理解为宿主机的目录,当我们使用绑定容器的目录,可以理解为我们将宿主机的目录容器的目录建立了映射关系。

比如:

容器的/test目录和宿主机的/test目录绑定;
在容器的/test目录新建A文件;
在宿主机的/test/A文件存在;
如果删除了容器,宿主机的/test/A文件依然存在;

3. 测试容器数据卷使用

首先创建一个docker volume

docker volume create testA

查看volume的信息

docker volume inspect testA

[
    {
        "CreatedAt": "2023-01-10T14:17:27Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/testA/_data",
        "Name": "testA",
        "Options": {},
        "Scope": "local"
    }
]

macbook找不到路径,是因为mac的docker是运行在虚拟中的,可以使用以下命令

docker run --pid=host --privileged -it --rm justincormack/nsenter1

数据卷的路径即为/var/lib/docker/volumes/testA/_data

启动一个容器,绑定该数据卷

docker run -it -d --volume=testA:/testA --name test-volume1 centos:7

使用docker inspect 查看volume数据

"Mounts": [
        {
            "Type": "volume",
            "Name": "test",
            "Source": "/var/lib/docker/volumes/testA/_data",
            "Destination": "/testA",
            "Driver": "local",
            "Mode": "z",
            "RW": true,
            "Propagation": ""
        }
    ],

4. 使用docker volume命令管理volume

  1. create:创建
  2. rm:删除
  3. ls:显示list
  4. inspect:显示详情
  5. prune:删除没有用到的volume

5. 使用docker run --volume 绑定数据卷

使用 --volume 映射容器目录. 内容是 <卷>:<容器目录>:<Mode>

卷的形式:

  1. 为空,即为匿名挂载,会生成/var/lib/docker/volumes/随机字符串/_data 目录
  2. 为不加 / 的名称,即为具名挂载,比如:testA,会生成/var/lib/docker/volumes/testA/_data 目录
  3. 为加 / 的名称,即为绑定挂载,比如:/Users/wuqi/test,即为本机的路径. (可以绑定文件和目录,卷只能绑定目录)

Mode:ro或者rw

如果没有目录,会自动创建一个新的目录。

一个卷可以同时被多个容器使用,docker run的时候加 --volumes-from 参数即可继承容器的volume并绑定。

6. 查看volume是否被使用

  1. 查看容器使用的volume

    docker inspect testCcon -f '{{.Mounts}}'

  2. 查看volume被那些容器使用了

    docker ps -a -f "volume=testA"

7. 匿名挂载和具名挂载的区别

加了 --rm ,当容器停止的时候匿名卷会自动删除

8. 使用docker commit

绑定volume:

docker run -d --volume=/Users/wuqi/test1:/test1 --volume=test2:/test2 -it --name=centos-test centos

修改文件test1,和目录test2

vi test1
cd /test2
touch test2file
vi touch2file

使用commit提交这次修改

docker commit -a "qi.wu" -m "this is test file" centos-test qi.wu/centos:01

用提交的新image创建容器

docker run -it --rm qi.wu/centos:01

发现只有test1文件和test2目录

docker inspect 76b720a8f904 -f "{{.Mounts}}"

使用docker inspect发现没有绑定volume。这是因为卷的数据是独立于容器的,容器里只记录了卷操作,真正的数据修改是在宿主机上的。

9. 使用docker run --mount 命令绑定数据卷

跟使用--volume有同样的效果,使用key=>value形式,更清晰。

  • type用于指定挂载类型,volume表示使用卷,bind表示使用绑定挂载,
  • source参数指定对应的卷名,如果使用匿名卷,则省略source参数
  • target参数用于指定将卷或者宿主机目录挂载到容器的哪个目录上,如果使用绑定挂载,source参数对应宿主机上的目录。
docker run -it -d --name=test-mount --mount type=volume,src=test1,dst=/data nginx
posted @ 2023-02-26 22:13  狩猎者丿七夜  阅读(116)  评论(0编辑  收藏  举报