【Docker】007
【Docker】007
七、容器数据卷1、什么是容器数据卷Docker的理念回顾:将应用和环境打包成一个镜像;当我们在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们关闭docker容器时是会消失的,但是其中产生的部分内容我们希望能够把它给保存起来另作用途的,Docker将应用与运行环境打包成容器发布,我们希望在运行过程钟产生的部分数据是可以持久化的,而且容器之间我们希望能够
【Docker】007
1、什么是容器数据卷
Docker的理念回顾:将应用和环境打包成一个镜像;
当我们在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们关闭docker容器时是会消失的,但是其中产生的部分内容我们希望能够把它给保存起来另作用途的,Docker将应用与运行环境打包成容器发布,我们希望在运行过程钟产生的部分数据是可以持久化的,而且容器之间我们希望能够实现数据共享;
容器数据卷:将容器内的目录,挂载到Linux上,对应的两个目录内的文件实时同步!
特点
- 数据卷可以在容器之间共享或重用数据;
- 数据卷中的更改可以直接生效;
- 数据卷中的更改不会包含在镜像的更新中;
- 数据卷的生命周期一直持续到没有容器使用它为止;
2、使用容器数据卷
直接通过命令行挂载
代码语言:javascript代码运行次数:0运行复制# 直接通过命令行挂载
dokcer run -it -v /home/test:/home centos /bin/bash
# 解释:/home/test:/home = > 主机目录:容器目录
# 两个目录里面的文件会完全同步,任意一个地方修改 ,另外一个地方也会随之修改
# 创建目录
mkdir 目录名
# 删除目录
rmdir 目录名
# 创建文件
touch 文件名
# 删除文件
rm 文件名
# 类似于vue的v-model双向绑定
、实战:MySQL数据持久化
代码语言:javascript代码运行次数:0运行复制# 下载镜像
docker pull mysql:5.7
# 运行容器 挂载数据和配置文件,注意mysql启动需要配置密码
# -d 后台运行
# -p 端口映射
# -V 卷挂载
# -e 环境配置
# --name 容器名字
docker run -d -p 8001:06 -v /home/zibo/mysql/conf:/etc/mysql/conf.d -v /home/zibo/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=12456 --name mysql01 mysql:5.7
# 在自己电脑上连接MySQL,并创建一个数据库zibo
# 查看服务器上的数据
[root@zibo /]# clear
[root@zibo /]# cd /home/zibo/mysql
[root@zibo mysql]# ls
conf data
[root@zibo mysql]# cd data/
[root@zibo data]# ls
autof ca.pem client-key.pem ibdata1 ib_logfile1 mysql private_key.pem server-cert.pem sys
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ibtmp1 performance_schema public_key.pem server-key.pem zibo # zibo就是刚才在自己电脑上创建的数据库
# 即使将容器删除,/home/zibo/mysql目录下的文件也不会丢失!
4、具名挂载和匿名挂载
代码语言:javascript代码运行次数:0运行复制# 具名挂载(常用)
# 我们之前使用容器数据卷以“主机目录:容器目录”的形式进行挂载,现在我们换一种指定名字不指定目录的一致方式!
# 举个例子,这里的-P是随机指定端口
docker run -d -P --name nginx-docker -v nginx-zibo:/etc/nginx nginx
# 查看挂载列表
docker volume ls
# 控制台
DRIVER VOLUME AME
local 2ad1d2cb94d78fb7197b247a5cb2e69e4ce622918fec9a7c829efe00e0e
local 6e50c7c29d6b028dde624b75cbf29558dcb57b21fb9a4b2694b9ee8715c689
local 6fcb2debb12600cdee529051bb1c8af9ead41cb8179292aa426ef620665
local 65bff2e0e170e10aadbe99a45bce68e816bc56ccd757e7cf17109474cae7e
local 8e7672cc95bc79d2b48a526119660a28e849a10a8ed21aafb7a1af992b2ad
local 5196976d975725f666958f0c1c75605516de44597b247f80cdd6e0641845ef
local 42912884af7855458bbc47cc7116e2067a9712d1541ea8e90fe802c18b2ae0a
local a2b81b079605c0255260e046d290289b5c1f07b0a71a48fbab10582221f9f
local a6427c4f5801f682801f98e5c509024074a9df1c2a5f5bc4e91470c89ff2
local b1915fcf6ccaf16e7609fec94e85af84d6f019145a029ec91e56da2b7b45b
local f802f068bc6d4fd8c249e08f09462a16e0bc9ef092d764a12f7465874f5
local fede99e6c595f01cabd4a64b8a408611f22d07a9582097d60645556611
local nginx-zibo # 这个就是我们具名挂载的卷
# 匿名挂载:没有名字,也就是像上面的一串字符串那样的名字
# 举个例子
[root@zibo data]# docker run -d -P --name nginx01 -v /etc/nginx nginx
c0274b9c4ad42a287fb8714b20aa982b2486b9a0f9ffdf64d5e5f4a2962
# 控制台
[root@zibo data]# docker volume ls
DRIVER VOLUME AME
local 2ad1d2cb94d78fb7197b247a5cb2e69e4ce622918fec9a7c829efe00e0e
local 6e50c7c29d6b028dde624b75cbf29558dcb57b21fb9a4b2694b9ee8715c689
local 6fcb2debb12600cdee529051bb1c8af9ead41cb8179292aa426ef620665
local 65bff2e0e170e10aadbe99a45bce68e816bc56ccd757e7cf17109474cae7e
local 8e7672cc95bc79d2b48a526119660a28e849a10a8ed21aafb7a1af992b2ad
local 5196976d975725f666958f0c1c75605516de44597b247f80cdd6e0641845ef
local 42912884af7855458bbc47cc7116e2067a9712d1541ea8e90fe802c18b2ae0a
local a2b81b079605c0255260e046d290289b5c1f07b0a71a48fbab10582221f9f
local a6427c4f5801f682801f98e5c509024074a9df1c2a5f5bc4e91470c89ff2
local b1915fcf6ccaf16e7609fec94e85af84d6f019145a029ec91e56da2b7b45b
local cf2a6e28151db8a2f1e702d712f40507b68ead22592fff5242b66c46896ae # 匿名挂载的卷
local f802f068bc6d4fd8c249e08f09462a16e0bc9ef092d764a12f7465874f5
local fede99e6c595f01cabd4a64b8a408611f22d07a9582097d60645556611
local nginx-zibo
# 查看挂载的卷在哪
docker volume inspect nginx-zibo
# 控制台
[root@zibo data]# docker volume inspect nginx-zibo
[
{
"CreatedAt": "2021-0-1T21:49:5+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/nginx-zibo/_data", # 此目录
"ame": "nginx-zibo",
"Opti": null,
"Scope": "local"
}
]
# 挂载的位置
/var/lib/docker/volumes/XXX名字/_data
# 注意
有时候我们会遇到这样的一个命令,路径后面跟着一个 ro 或 rw
docker run -d -P --name nginx01 -v zi-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v bo-nginx:/etc/nginx:rw nginx
# ro 说明这个路径只能通过宿主机来操作,容器内部是无法操作的,默认为 rw
5、数据卷之Dockerfile
初识Dockerfile
Dockerfile是用来构建镜像的文件,是命令脚本!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本是一个个的命令,每个命令都是一层!
代码语言:javascript代码运行次数:0运行复制# 编写dockerfile文件
vim dockerfile1
# dockerfile1文件内容:
FROM centos
VOLUME ["volume01","volume02"] # 这是匿名挂载
CMD echo "---ED---"
CMD /bin/bash
# 保存文件
# 按键ESC,然后输入:wq
# 查看文件dockerfile1
[root@zibo dockerfile]# vim dockerfile1 # 编写dockerfile文件
[root@zibo dockerfile]# ls
dockerfile1
[root@zibo dockerfile]# cat dockerfile1 # 查看文件内容
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "---ED---"
CMD /bin/
# 生成镜像
# 生成镜像的命令,注意镜像名不能大写,别忘了点(.)
[root@zibo dockerfile]# docker build -f dockerfile1 -t zibocentos .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 00e15adb2f
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in 172e5fe0b1b
Removing intermediate container 172e5fe0b1b
---> b97922e9422
Step /4 : CMD echo "---ED---"
---> Running in f019d2fff77b
Removing intermediate container f019d2fff77b
---> f8d8c0941fe
Step 4/4 : CMD /bin/
---> Running in adf18ac11176
Removing intermediate container adf18ac11176
---> 4244641c6
Successfully built 4244641c6
Successfully tagged zibocentos:latest
# 查看当前镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
# zibocentos是我们刚才生成的
zibocentos latest 4244641c6 4 seconds ago 209MB
bijohns/smartfoxserver latest 90926790b86d 6 weeks ago 166MB
mysql 5.7 a70d6bc1a 2 months ago 449MB
redis latest 621ceef7494a 2 months ago 104MB
tomcat latest 040bdb29ab7 2 months ago 649MB
wordpress latest a05fd91ad06a 2 months ago 550MB
nginx latest f6d0b4767a6c 2 months ago 1MB
memcached latest 9f547b64a127 2 months ago 82.4MB
centos latest 00e15adb2f months ago 209MB
portainer/portainer latest 62771b0b9b09 8 months ago 79.1MB
# 使用自己的镜像创建并启动容器
docker run -it 4244641c6 /bin/bash
# 发现我们自己挂载的目录已经生成了
[root@51b886006df /]# ls -l
total 0
lrwxrwxrwx 1 root root 7 ov 15:22 bin -> usr/bin
drwxr-xr-x 5 root root 60 Apr 01:07 dev
drwxr-xr-x 1 root root 66 Apr 01:07 etc
drwxr-xr-x 2 root root 6 ov 15:22 home
lrwxrwxrwx 1 root root 7 ov 15:22 lib -> usr/lib
lrwxrwxrwx 1 root root 9 ov 15:22 lib64 -> usr/lib64
drwx------ 2 root root 6 Dec 4 17:7 lost+found
drwxr-xr-x 2 root root 6 ov 15:22 media
drwxr-xr-x 2 root root 6 ov 15:22 mnt
drwxr-xr-x 2 root root 6 ov 15:22 opt
dr-xr-xr-x 174 root root 0 Apr 01:07 proc
dr-xr-x--- 2 root root 162 Dec 4 17:7 root
drwxr-xr-x 11 root root 16 Dec 4 17:7 run
lrwxrwxrwx 1 root root 8 ov 15:22 sbin -> usr/sbin
drwxr-xr-x 2 root root 6 ov 15:22 srv
dr-xr-xr-x 1 root root 0 Apr 01:07 sys
drwxrwxrwt 7 root root 145 Dec 4 17:7 tmp
drwxr-xr-x 12 root root 144 Dec 4 17:7 usr
drwxr-xr-x 20 root root 262 Dec 4 17:7 var
drwxr-xr-x 2 root root 6 Apr 01:07 volume01 # 挂载目录
drwxr-xr-x 2 root root 6 Apr 01:07 volume02 # 挂载目录
# 上面的挂载目录(数据卷)一定是跟外面的目录是同步的
# 我们在volume01中创建一个文件
[root@51b886006df /]# cd volume01
[root@51b886006df volume01]# ls
[root@51b886006df volume01]# touch
# 查看匿名挂载的位置(见下图【挂载位置】)
docker inspect 容器id
# /var/lib/docker/volumes/d6458bcc409408c71dd6ab6db7a6088f7c699f1b249faaa9dcf0a8da562af82/_data
# 进去看看
[root@zibo ~]# cd /var/lib/docker/volumes/d6458bcc409408c71dd6ab6db7a6088f7c699f1b249faaa9dcf0a8da562af82/_data
[root@zibo _data]# ls
# 我们在vloume01中创建的文件
# 上面的方式我们用得也非常多,因为我们也常常创建自己的镜像
挂载位置
6、数据卷容器
多个容器数据同步
被挂载的容器成为之父容器;
代码实践
代码语言:javascript代码运行次数:0运行复制# 启动三个容器,使用之前创建的zibocentos镜像创建并启动容器
# 启动容器docker01
docker run -it --name docker01 zibocentos /bin/bash
# 启动容器docker02挂载容器docker01
docker run -it --name docker02 --volumes-from docker01 zibocentos /bin/bash
# 测试数据同步
[root@zibo _data]# docker attach a58dd7a42de8 # 进入容器docker01
[root@a58dd7a42de8 /]# cd volume01 # 进入volume01目录
[root@a58dd7a42de8 volume01]# touch # 创建文件
[root@a58dd7a42de8 volume01]# ls
# 查看容器docker02的volume01目录下有没有文件
[root@zibo ~]# docker attach 6e46deee4eb
[root@6e46deee4eb /]# cd volume01
[root@6e46deee4eb volume01]# ls
# 有点意思了吧!
# 说明
# 我们使用docker02挂载docker01,那么docker01就是父容器,docker01的挂载目录就是数据卷容器
# docker0也去挂载docker01
docker run -it --name docker0 --volumes-from docker01 zibocentos /bin/bash
# 控制台
[root@zibo /]# docker run -it --name docker0 --volumes-from docker01 zibocentos /bin/bash
[root@b5f060b6608b /]# cd volume01
[root@b5f060b6608b volume01]# ls
# 有点意思!
# 我们在docker创建文件(见图【数据同步】)
# 说明:将容器docker01删除,docker02和docker0里面的文件依旧在
# 但是,docker02和docker0还可以同步!(见图【数据还在同步】)
# 为什么数据还在同步?(见图【他们挂载在同一个位置】)
# 结论:我们可以进行容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用它为止!
# 删除文件也会一起删除(见图【删除文件也会同步删除】)
数据同步
数据还在同步
他们挂载在同一个位置
删除文件也会同步删除
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
上传时间: 2025-07-23 15:31:24
上一篇:【Docker】008
下一篇:【Docker】006
推荐阅读
留言与评论(共有 7 条评论) |
本站网友 金城江租房 | 21分钟前 发表 |
"Labels" | |
本站网友 萍乡二手房 | 23分钟前 发表 |
null | |
本站网友 排序算法总结 | 29分钟前 发表 |
"/var/lib/docker/volumes/nginx-zibo/_data" | |
本站网友 中国彩客网 | 10分钟前 发表 |
使用之前创建的zibocentos镜像创建并启动容器 # 启动容器docker01 docker run -it --name docker01 zibocentos /bin/bash # 启动容器docker02挂载容器docker01 docker run -it --name docker02 --volumes-from docker01 zibocentos /bin/bash # 测试数据同步 [root@zibo _data]# docker attach a58dd7a42de8 # 进入容器docker01 [root@a58dd7a42de8 /]# cd volume01 # 进入volume01目录 [root@a58dd7a42de8 volume01]# touch # 创建文件 [root@a58dd7a42de8 volume01]# ls # 查看容器docker02的volume01目录下有没有文件 [root@zibo ~]# docker attach 6e46deee4eb [root@6e46deee4eb /]# cd volume01 [root@6e46deee4eb volume01]# ls # 有点意思了吧! # 说明 # 我们使用docker02挂载docker01 | |
本站网友 隔音 | 19分钟前 发表 |
镜像是一层一层的 | |
本站网友 accumulator | 17分钟前 发表 |
07 volume02 # 挂载目录 # 上面的挂载目录(数据卷)一定是跟外面的目录是同步的 # 我们在volume01中创建一个文件 [root@51b886006df /]# cd volume01 [root@51b886006df volume01]# ls [root@51b886006df volume01]# touch # 查看匿名挂载的位置(见下图【挂载位置】) docker inspect 容器id # /var/lib/docker/volumes/d6458bcc409408c71dd6ab6db7a6088f7c699f1b249faaa9dcf0a8da562af82/_data # 进去看看 [root@zibo ~]# cd /var/lib/docker/volumes/d6458bcc409408c71dd6ab6db7a6088f7c699f1b249faaa9dcf0a8da562af82/_data [root@zibo _data]# ls # 我们在vloume01中创建的文件 # 上面的方式我们用得也非常多 |