什么是容器数据卷

[root@localhost data]# cd /var/lib/docker/
[root@localhost docker]# ls
buildkit  containers  image  network  overlay2  plugins  runtimes  swarm  tmp  trust  volumes
[root@localhost docker]# cd volumes/
[root@localhost volumes]# ls
6249e9e1ad3ae1b0bbe7df93604813ab721e1ef75c1c413ccfd5da043e0db688  9142d94be60cb53b7db280f54a3c2413b69063ed0efb91a05b8fa4d3d8abdc49  backingFsBlockDev  metadata.db
8623aba881c601597987a5892ec08bc2eaf026bb81842e762d7837a421b62a49  ba78df1e972c185b9ef9eae1315e0a8da0557ac92bcd21c42b8ea8131e8026af  gaole
[root@localhost volumes]# ls -al
total 28
drwx-----x.  7 root root  4096 Jan 30 16:34 .
drwx--x---. 13 root root   167 Jan 28 06:16 ..
drwx-----x.  3 root root    19 Jan 30 16:25 6249e9e1ad3ae1b0bbe7df93604813ab721e1ef75c1c413ccfd5da043e0db688
drwx-----x.  3 root root    19 Jan 28 21:43 8623aba881c601597987a5892ec08bc2eaf026bb81842e762d7837a421b62a49
drwx-----x.  3 root root    19 Jan 30 16:34 9142d94be60cb53b7db280f54a3c2413b69063ed0efb91a05b8fa4d3d8abdc49
drwx-----x.  3 root root    19 Jan 30 16:25 ba78df1e972c185b9ef9eae1315e0a8da0557ac92bcd21c42b8ea8131e8026af
brw-------.  1 root root  8, 2 Jan 28 06:16 backingFsBlockDev
drwx-----x.  3 root root    19 Jan 30 16:34 gaole
-rw-------.  1 root root 32768 Jan 30 16:34 metadata.db

如果数据在容器中,容器被删除,数据就会被删除。

要求数据可以持久化!

容器之间可以又一个可以数据共享的技术!Docker容器中产生的数据,同步到本地

这就是卷技术,把容器内的目录挂载到宿主机上

假设容器里是/usr/mysql

宿主机是/home/mysql

方式一:

docker run -it -v 宿主机的目录:容器内的目录 -p 主机端口,容器内端口

docker run -it -v /home/ceshi:/home centos /bin/bash

docker inspect的时候可以看到元数据里又"Mount"的数据:其中source是宿主机目录,destination是目的主机目录

这样就是自动同步,双向绑定,一边有变化,另外一边也会有变化

容器删掉,本地的这个目录还是会存在的!即使容器停止,本地的目录修改,容器里的数据依然会随之变化

练习:mysql

#启动成功后,我们本地的sqlyog来接测试一下

#sqlyog-连接到服务器的3310,容器内的3306,

[root@localhost home]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MY_SQL_ROOT_PASSWORD=123456 --name mysql01 mysql
69d523fc04622807e81804e54bd7b4f8a40eda1c13a8a913d23ce3abbbf98b3c
[root@localhost home]# cd /home    #-v写两个就可以挂载两个目录
[root@localhost home]# ls
mysql
[root@localhost home]# cd mysql/
[root@localhost mysql]# ls
conf  data
[root@localhost mysql]# cd conf/
[root@localhost conf]# ls
[root@localhost conf]# cd ..
[root@localhost mysql]# cd data
[root@localhost data]# ls
[root@localhost data]# ^C
[root@localhost data]# docker rm -f mysql01
mysql01
[root@localhost data]# docker ps -a
CONTAINER ID   IMAGE         COMMAND                  CREATED        STATUS                    PORTS     NAMES
90d02b1d184f   mysql         "docker-entrypoint.s鈥   42 hours ago   Exited (1) 42 hours ago             practical_burnell
13c36870224f   centos        "/bin/bash"              42 hours ago   Exited (0) 42 hours ago             objective_lamarr
c1d26ff55f14   centos        "/bin/bash"              2 days ago     Up 42 hours                         keen_payne
5365c82423ff   hello-world   "/hello"                 2 days ago     Exited (0) 42 hours ago             clever_ritchie
[root@localhost data]# 
[root@localhost data]# 
[root@localhost data]# docker volume ls
DRIVER    VOLUME NAME
local     8623aba881c601597987a5892ec08bc2eaf026bb81842e762d7837a421b62a49  #删除容器以后数据卷还是在

匿名挂载

-v 容器路径   #不写宿主机的路径

#

root@localhost data]# docker run -d -p 3310:3306 -v /etc/mysql/conf.d -e MY_SQL_ROOT_PASSWORD=123456 --name mysql02 mysql             #匿名卷挂载
23aa674d2e1e38f7a45630651ca0767b75527ac65a3fb630d61ffdffffe39753
[root@localhost data]# docker volume --help

Usage:  docker volume COMMAND

Manage volumes

Commands:
  create      Create a volume
  inspect     Display detailed information on one or more volumes
  ls          List volumes
  prune       Remove all unused local volumes
  rm          Remove one or more volumes

