侧边栏壁纸
博主头像
晓然博主等级

走着、走着、花开了

  • 累计撰写 37 篇文章
  • 累计创建 15 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

[笔记]Docker核心技术之数据卷管理

晓然
2023-03-02 / 0 评论 / 0 点赞 / 33 阅读 / 1,258 字
温馨提示:
本文最后更新于 2023-03-07,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

数据卷介绍

为什么要用数据卷
1.宿主机无法直接访问容器中的文件
2.容器中的文件没有持久化,导致容器删除后,文件数据也随之消失
3.容器与主机之间、容器与容器之间共享文件
4.容器中数据的持久化将容器中的数据备份、迁移、恢复等

数据卷特点
1.数据卷存在于宿主机的文件系统中,独立于容器,和容器的生命周期是分离的
2.数据卷可以目录也可以是文件,容器可以利用数据卷与宿主机进行数据共享,实现了容器间的数据共享和交换
3.容器启动初始化时,如果容器使用的镜像包含了数据,这些数据会拷贝到数据卷中
4.容器对数据卷的修改是实时进行的,数据卷的变化不会影响镜像的更新。数据卷是独立于联合文件系统,镜像是基于联合文件系统。镜像与数据卷之间不会有相互影响。

数据卷挂载

数据卷三种挂载方式

1.bind mounts:将宿主机上的一个文件或目录被挂载到容器上
2.volumes:由Docker创建和管理。使用docker volume命令管理
3.tmpfs mounts:tmpfs是一种基于内存的临时文件系统。tmpfs mounts数据不会存储在磁盘上

image-20230303105614798

bind mounts方式挂载数据卷

1.利用docker run/create 的参数为容器挂载数据卷
2.用法:

  • -v,–volume参数:-v 宿主机文件或者文件夹:容器中的文件或者文件夹路径
  • –mount参数: --mount type=bind,src=宿主机文件或文件夹路径,dst=容器中的文件或者文件夹路径

–mount方式中的src指定的文件和路径必须提前创建或存在

3.案例演示
-v参数将宿主机/opt/demo1目录映射到容器内的/root/c_dir1目录,示例如下

$ docker run -dit -v /opt/demo1:/root/c_dir1 ubuntu

--mount参数将宿主机/opt/demo2目录映射到容器内的/root/c_dir2目录

# 直接运行挂载命令,报错,提示非法挂载目录,源目录不存在
xiaoran@cjdll:~$ docker run -dit --mount type=bind,src=/opt/demo2,dst=/root/c_dir2 ubuntu
docker: Error response from daemon: invalid mount config for type "bind": bind source path does not exist: /opt/demo2.
See 'docker run --help'.
# 创建文件夹
xiaoran@cjdll:~$ sudo mkdir /opt/demo2
# 再次挂载成功
xiaoran@cjdll:~$ docker run -dit --mount type=bind,src=/opt/demo2,dst=/root/c_dir2 ubuntu
a2c96c35f3535f9c390cc6be15622eb1dadfd5aca56ffeb20bbeb39fbafc3c70

volumes方式挂载数据卷

用法
1.-v,–volume参数:-v VOLUME_NAME:容器中的文件或者文件夹路径
2.–mount参数:--mount type=volume,src=VOLUME_NAME,dst=容器中的文件或者文件夹路径
3.volume管理命令

docker volume  create      创建一个数据卷
docker volume  inspect     查看数据卷详细信息
docker volume  ls          查看已经创建的数据卷对象
docker volume  prune       删除未被使用的数据卷对象
docker volume  rm          删除一个或多个数据卷对象

使用案例
-v参数,将数据卷名为volume-demo的数据卷映射到容器内的/root/c_dir3目录

$ docker run -dit -v  volume-demo:/root/c_dir3 ubuntu
ad5912c67f62b9c5f018bce2d2c606eff78cbd0cbc9b2a3d92a393f07cc57c9b

查看创建的数据卷

$ docker volume ls
DRIVER    VOLUME NAME
local     volume-demo

查看volume-demo的数据卷详细信息,发现路径为宿主机的/var/lib/docker/volumes/volume-demo/

$ docker volume inspect volume-demo
[
    {
        "CreatedAt": "2023-03-03T10:32:59+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/volume-demo/_data",
        "Name": "volume-demo",
        "Options": null,
        "Scope": "local"
    }
]

删除数据卷前需要先删除对应的容器,否则无法删除

xiaoran@cjdll:~$ docker volume rm  volume-demo
Error response from daemon: remove volume-demo: volume is in use - [ad5912c67f62b9c5f018bce2d2c606eff78cbd0cbc9b2a3d92a393f07cc57c9b]
xiaoran@cjdll:~$ docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED              STATUS              PORTS     NAMES
ad5912c67f62   ubuntu    "/bin/bash"   About a minute ago   Up About a minute             nice_wescoff
xiaoran@cjdll:~$ docker stop ad59
ad59
xiaoran@cjdll:~$ docker volume rm  volume-demo
Error response from daemon: remove volume-demo: volume is in use - [ad5912c67f62b9c5f018bce2d2c606eff78cbd0cbc9b2a3d92a393f07cc57c9b]
xiaoran@cjdll:~$ docker rm ad5
ad5
xiaoran@cjdll:~$ docker volume rm  volume-demo
volume-demo
xiaoran@cjdll:~$ docker volume ls
DRIVER    VOLUME NAME

–mount参数用法类似。

tmpfs mount方式挂载数据卷

用法

# PATH为容器内部路径
--mount type=tmpfs,dst=PATH

案例

xiaoran@cjdll:~$ docker run -dit --mount type=tmpfs,dst=/root/c_dir3 ubuntu
eb5e13c3f92e4e073ecc2d6caccfef9a58a3663314a3bf790549993953b31a79

数据卷使用注意

1.如果挂载一个空的数据卷到容器中的一个非空目录中,那么这个目录下的文件会被复制到数据卷中
2.如果挂载一个非空的数据卷到容器中的一个目录中,那么容器中的目录中会显示数据卷中的数据。如果原来容器中的目录中有数据,那么这些原始数据会被隐藏掉

总结

待更新

0

评论区