您现在的位置是:首页 > 编程 > 

【Docker】007

2025-07-23 22:24:43
【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还可以同步!(见图【数据还在同步】)

# 为什么数据还在同步?(见图【他们挂载在同一个位置】)
# 结论:我们可以进行容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用它为止!

# 删除文件也会一起删除(见图【删除文件也会同步删除】)
数据同步
数据还在同步
他们挂载在同一个位置
删除文件也会同步删除
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2022-06-16,如有侵权请联系 cloudcommunity@tencent 删除数据同步容器root镜像

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1199453.html

相关标签:无
上传时间: 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中创建的文件 # 上面的方式我们用得也非常多