容器数据卷
容器数据存储路径同步在宿主机文件目录做数据持久化保存(目录挂载、映射)不进行这一步,会导致删除容器后,数据直接丢失。
容器间数据卷也可以进行共享 数据卷的使用,类似于 Linux 下对目录或文件进行 mount
1、宿主机目录映射容器内部目录
-v 宿主机目录:容器内目录(使用 -v 来创建一个数据卷并挂载到容器里)
例:使用centos镜像启动一个命名为centos-test的容器,指定宿主机目录/data/docker-test与容器/home进行映射,并进入容器
命令:docker run -it --name centos-test -v /data/docker-test:/home centos /bin/bash (对比下图容器内与宿主机对应目录文件)容器就算处于关闭状态数据依旧同步
可以使用 docker inspect 容器id 查看Mounts 字段参数
安装mysql
需要考虑数据持久化问题
#启动容器并挂载数据卷。启动mysql容器时需要指定密码!
#获取mysql镜像[root@caoyuchun2 ~]# docker pull mysql:5.7[root@caoyuchun2 myslq-docker]# docker run --name=myslq-test -d -p 3306:3306 -v /data/mysql-docker/conf.d:/etc/mysql/conf.d -v /data/mysql-docker/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password123 -d mysql:5.7
8046cf11ef2c4f4aebc2bd46856eafa0298a786384663ab173c887830f2fbf4f
# 参数详情
-d:后台运行
-p:宿主机与容器服务端口 3306:3306
-v:宿主机目录与容器内目录挂载,几个-v就可以挂载几个目录
-e:环境配置
--name:启动容器的自定义名字
匿名挂载
匿名挂载就是在指定数据卷的时候,不指定容器路径对应的主机路径,这样对应映射的主机路径就是默认的路径/var/lib/docker/volumes/中自动生成一个随机命名的文件夹。
如下运行并匿名挂载Nginx容器:
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d -P --name nginx01 -v /etc/nginx nginxd3a27b969d122d5516cac75e99b17dff7aaaf1e0c042385c6b05990053f1259
查看所有的数据卷volume的情况, VOLUME NAME这里的值是真实存在的目录。
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker volume ls DRIVER VOLUME NAME local 0cd45ab893fc13971219ac5127f9c0b02491635d76d94183b0261953bdb52d26
local 668a94251e562612880a2fdb03944d67d1acdbbdae6ef7c94bee8685644f2956
local e605f3dc4bf11ab693972592b55fb6911e5bf2083425fd58869c5f574998a09a
具名挂载
具名挂载,就是指定文件夹名称,区别于指定路径挂载,这里的指定文件夹名称是在Docker指定的默认数据卷路径下的。通过docker volume ls命令可以查看当前数据卷的目录情况。
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx 4ceaff19e5275dcd3014a8e7a8af618f7f7ce0da18d605c7c41a8653e78bf912 [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker volume ls DRIVER VOLUME NAME local 0cd45ab893fc13971219ac5127f9c0b02491635d76d94183b0261953bdb52d26 local 668a94251e562612880a2fdb03944d67d1acdbbdae6ef7c94bee8685644f2956 local e605f3dc4bf11ab693972592b55fb6911e5bf2083425fd58869c5f574998a09a local juming-nginx
查看指定的数据卷信息的命令:docker volume inspect 数据卷名称
默认路径在 /var/lib/docker/volumes/xxxxxx/_data
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker volume inspect juming-nginx [ { "CreatedAt": "2020-12-29T22:40:25+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local" } ]
可以看到主机数据卷挂载在/var/lib/docker/volumes/juming-nginx/_data上
Docker所有的数据卷默认在/var/lib/docker/volumes/ 目录下(如果我们没有指定挂载目录的话,就挂载在这个位置。如果我们没有起名字,就是匿名挂载。否则就是具名挂载)
匿名挂载,具名挂载,指定路径挂载的命令区别如下:
-v 容器内路径 匿名挂载
-v 卷名:容器内路径 具名挂载
-v /宿主机路径:容器内路径 指定路径挂载
指定数据卷映射的相关参数:
ro —— readonly 只读。设置了只读则只能操作宿主机的路径,不能操作容器中的对应路径。
rw —— readwrite 可读可写
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx#ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部无法操作!
默认情况下是rw
- 具名挂载:-v 具名名称:/容器内路径 大多数使用具名挂载,方便寻找到一个卷
- 匿名挂载:-v /容器内路径
- 指定路径:-v /宿主机路径:/容器内路径
--volumes-from 指定父容器之间数据卷共享
如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。
数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。
首先,创建一个命名的数据卷容器 dbdata:
docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres
然后,在其他容器(db1、db2)中使用 --volumes-from 来挂载 dbdata 容器中的数据卷。
docker run -d --volumes-from dbdata --name db1 training/postgresdocker run -d --volumes-from dbdata --name db2 training/postgres
还可以使用多个 --volumes-from 参数来从多个容器挂载多个数据卷。 也可以从其他已经挂载了数据卷的容器来挂载数据卷。
docker run -d --name db3 --volumes-from db1 training/postgres
*注意:使用 --volumes-from 参数所挂载数据卷的容器自己并不需要保持在运行状态。
如果删除了挂载的容器(包括 dbdata、db1 和 db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时使用 docker rm -v 命令来指定同时删除关联的容器。 这可以让用户在容器之间升级和移动数据卷。
备份、存储、移动数据卷
另一个非常有用大功能是利用数据卷容器进行备份、存储以及迁移操作。
备份
docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
然后新创建一个新的容器
docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
然后解压数据卷挂载到容器
docker run --volumes-from dbdata2 -v $(pwd):/backup ubuntu cd /dbdata && tar xvf /backup/backup.tar