- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
总结: 就是容器的持久化,以及容器间的继承和数据共享!
使用数据卷 容器中直接使用命令来添加# 挂载命令
docker run -it -v 宿主机绝对路径目录:容器内目录 镜像名
# 测试
[root@iZwz98zi7ua638a1dxozhyZ ~]# docker run -it -v /home/ceshi:/home centos /bin/bash
[root@e039976cef28 /]#
# 查看数据卷是否挂载成功
[root@iZwz98zi7ua638a1dxozhyZ ~]# docker inspect e039976cef28
[
{
// ...
"Mounts": [
{
"Type": "bind",
"Source": "/home/ceshi",
"Destination": "/home",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
// ...
}
]
测试容器和宿主机之间数据共享:可以发现,在容器中,创建的会在宿主机中看到!
# 容器 [root@e039976cef28 /]# cd /home/ [root@e039976cef28 home]# ls [root@e039976cef28 home]# touch test.log [root@e039976cef28 home]# ls test.log # 宿主机 [root@iZwz98zi7ua638a1dxozhyZ /]# cd /home/ceshi/ [root@iZwz98zi7ua638a1dxozhyZ ceshi]# ls test.log
测试容器停止退出后,主机修改数据是否会同步!
- 停止容器
- 在宿主机上修改文件,增加些内容
- 启动刚才停止的容器
- 然后查看对应的文件,发现数据依旧同步!ok
思考:mysql 数据持久化的问题!
# 1、搜索镜像 [root@iZwz98zi7ua638a1dxozhyZ home]# docker search mysql NAME DEscriptION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 11608 [OK] ... # 2、拉取镜像 [root@iZwz98zi7ua638a1dxozhyZ home]# docker pull mysql:5.7 5.7: Pulling from library/mysql b380bbd43752: Already exists f23cbf2ecc5d: Already exists 30cfc6c29c0a: Already exists b38609286cbe: Already exists 8211d9e66cd6: Already exists 2313f9eeca4a: Already exists 7eb487d00da0: Already exists a71aacf913e7: Pull complete 393153c555df: Pull complete 06628e2290d7: Pull complete ff2ab8dac9ac: Pull complete Digest: sha256:2db8bfd2656b51ded5d938abcded8d32ec6181a9eae8dfc7ddf87a656ef97e97 Status: Downloaded newer image for mysql:5.7 docker.io/library/mysql:5.7 # 3、启动容器 -e 环境变量! # 注意: mysql的数据应该不丢失!先体验下 -v 挂载卷! 参考官方文档 [root@iZwz98zi7ua638a1dxozhyZ home]# 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 fc7aa88270a249114df59b3199f22c448a09056bcb4ef4b4e3daf3e822b550ac # 4、使用本地的sqlyog连接测试一下 3310 # 5、查看本地的 /home/mysql 目录 [root@iZwz98zi7ua638a1dxozhyZ home]# cd /home/mysql/data/ [root@iZwz98zi7ua638a1dxozhyZ data]# pwd /home/mysql/data # 可以看到我们刚刚建立的mysql数据库在本地存储着 [root@iZwz98zi7ua638a1dxozhyZ data]# ls auto.cnf client-cert.pem ibdata1 ibtmp1 private_key.pem server-key.pem ca-key.pem client-key.pem ib_logfile0 mysql public_key.pem sys ca.pem ib_buffer_pool ib_logfile1 performance_schema server-cert.pem # 6、删除mysql容器 # 删除容器,然后发现远程连接失败! [root@iZwz98zi7ua638a1dxozhyZ data]# docker rm -f mysql01 mysql01 # 可以看到我们刚刚建立的mysql数据库在本地存储着 [root@iZwz98zi7ua638a1dxozhyZ data]# ls auto.cnf client-cert.pem ibdata1 ibtmp1 private_key.pem server-key.pem ca-key.pem client-key.pem ib_logfile0 mysql public_key.pem sys ca.pem ib_buffer_pool ib_logfile1 performance_schema server-cert.pem匿名和具名挂载
# 匿名挂载
# -v 容器内路径
[root@iZwz98zi7ua638a1dxozhyZ home]# docker run -d -P --name nginx01 -v /etc/nginx nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
b380bbd43752: Already exists
fca7e12d1754: Pull complete
745ab57616cb: Pull complete
a4723e260b6f: Pull complete
1c84ebdff681: Pull complete
858292fd2e56: Pull complete
Digest: sha256:644a70516a26004c97d0d85c7fe1d0c3a67ea8ab7ddf4aff193d9f301670cf36
Status: Downloaded newer image for nginx:latest
cc3b003bd095e3b3a9ac16aa196ce24090e96610f7a3a7ca1b66e9c3a16e8a18
# 匿名挂载的缺点,就是不好维护,通常使用命令 docker volume 维护
[root@iZwz98zi7ua638a1dxozhyZ home]# docker volume ls
DRIVER VOLUME NAME
local 66ef490eef3840222f12448c8e9beb9e36f5f72185626b86cf390e2210794593
# 具名挂载
# -v 卷名:/容器内路径
[root@iZwz98zi7ua638a1dxozhyZ home]# docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx nginx
85bda31b7f8160e1731793223d27bb34cefda6c549eb8f5ed6be6a528a6f30f3
# 查看挂载的路径
[root@iZwz98zi7ua638a1dxozhyZ home]# docker volume inspect nginxconfig
[
{
"CreatedAt": "2021-10-29T22:28:02+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/nginxconfig/_data",
"Name": "nginxconfig",
"Options": null,
"Scope": "local"
}
]
# 怎么判断挂载的是卷名而不是本机目录名?
不是/开始就是卷名,是/开始就是目录名
# 改变文件的读写权限
# ro: readonly
# rw: readwrite
# 指定容器对我们挂载出来的内容的读写权限
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:rw nginx
数据卷容器
命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。



