Docker数据卷

简介: Docker数据卷

一、什么是数据卷

数据卷是一个可供一个或多个容器使用的特殊目录,它将主机操作系统目录直接映射进容器。在容器中修改的内容可以在宿主机对应的目录下看到,比如:重要日志 、配置文件等。

因为镜像层是只读的,修改也只是在最上层添加一层读写层,读写层的文件会隐藏掉只读的那些同名文件,这些只读的文件在容器被删除时也会被删除,所以需要持久化。

二、Docker数据卷操作

2.1 查看当前数据卷
docker  volume ls
# 删除已经退出的docker进程
docker rm `docker ps -f status=exited -q`   # 注意不是单引号是 `飘号
docker rm `docker ps -f status=created -q`

2.2 创建(具名)数据卷

具名就是有名子的数据卷,比如这里我们创建的就是名为vol_test的具名数据卷。有具名就有匿名数据卷,匿名数据的名字是一个随机字符串,两个的删除逻辑可能会不一样,这个我们后面会再提到。

docker volume create vol_test
2.3 查看当前数据卷列表
docker volume ls
2.4 查看指定数据卷信息

Mountpoint 字段就是该数据卷挂载的宿主机的目录,当容器运行是,数据就会保存到该目录下。

docker volume inspect vol_test

2.5 挂载数据卷

有了数据卷后,我们来看看是如何挂载(也可以叫:映射)的。我们需要先运行一个容器,这里我们以ubuntu为例。

# 将数据卷vol_test 挂载到容器的/data目录下
docker run -dit -v vol_test:/data ubuntu
docker ps # 查看容器名

查看是否挂载成功。

docker inspect unruffled_noyce  # 注意:这里写你自己的容器名

2.6 挂载验证

我们在进入到容器,在容器的data目录下写点东西,

docker exec -it unruffled_noyce bash
echo 2023-02-20 volume test >> /data/volume_info.txt

然后在宿主机的对应的目录下查看,可以看到容器中修改的信息,在宿主机是可以看到的。

我们再停止并删除容器,刚才写的信息还是在的,这就是docker 的持久化的一种场景。

docker stop unruffled_noyce
docker rm unruffled_noyce

2.7 目录挂载的不同方式及权限设置(只读、可读写)
docker run -dit -v vol_test:/data_ro_test:ro -v /no_name -v /tmp/data:/data_tmp --name myubuntu ubuntu 

可以看到容器下多了我们挂载或绑定的三个目录。

说明:

  1. -v vol_test:/data_ro_test:ro 将具名数据卷vol_test 挂载到容器的data_ro_test目录,ro的作用是以只读的方式挂载,只有具名数据卷可以指定权限
  2. -v /no_name 是将宿主机的匿名数据卷,挂载到容器的no_name目录下。注意:匿名数据卷不能分配权限没比如:-v /no_name:ro 会报错
  3. 将宿主机/tmp/data目录,绑定(注意不是挂载)到容器的data_tmp目录,的区别。

使用docker inspect 命令查看详细的挂载信息。

docker inspect myubuntu  # 找到Mounts 查看具体的目录挂载信息,如下图

验证挂载及其权限

小结

有时候我们需要从宿主机传输文件到容器,有时候又需要从容器传文件到宿主机。

ls -al /tmp/data
sudo chown ns:ns /tmp/data   # ns
2.8 Dockerfile 挂载数据卷

Dockerfile挂载的数据卷通常情况下是匿名数据卷,为什么不是具名数据卷或者绑定某个目录呢?因为如果是具名或者绑定,就会导致Dockerfile的移植性变差,要求宿主机必须存在那个数据卷或者目录。

宿主机

创建Dockerfile文件

vi Dockerfile
FROM ubuntu
RUN mkdir /data_vol
RUN echo hello,world >> /data_vol/hello.txt
VOLUME /data_vol

构建及运行镜像

docker build -t myubuntu:1.0.1 .
docker run -dit myubuntu:1.0.1
docker ps  # 获取容器ID
docker inspect 容器ID  # 查看对应目录下的文件及内容即可

容器内验证

