一、数据卷
1.1 定义
Docker 容器数据卷是一个可用于存储数据的特殊目录,存在于一个或多个容器的指定位置。这些数据卷可以绕过容器的文件系统,提供持久化的数据存储,以便多个容器之间或容器与宿主机之间共享数据。
1.2 本质
实现数据的可持久化
1.3 特点
- 持久性: 数据卷的内容在容器重启后仍然存在。
- 共享性: 可以轻松地在多个容器之间共享数据。
- 独立于容器生命周期: 数据卷的生命周期独立于容器,即使容器被删除,数据卷也可以保留。
二、使用数据卷
方式一:使用命令挂载 -v
# 端口映射
docker run -it -p 主机端口:容器内端口
# 目录映射
docker run -it -v 主机目录:容器内目录
执行以下命令,实现主机目录:/home/ceshi
与容器目录/home
的映射,这样这两个目录的所有操作都会同步,即使容器已经停止运行。
docker run -it -v /home/ceshi:/home centos /bin/bash
可以通过以下命令查看容器目录是否挂载成功:
docker inspect 容器Id
以下内容说明挂载成功:
"Mounts": [
{
"Type": "bind",
"Source": "/home/mysql/conf",
"Destination": "/etc/mysql/conf.d",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/home/mysql/data",
"Destination": "/var/lib/mysql",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
扩展:
#通过 -v 容器内路径:ro或者rw 改变读写权限
ro:readonly #只读
rw: read write #可读可写
一旦这个设施了容器权限,容器对我们挂载出来的内容就有限定了
[root@lisa volumes]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
[root@lisa volumes]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!
三、案例
2.1 安装Mysql
目的:实现mysql中数据的持久化
首先,下载mysql镜像
docker pull mysql
需要配置mysql密码:
参考官网hub
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d
启动mysql容器,设置数据卷挂载并配置mysql密码
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
可以使用数据库连接工具连接启动的mysql容器:
下面是连接成功:
四、匿名挂载和具名挂载
4.1 匿名挂载
即不指定挂载到主机上的路径,只指定容器内部需要挂载的目录。
docker run -d -P --name nginx01 -v /etc/nginx nginx
查看所有数据卷情况
docker volume ls
4.2 具名挂载
给挂载位置添加名字,即具名挂载。
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
注意:这里 -v juming-nginx: 代表直接给定名字,但是没有指定路径,如果在juming-nginx前面你添加/,则代表指定路径
查看数据卷配置信息
docker volume inspect 数据卷id
所有容器内的卷,在没有指定目录的情况下都是挂载在:/var/lib/docker/volumes/xxxx/_data
目录下。
五、三种挂载方式
挂载方式 | 描述 |
---|---|
匿名挂载 | -v 容器内部路径 |
具名挂载 | -v 卷名:容器内部路径 |
指定路径挂载 | -v /宿主机路径:容器内部路径 |