docker数据卷

本文详细介绍了Docker中的数据卷技术,包括匿名挂载、具名挂载、通过DockerFile挂载数据卷以及容器间的数据共享。重点讲解了数据的持久化问题,以及如何确保数据在容器删除后仍能保留在本地。
摘要由CSDN通过智能技术生成

目录

一、数据卷

二、实战安装mysql

三、匿名挂载和具名挂载数据卷

四、通过DockerFile挂载数据卷

五、容器数据卷

如果数据都在容器中,容器被删除,数据就会丢失!因此,数据需要可以持久化!

例如:MySQL,容器删了,删库跑路!如果持久化了,数据备份在本地

一、数据卷

容器之间可以有一个数据共享技术!Docker容器中产生的数据,同步到本地,本地数据也可同步到容器中(双向绑定),这就是卷技术,目录的挂载,将我们容器内的目录挂载到linux目录上面!

容器的持久化和同步操作!容器间数据也是可以共享的!

数据卷,目录挂在命令:-v

主机home目录原本为空,挂在后,创建了ceshi目录        

# docker run -it -v 主机目录:容器目录
[root@WRF /]# docker run -it -v /home/ceshi:/home centos /bin/bash
[root@c985ee5938dc /]# exit
exit

#获取centos容器元数据
[root@WRF /]# docker inspect c985ee5938dc
...
"Mounts": [
            {
                "Type": "bind",
                "Source": "/home/ceshi",
                "Destination": "/home",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

...

   1.测试文件修改后,数据同步(主机修改,容器观察)

2.测试停止容器后,修改数据同步

a.停止容器

b.主机上修改文件

c.启动容器

c.容器内的数据依旧是同步的

二、实战安装mysql

...

三、匿名挂载和具名挂载数据卷

#匿名关挂载(-v 后面只写了容器内的路径,没有写容器外的路径)
[root@WRF /]# docker volume ls

#查看所有volume情况
DRIVER    VOLUME NAME
local     45d0a25050968f40b0d4eaec7314a0ec29ee59b9a3e0a2ecf309559e2d8cc0c9
local     a66195e503e6a999550e2aee6f7381fb2295f35163f1210d7919eaf56045292a

#-v 容器内路径
#-P随机指定端口
[root@WRF /]# docker run -d -P --name nginx01 -v /etc/nginx nginx
bcacb2b6a9d1720246f5d7abafd3cc8306920eb97ba255771db8d734408e37ab
[root@WRF /]# docker volume ls
DRIVER    VOLUME NAME
local     45d0a25050968f40b0d4eaec7314a0ec29ee59b9a3e0a2ecf309559e2d8cc0c9
local     704ed5bba0bfa68a1dbe4a37df22bcb4f0945fc366a2849fddce74331e8ca868
local     a66195e503e6a999550e2aee6f7381fb2295f35163f1210d7919eaf56045292a

#具名挂载(-v 卷名:容器内的路径)
[root@WRF /]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
aaaf46eb4c871b9296a53d6864243cafeff2fc1eb98a90aa4a39c384b72ff1e6
[root@WRF /]# docker volume ls
DRIVER    VOLUME NAME
local     45d0a25050968f40b0d4eaec7314a0ec29ee59b9a3e0a2ecf309559e2d8cc0c9
local     704ed5bba0bfa68a1dbe4a37df22bcb4f0945fc366a2849fddce74331e8ca868
local     a66195e503e6a999550e2aee6f7381fb2295f35163f1210d7919eaf56045292a
local     juming-nginx


# 查看一下这个卷
[root@WRF /]# docker volume inspect juming-nginx
[
    {
        "CreatedAt": "2024-03-06T13:55:28+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]

所有docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxx/_data

我们通过具名挂载可以方便的找到我们的一个卷,大多数情况下使用的是具名挂载

# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
-v  容器内路径                   # 匿名挂载
-v  卷名:容器内路径               # 具名挂载
-v /主机路径:容器内路径            # 指定路径挂载

拓展:

# 通过 -v 容器内容路径 ro rw 改变读写权限
ro  readonly    # 只读
rw  readwrite   # 可读可写
 
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
 
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内容无法操作

四、通过DockerFile挂载数据卷

DockerFile就是用来构建docker镜像的构建文件!属于命令脚本

通过该脚本可以生成镜像,镜像hi一层一层的,脚本一个个的命令,每个命令都是一层

[root@WRF /]# cd home
[root@WRF home]# ls
ceshi
[root@WRF home]# mkdir docker-test-volume
[root@WRF home]# ls
ceshi  docker-test-volume
[root@WRF home]# pwd
/home
[root@WRF home]# cd docker-test-volume
[root@WRF docker-test-volume]# ls
[root@WRF docker-test-volume]# vim dockerfile01
[root@WRF docker-test-volume]# cat dockerfile01

FROM centos

VOLUME ["volume01","volume02"]

CMD echo "----end----"

CMD /bin/bash 
[root@WRF docker-test-volume]# ls
dockerfile01
[root@WRF docker-test-volume]# docker build -f dockerfile01 -t WRF/centos:1.0 .
[+] Building 0.1s (5/5) FINISHED                                                                                                         docker:default
 => [internal] load build definition from dockerfile01                                                                                             0.0s
 => => transferring dockerfile: 124B                                                                                                               0.0s
 => [internal] load metadata for docker.io/library/centos:latest                                                                                   0.0s
 => [internal] load .dockerignore                                                                                                                  0.0s
 => => transferring context: 2B                                                                                                                    0.0s
 => [1/1] FROM docker.io/library/centos:latest                                                                                                     0.0s
 => exporting to image                                                                                                                             0.0s
 => => exporting layers                                                                                                                            0.0s
 => => writing image sha256:bcb7b9d022595d87e4f374a55119c8e2e4933dd784edc7ca0ca447c4d8abff2f                                                       0.0s
 => => naming to WRF/centos:1.0                                                                                                                    0.0s
[root@WRF /]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED         SIZE
tomcat          9.0       b8e65a4d736d   2 years ago     680MB
mysql           5.7       c20987f18b13   2 years ago     448MB
centos          latest    5d0da3dc9764   2 years ago     231MB
WRF/centos      1.0       bcb7b9d02259   2 years ago     231MB
elasticsearch   7.6.2     f29a1ee41030   3 years ago     791MB

启动新构建的镜像

这个数据卷和外部一定有一个同步目录

先在volume01新建一个文件v01-test.txt,看看外部默认的同步目录是不是也同步了新建的文件

[root@WRF /]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                     NAMES
b1596d39db40   bcb7b9d02259   "/bin/bash"              16 minutes ago   Up 16 minutes                                             elegant_knuth
aaaf46eb4c87   nginx          "/docker-entrypoint.…"   4 hours ago      Up 4 hours      0.0.0.0:32769->80/tcp, :::32769->80/tcp   nginx02
bcacb2b6a9d1   nginx          "/docker-entrypoint.…"   4 hours ago      Up 4 hours      0.0.0.0:32768->80/tcp, :::32768->80/tcp   nginx01
[root@WRF /]# docker attach b1596d39db40
[root@b1596d39db40 /]# ls        
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01	volume02
[root@b1596d39db40 /]# cd volume01
[root@b1596d39db40 volume01]# ls

#新建文件
[root@b1596d39db40 volume01]# touch v01-test.txt
[root@b1596d39db40 volume01]# ls
v01-test.txt
[root@b1596d39db40 volume01]# exit

#查看容器元数据
[root@WRF /]# docker inspect b1596d39db40
"Mounts": [
            {
                "Type": "volume",
                "Name": "75ba726076277147b9926c45adad327fba877c1e88b3d3221d9abbcf79a46ea8",
                "Source": "/var/lib/docker/volumes/75ba726076277147b9926c45adad327fba877c1e88b3d3221d9abbcf79a46ea8/_data",
                "Destination": "volume01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "fdaa40e2fdbad471c11ed88a378e35caf25b671d81948d4f84fda50c93d0f4b9",
                "Source": "/var/lib/docker/volumes/fdaa40e2fdbad471c11ed88a378e35caf25b671d81948d4f84fda50c93d0f4b9/_data",
                "Destination": "volume02",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

#查看容器内volume01目录的匿名挂载目录
[root@WRF /]# cd /var/lib/docker/volumes/75ba726076277147b9926c45adad327fba877c1e88b3d3221d9abbcf79a46ea8/_data
[root@WRF _data]# ls
v01-test.txt

测试一下刚才的文件是否同步到主机上了!

这种方式我们未来使用的十分多, 因为我们通常会构建自己的镜像!

假设构建镜像时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!

五、容器数据卷

以多个mysql同步数据为例

 启动三个容器,通过上面自己写的WRF/centos镜像为例

容器01

[root@WRF /]# docker run -it --name d-centos01 WRF/centos:1.0
[root@377ebc8f53ec /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01	volume02
[root@377ebc8f53ec /]# cd volume01
[root@377ebc8f53ec volume01]# ls
[root@377ebc8f53ec volume01]# touch v-01test
[root@377ebc8f53ec volume01]# ls
c-v-01test  v-01test
[root@377ebc8f53ec volume01]# ls
c-v-01test  d-c-v-01test  v-01test

容器02

[root@WRF /]# docker run -it --name d-centos02 --volumes-from d-centos01 WRF/centos:1.0
[root@7c2937b2f080 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01	volume02
[root@7c2937b2f080 /]# cd volume01
[root@7c2937b2f080 volume01]# ls
v-01test
[root@7c2937b2f080 volume01]# touch c-v-01test
[root@7c2937b2f080 volume01]# ls
c-v-01test  v-01test
[root@7c2937b2f080 volume01]# ls
c-v-01test  d-c-v-01test  v-01test

容器03

[root@WRF /]# docker run -it --name d-centos03 --volumes-from d-centos01 WRF/centos:1.0
[root@701f5d4f1a28 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01	volume02
[root@701f5d4f1a28 /]# cd volume01 
[root@701f5d4f1a28 volume01]# ls
c-v-01test  v-01test
[root@701f5d4f1a28 volume01]# touch d-c-v-01test
[root@701f5d4f1a28 volume01]# ls
c-v-01test  d-c-v-01test  v-01test

多个mysql实现数据共享

[root@WRF home]# docker run -d -p 3344:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
 
[root@WRF home]# docker run -d -p 3344:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7

结论

容器之间配置信息的传递, 数据卷容器的声明周期一直持续到没有容器使用为止。

但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值