docker ps  # 获取容器ID
docker exec -it 容器ID bash
cat data_vol/hello.txt

2.9 共享数据卷

使用 --volumse-from 指定从哪个容器(可以指定多个容器)分享数据卷。

docker ps
docker run -dit --volumes-from myubuntu ubuntu

此时启动的容器我们没有通过 - v 去指定任何数据卷,通过inspect 命令可以看到跟 --volumes-from 指定的 myubuntu 容器的数据卷一致。

共享数据卷验证

就算 --volumes-from 指定的容器 myubuntu 停掉,也不会对已经共享数据卷有什么影响。

2.10 数据卷删除

绑定的方式:通过手动删除绑定的目录 rm /tmp/data/*

具名和匿名数据卷

docker volume ls  # 查看当前所有数据卷
docker volume create vol_nouse # 创建匿名数据卷 vol_nouse 
docker volume prune  # 删除掉没有使用的数据卷 vol_nouse

区别:

如果一个容器同时挂载了具名和匿名数据卷,并使用了 --rm 启动容器,容器在停止的时候,会自动删除匿名数据卷,不会删除具名数据卷。

使用 rm -v 在删除容器的同时也只会删除匿名数据卷。具名数据卷只能通过docker volume rm + vol_simple

docker rm -v -f CONTAINER_NAME


推荐一个零声学院免费教程,个人觉得老师讲得不错,分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,点击立即学习:

相关文章
|
2月前
|
关系型数据库 MySQL Docker
【Docker】4、Docker 数据卷
【Docker】4、Docker 数据卷
34 0
|
4月前
|
关系型数据库 MySQL 数据库
百度搜索:蓝易云【【Docker】Docker部署Mysql并设置数据持久化教程】
通过以上步骤,您已经成功地在Docker中部署了MySQL,并设置了数据持久化,确保数据在容器重新启动或迁移时得以保留。
53 0
|
5月前
|
数据管理 数据库 数据安全/隐私保护
数据管理与持久化:深度解析Docker数据卷
Docker 数据卷在容器化应用中扮演着关键角色,它们提供了一种灵活且可持久化的方式来处理应用数据。本文将深入讨论 Docker 数据卷的基本概念、使用方法以及一系列高级应用场景,通过更为丰富和实际的示例代码,帮助大家全面掌握数据卷的使用和管理。
|
4天前
|
存储 数据管理 数据安全/隐私保护
【Docker专栏】Docker存储卷管理:数据持久化的关键
【5月更文挑战第7天】本文探讨了Docker容器中数据持久化的关键——存储卷,包括其独立于容器生命周期的特性、数据共享与迁移能力。Docker提供默认、命名、数据卷容器和挂载宿主机目录四种卷类型。创建与管理涉及`docker volume create`、`ls`、`run`等命令。最佳实践建议使用命名存储卷,定期备份,避免存储敏感数据,并清理未使用卷。了解和有效管理存储卷能提升容器灵活性和数据管理效率。
【Docker专栏】Docker存储卷管理:数据持久化的关键
|
10天前
|
Shell Docker Ruby
3.Docker容器的数据卷
3.Docker容器的数据卷
|
16天前
|
存储 运维 Docker
Docker从入门到精通:Docker 容器数据卷详解
Docker 数据卷是持久化容器数据的关键机制,允许跨容器或主机共享,即使容器删除数据仍保留。创建数据卷可通过命令行或容器启动时指定,挂载到容器目录以读写。使用 `docker volume` 命令可管理数据卷,适用于持久化存储、数据共享及备份场景。了解和善用数据卷能优化 Docker 应用程序的运维。
23 0
|
1月前
|
关系型数据库 MySQL 应用服务中间件
docker镜像、容器数据卷
docker镜像、容器数据卷
|
2月前
|
数据管理 应用服务中间件 nginx
Docker卷和数据管理
Docker卷和数据管理
18 1
|
3月前
|
存储 机器学习/深度学习 Cloud Native
深入浅出Docker容器数据卷
深入浅出Docker容器数据卷
42 1
|
4月前
|
存储 Ubuntu Shell
Docker数据卷
Docker数据卷
56 0