容器数据卷
- 容器内产生的数据要持久化可以通过目录挂载的方式实现,将容器内的目录挂载到宿主机上实现数据的共享。容器上产生的数据会同步到宿主机上,宿主机上修改对应的文件内容也会同步到容器内。
- 对数据卷的修改会立即生效
- 对数据卷的更新不会影响镜像
- 数据卷会一直存在,即使容器被删除
创建数据卷
docker volume create 数据卷名字
查看数据卷
# 查看所有数据卷
docker volume ls
# 查看指定数据卷信息
docker volume inspect 数据卷名字
删除数据卷
# 根据名字删除数据卷
docker volume rm 数据卷名字
# 删除容器的时候同时删除数据卷
docker rm -v 容器ID
# 清理没有和任何容器关联的数据卷
docker volume prune
数据卷挂载
使用 -v 命令挂载
docker run -it -v 宿主机目录:容器内目录 -p 宿主机端口:容器端口
使用--mount挂载
# 挂载数据卷
--mount source=数据卷名字,target=容器内需要挂载的目录
# 具体命令
docker run -it --mount source=数据卷名字,target=容器内需要挂载的目录 -p 宿主机端口:容器端口
# 挂载目录
--mount type=bind,source=宿主机挂载的文件或路径,target=容器内需要挂载的目录
# 具体命令
docker run -it --mount type=bind,source=宿主机挂载的文件或路径,target=容器内需要挂载的目录 -p 宿主机端口:容器端口
# 挂载目录type的类型,不指定默认是:volume
# volume挂载的目录是宿主机的/var/lib/docker/volumes/,bind挂载的目录是用户自己指定的
# volume只能挂载目录,bind能挂载目录或者文件
区别
-v
-
多项使用冒号分隔,顺序不能变换
-
命令格式:宿主机目录:容器目录:[只读/读写]
-
宿主机目录必须是绝对路径,如果路径不存在会自动创建
--mount
-
多项使用逗号分隔,顺序可变换
-
挂载volume命令格式:[type=volume,]source=数据卷名,destination=容器路径[,只读/读写]
-
创建bind mount命令格式:type=bind,source=宿主机路径,destination=容器路径[,只读/读写]
-
如果创建bind mount并指定source则必须是绝对路径,且路径必须已经存在
安装MySQL挂载数据卷
# 下载MySQL镜像
docker pull mysql:5.7
# 运行MySQL
docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/bin/mysql -e MYSQL_ROOT_PASSWORD=12345 --name mysql mysql:5.7
挂载目录
- 使用
-v 容器内路径实现匿名挂载
docker run -d -p 80:80 --name nginx01 -v /etc/nginx nginx
- 使用
-v 卷名字:容器内路径实现卷名挂载
# 卷名字:nginx-data
docker run -d -p 80:80 --name nginx01 -v nginx-data:/etc/nginx nginx
- 使用
-v 宿主机目录:容器目录实现具体路径挂载**(常用)**
# 挂载路径:/home/nginx/data
docker run -d -p 80:80 --name nginx01 -v /home/nginx/data:/etc/nginx nginx
- 匿名挂载或者卷名挂载的挂载路径
# 没有指定具体的挂载目录,都是挂载在宿主机的如下目录
/var/lib/docker/volumes/xxxx/_data
- 查看挂载路径
docker volume inspect nginx-data
# 执行以上命令返回结果如下
[
{
"CreatedAt": "2021-07-14T02:45:52-04:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/nginx-data/_data",
"Name": "nginx-data",
"Options": null,
"Scope": "local"
}
]
数据卷读写权限
# ro 只读,挂载的路径只能通过宿主机来操作,容器内部是无法操作
docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx
# rw 可读可写
docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx
数据卷容器
- 数据卷容器是指:从另一个容器当中挂载容器中已经创建好的数据卷
- 数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的
- 如果有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。
创建数据卷容器
# 创建MySQL数据卷容器
docker run -d -v /dbdata --name dbdata mysql
挂载数据卷容器
- 使用
--volumes-from 数据卷容器名来挂载数据卷容器
# 创建db1和db2两个容器,共享dbdata数据卷的数据
docker run -d --volumes-from dbdata --name db1 mysql
docker run -d --volumes-from dbdata --name db2 mysql