容器数据卷

96 阅读4分钟

容器数据卷

  • 容器内产生的数据要持久化可以通过目录挂载的方式实现,将容器内的目录挂载到宿主机上实现数据的共享。容器上产生的数据会同步到宿主机上,宿主机上修改对应的文件内容也会同步到容器内。
  • 对数据卷的修改会立即生效
  • 对数据卷的更新不会影响镜像
  • 数据卷会一直存在,即使容器被删除

创建数据卷

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