数据卷特点
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
总结: 就是容器的持久化,以及容器间的继承和数据共享!
使用数据卷
容器中直接使用命令来添加
# 挂载命令
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
使用 docker 安装 mysql
思考: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
数据卷容器
命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。