Run 'docker volume COMMAND --help' for more information on a command.
[root@localhost data]# docker volume ls          #显示所有卷
DRIVER    VOLUME NAME 
local     6249e9e1ad3ae1b0bbe7df93604813ab721e1ef75c1c413ccfd5da043e0db688
local     8623aba881c601597987a5892ec08bc2eaf026bb81842e762d7837a421b62a49
local     ba78df1e972c185b9ef9eae1315e0a8da0557ac92bcd21c42b8ea8131e8026af
[root@localhost data]# 

具名挂载

-v 卷名:容器内路径     

docker inspect 容器ID可以查看到Mounts里的数据,就可以知道mount到了那里。并且还有卷的ID

  "Mounts": [
            {
                "Type": "volume",
                "Name": "gaole",
                "Source": "/var/lib/docker/volumes/gaole/_data",
                "Destination": "/etc/mysql/conf.d",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            },

 {
                "Type": "volume",
                "Name": "9142d94be60cb53b7db280f54a3c2413b69063ed0efb91a05b8fa4d3d8abdc49",
                "Source": "/var/lib/docker/volumes/9142d94be60cb53b7db280f54a3c2413b69063ed0efb91a05b8fa4d3d8abdc49/_data",
                "Destination": "/var/lib/mysql",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }

或者用docker volume inspect gaole

[root@localhost data]# docker volume inspect gaole
[
    {
        "CreatedAt": "2022-01-30T16:34:00+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/gaole/_data",
        "Name": "gaole",
        "Options": null,
        "Scope": "local"
    }
]
[root@localhost data]# docker run -d -P --name mysql03 -v gaole:/etc/mysql/conf.d mysql
57fb2a83ed299638d6413ae4f6262a95334a4f39bd210f6c0eb49bf1fa5ba99c
[root@localhost data]# 
[root@localhost data]# docker volume ls    #挂载出来就会有卷名
DRIVER    VOLUME NAME
local     6249e9e1ad3ae1b0bbe7df93604813ab721e1ef75c1c413ccfd5da043e0db688
local     8623aba881c601597987a5892ec08bc2eaf026bb81842e762d7837a421b62a49
local     9142d94be60cb53b7db280f54a3c2413b69063ed0efb91a05b8fa4d3d8abdc49
local     ba78df1e972c185b9ef9eae1315e0a8da0557ac92bcd21c42b8ea8131e8026af
local     gaole

 在这个目录下也会有保存volume的信息,使用具名挂载可以方便的找到我们的卷

[root@localhost data]# cd /var/lib/docker/
[root@localhost docker]# ls
buildkit  containers  image  network  overlay2  plugins  runtimes  swarm  tmp  trust  volumes
[root@localhost docker]# cd volumes/
[root@localhost volumes]# ls
6249e9e1ad3ae1b0bbe7df93604813ab721e1ef75c1c413ccfd5da043e0db688  9142d94be60cb53b7db280f54a3c2413b69063ed0efb91a05b8fa4d3d8abdc49  backingFsBlockDev  metadata.db
8623aba881c601597987a5892ec08bc2eaf026bb81842e762d7837a421b62a49  ba78df1e972c185b9ef9eae1315e0a8da0557ac92bcd21c42b8ea8131e8026af  gaole
[root@localhost volumes]# ls -al
total 28
drwx-----x.  7 root root  4096 Jan 30 16:34 .
drwx--x---. 13 root root   167 Jan 28 06:16 ..
drwx-----x.  3 root root    19 Jan 30 16:25 6249e9e1ad3ae1b0bbe7df93604813ab721e1ef75c1c413ccfd5da043e0db688
drwx-----x.  3 root root    19 Jan 28 21:43 8623aba881c601597987a5892ec08bc2eaf026bb81842e762d7837a421b62a49
drwx-----x.  3 root root    19 Jan 30 16:34 9142d94be60cb53b7db280f54a3c2413b69063ed0efb91a05b8fa4d3d8abdc49
drwx-----x.  3 root root    19 Jan 30 16:25 ba78df1e972c185b9ef9eae1315e0a8da0557ac92bcd21c42b8ea8131e8026af
brw-------.  1 root root  8, 2 Jan 28 06:16 backingFsBlockDev
drwx-----x.  3 root root    19 Jan 30 16:34 gaole
-rw-------.  1 root root 32768 Jan 30 16:34 metadata.db

如何确定是具名挂载还是匿名挂载,还是指定路径挂载

-v 容器内的路径   #匿名挂在

-v 卷名:容器内的路径  #具名挂载

-v /宿主机路径:容器内的路径   #指定路径挂载

拓展

docker run -d -P --name gaole -v gaole:/etc/test:ro mysql     #ro:只读

docker run -d -P --name gaole -v gaole:/etc/test:rw mysql    #rw:可读可写

#一旦这个设置了容器的权限,容器对我们挂载出来的内容就有限定了。

#ro,这个路径只能通过宿主机改变,容器内部无法操作。默认是rw

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值