Docker:容器数据卷

Docker:容器数据卷

是什么?可以吃吗?

Docker 理念:把应用和环境打包成一个镜像
那么数据呢?如果数据都在容器里面,那把容器删了不就啥都没有了吗?
需求:数据持久化
比如:我有一个MySQL容器,删了就没有了,我想让数据存在本地而不是在容器里。

容器之间有一个数据共享的技术,Docker容器中产生的数据可以同步到本地。
这就是卷技术,目录的挂载,将我们容器内的目录,挂在到Linux上面。

1
mysql/usr/mysql -> linux/home/mysql

就是容器的持久化和同步操作,容器间的数据也可以共享

如何使用?

直接使用命令挂载 -v

1
docker run -it -v 主机目录:容器内目录

这样主机目录和容器内目录的文件会进行双向同步

实例

MySQL
1
docker run -d -p 1919:3306 -v /home/mysql/conf:/etc/mysql/comf.d -v /home/mysql/data:/var/lib/mysql -e ES_JAVA_OPTS=-Xms64m -Xmx512m -e MYSQL_ROOT_PASSWORD=114514 --name mysql-demo  mysql:latest

假设我们删除这个容器,本地的数据依旧不会丢失,这就实现了容器数据持久化的功能

具名和匿名挂载

匿名挂载
1
2
3
4
5
6
7
8
9
-v 容器内路径
docker run -d -P --name nginx01 -v /ect/nginx nginx
# 查看所有 volume 的情况
docker volume ls
DRIVER VOLUME NAME
local 9af6582b20e390febba278f366682dd8aaf6ab58f0e2b96c21f6eabd40ef5fb2
local 5462336c5e984de19ce4c89b9fbf66920409b9b165e5a5bb6a10c88916698487
local d2e5f63f05a5810ce371fe7a9c5f453c15405053018890ff8e0cee881a84eb9
# 这里发现,这种就是匿名挂载,我们在-V只写了容器内的路径,没有写容器外的路径!
具名挂载
1
2
3
4
5
6
7
8
9
10
-v 卷名:容器内路径
docker run -d -P --name nginx02 -v jvmk-nginx:/ec/nginx nginx
docker volume ls
DRIVER VOLUME NAME
...
local jvmk-nginx
# 查看卷
docker volume inspect jvmk-nginx
...
"Mountpoint":"/var/lib/docker/volumes/juming-ninx/_data",

所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxx/_data
我们通过具名挂载可以方便的找到我们的卷,大多数情况在使用的具名挂载

区别
1
2
3
-v 容器内路径                    #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载!

拓展
通过-v 容器内路径:ro / rw改变读写权限

1
2
3
4
# 只能从外部改变,无法在容器内改变
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
# 可读写
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

数据卷容器

就是专门用来提供数据卷的容器
创建一个容器A,让它管理数据卷,然后别的容器通过 --volumes-from 把它的数据挂过来用,还可以容器间的数据共享

1
2
3
4
# 创建一个数据卷容器
docker create -v /data --name data-container ubuntu
# 其他容器挂载 data-container 的数据卷
docker run -d --volumes-from data-container ubuntu

生命周期持续到没有人使用为止

Dockerfile

Dockerfile 就是用来构建 docker 镜像的构建文件(命令脚本)

创建一个dockerfile文件,名字可以随机,建议 dockerfile

1
2
3
4
5
6
# 文件内容 指令(大写) 参数
FROM centos
VOLUME ["vo1ume01","vo1ume02"]
CMD echo "----end----"
CMD /bin/bash
# 这里每个命令,就是镜像的一层

下一篇文章再讲


Docker:容器数据卷
https://www.zheep.top/posts/944518175/
作者
西行寺岩羊
发布于
2025年5月14日
许可协议