ITPub博客

首页 > 数据库 > 数据库开发技术 > 掌握Docker存储精髓:Volume创建、管理与应用全攻略

掌握Docker存储精髓:Volume创建、管理与应用全攻略

原创 数据库开发技术 作者:shuchaoyang 时间:2024-09-09 20:52:00 0 删除 编辑

7.2 docker存储持久化-volume7.2.1 创建一个卷7.2.2 查看卷信息7.2.3 查看卷挂载信息7.2.4 查看卷的mount源7.2.5 进入路径,修改主页文件7.2.6 查看挂载类型7.2.7 创建基于docker volume的container镜像7.2.8 删除容器7.2.9 删除 docker volume7.2.10 重新使用 volume容器镜像部署容器7.2.11 只读挂载7.2.11.1 先创建volume卷7.2.11.2 对volume卷进行只读挂载

7.2 docker存储持久化-volume

  1. 卷(volume)完全由docker管理,是将特定目录挂载给容器;

  2. 使用卷(volume)时,会在主机上的docker存储目录中创建一个新目录,docker会管理该目录的内容;

  3. 卷(volume)的内容存在于容器的生命周期之外:删除容器后,docker数据卷仍然存在;

  4. 挂载卷(volume)时,不需要指定mount源,指定mount point即可;

  5. docker会在/var/lib/docker/volumes路径下为每个卷(volume)生成一个目录,作为mount源;

  6. 若mount point指向容器中的已有目录,则该目录下的数据会被copy到卷(volume)中;

  7. 7.若mount point指向容器中的空目录,则会自动创建所需目录;

  8. 若启动挂载尚不存在的卷的容器,docker会为自动创建卷;

  9. 卷(volume)在使用时,可通过ro参数将容器对卷(volume)的权限设置为只读。

可通过-v将卷(volume)挂载给一个容器。-v格式:<host path>:<container path>

7.2.1 创建一个卷

创建一个卷,挂载给一个httpd容器。

[root@docker ~]# docker run --name web01 -dit -p 8080:80 -v /usr/local/apache2/htdocs httpd:2.4

示例:

[root@docker ~]# ls /var/lib/docker/volumes
backingFsBlockDev metadata.db
[root@docker ~]#
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS   PORTS     NAMES
[root@docker ~]#
[root@docker ~]# docker run --name web01 -dit -p 8080:80 -v /usr/local/apache2/htdocs httpd:2.4
de7c273addd22a4ebefa1b0acdf9fc8427f6d11428a58c9baf653ba7e8f5a788
[root@docker ~]#
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE       COMMAND             CREATED         STATUS         PORTS                                   NAMES
de7c273addd2   httpd:2.4   "httpd-foreground"   6 seconds ago   Up 5 seconds   0.0.0.0:8080->80/tcp, :::8080->80/tcp   web01
[root@docker ~]#

7.2.2 查看卷信息

使用docker volume ls命令查看卷信息。

[root@docker ~]# docker volume ls

示例:

[root@docker ~]# docker volume ls
DRIVER   VOLUME NAME
local     5fc6dbabdecad45f166b22f43dbf5d84b67f74ffaf0b5bb9f6cc262d9f3e2e34
[root@docker ~]#

7.2.3 查看卷挂载信息

使用docker volume inspect命令查看卷挂载信息。

[root@docker ~]# docker volume inspect 5fc6dbabdecad45f166b22f43dbf5d84b67f74ffaf0b5bb9f6cc262d9f3e2e34

示例:

[root@docker ~]# docker volume inspect 5fc6dbabdecad45f166b22f43dbf5d84b67f74ffaf0b5bb9f6cc262d9f3e2e34
[
  {
       "CreatedAt": "2024-09-08T19:11:43+08:00",
       "Driver": "local",
       "Labels": {
           "com.docker.volume.anonymous": ""
      },
       "Mountpoint": "/var/lib/docker/volumes/5fc6dbabdecad45f166b22f43dbf5d84b67f74ffaf0b5bb9f6cc262d9f3e2e34/_data",
       "Name": "5fc6dbabdecad45f166b22f43dbf5d84b67f74ffaf0b5bb9f6cc262d9f3e2e34",
       "Options": null,
       "Scope": "local"
  }
]
[root@docker ~]#

7.2.4 查看卷的mount源

在/var/lib/docker/volume下已自动生成一个带有volume name的文件夹作为mount源。

[root@docker ~]# ls -lha /var/lib/docker/volumes

示例:

[root@docker ~]# ls -lha /var/lib/docker/volumes
总用量 24K
drwx-----x.  3 root root    122 9月   8 19:11 .
drwx--x---. 12 root root    171 9月   8 08:04 ..
drwx-----x   3 root root     19 9月   8 19:11 5fc6dbabdecad45f166b22f43dbf5d84b67f74ffaf0b5bb9f6cc262d9f3e2e34
brw-------   1 root root 253, 0 9月   8 08:04 backingFsBlockDev
-rw-------.  1 root root   32K 9月   8 19:11 metadata.db
[root@docker ~]#

7.2.5 进入路径,修改主页文件

进入/var/lib/docker/volumes/<volume>/_data修改主页文件。

[root@docker ~]# vi /var/lib/docker/volumes/5fc6dbabdecad45f166b22f43dbf5d84b67f74ffaf0b5bb9f6cc262d9f3e2e34/_data/index.html
[root@docker _data]#

示例:

[root@docker ~]# cd /var/lib/docker/volumes/5fc6dbabdecad45f166b22f43dbf5d84b67f74ffaf0b5bb9f6cc262d9f3e2e34/_data
[root@docker _data]#
[root@docker _data]# pwd
/var/lib/docker/volumes/5fc6dbabdecad45f166b22f43dbf5d84b67f74ffaf0b5bb9f6cc262d9f3e2e34/_data
[root@docker _data]#
[root@docker _data]# ls
index.html
[root@docker _data]#
[root@docker _data]# vi index.html
<html><body><h1>It works! volume-container</h1></body></html>
[root@docker _data]#
[root@docker _data]# curl 127.0.0.1:8080
<html><body><h1>It works! volume-container</h1></body></html>
[root@docker _data]#

7.2.6 查看挂载类型

查看"Type": "volume"相关内容。

[root@docker _data]# docker inspect web01

示例:

[root@docker _data]# docker inspect web01
...
       "Mounts": [
          {
               "Type": "volume",
               "Name": "5fc6dbabdecad45f166b22f43dbf5d84b67f74ffaf0b5bb9f6cc262d9f3e2e34",
               "Source": "/var/lib/docker/volumes/5fc6dbabdecad45f166b22f43dbf5d84b67f74ffaf0b5bb9f6cc262d9f3e2e34/_data",
               "Destination": "/usr/local/apache2/htdocs",
               "Driver": "local",
               "Mode": "",
               "RW": true,
               "Propagation": ""
          }
      ],
...
[root@docker _data]#

7.2.7 创建基于docker volume的container镜像

[root@docker _data]# docker commit web01 httpd_volume:1.0

示例:

[root@docker _data]# docker images
REPOSITORY       TAG       IMAGE ID       CREATED       SIZE
httpd_superman   1.0       f0d394fd69d5   3 months ago   144MB
tomcat           latest   fb5657adc892   2 years ago   680MB
httpd            2.4       dabbfbe0c57b   2 years ago   144MB
httpd           latest   dabbfbe0c57b   2 years ago   144MB
alpine           latest   c059bfaa849c   2 years ago    5.59MB
[root@docker _data]#
[root@docker _data]# docker commit web01 httpd_volume:1.0
sha256:496faa1c65959306258b6c3a89e814a33632491644e63fbf47c80817fa87eb5f
[root@docker _data]#
[root@docker _data]# docker images
REPOSITORY       TAG       IMAGE ID       CREATED         SIZE
httpd_volume     1.0       496faa1c6595   3 seconds ago   144MB
httpd_superman   1.0       f0d394fd69d5   3 months ago   144MB
tomcat           latest   fb5657adc892   2 years ago     680MB
httpd            2.4       dabbfbe0c57b   2 years ago     144MB
httpd           latest   dabbfbe0c57b   2 years ago     144MB
alpine           latest   c059bfaa849c   2 years ago     5.59MB
[root@docker _data]#

7.2.8 删除容器

删除容器后,volume依旧存在,其数据可持久化保存。

[root@docker _data]# docker rm -f web01
[root@docker _data]# docker volume ls

示例:

[root@docker _data]# docker rm -f web01
web01
[root@docker _data]#
[root@docker _data]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS   PORTS     NAMES
[root@docker _data]#
[root@docker _data]# docker volume ls
DRIVER   VOLUME NAME
local     5fc6dbabdecad45f166b22f43dbf5d84b67f74ffaf0b5bb9f6cc262d9f3e2e34
[root@docker _data]#

7.2.9 删除 docker volume

[root@docker _data]# docker volume rm 5fc6dbabdecad45f166b22f43dbf5d84b67f74ffaf0b5bb9f6cc262d9f3e2e34

示例:

[root@docker _data]# docker volume ls
DRIVER   VOLUME NAME
local     5fc6dbabdecad45f166b22f43dbf5d84b67f74ffaf0b5bb9f6cc262d9f3e2e34
[root@docker _data]#
[root@docker _data]# docker volume rm 5fc6dbabdecad45f166b22f43dbf5d84b67f74ffaf0b5bb9f6cc262d9f3e2e34
5fc6dbabdecad45f166b22f43dbf5d84b67f74ffaf0b5bb9f6cc262d9f3e2e34
[root@docker _data]#
[root@docker _data]# docker volume ls
DRIVER   VOLUME NAME
[root@docker _data]#

7.2.10 重新使用 volume容器镜像部署容器

[root@docker _data]# docker run -dit --name web01_volume -p 8080:80 httpd_volume:1.0

示例:

[root@docker _data]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS   PORTS     NAMES
[root@docker _data]#
[root@docker _data]# docker run -dit --name web01_volume -p 8080:80 httpd_volume:1.0
a30efe4e8f57d9e1475098bba441e8d86afbda0ce613d6bc578a8890e6dac965
[root@docker _data]#
[root@docker _data]# docker ps -a
CONTAINER ID   IMAGE             COMMAND             CREATED         STATUS         PORTS                                   NAMES
a30efe4e8f57   httpd_volume:1.0   "httpd-foreground"   7 seconds ago   Up 6 seconds   0.0.0.0:8080->80/tcp, :::8080->80/tcp   web01_volume
[root@docker _data]#
[root@docker _data]# curl 127.0.0.1:8080
<html><body><h1>It works!</h1></body></html>
[root@docker _data]#

修改的文件并没有封装到镜像当中

7.2.11 只读挂载

7.2.11.1 先创建volume卷
[root@docker ~]# docker volume create web01-vol

示例:

[root@docker ~]# docker volume create web01-vol
web01-vol
[root@docker ~]#
7.2.11.2 对volume卷进行只读挂载
[root@docker ~]# docker run --name web01 -dit -p 8080:80 -v web01-vol:/usr/local/apache2/htdocs:ro httpd:2.4
[root@docker ~]#

示例:

[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND             CREATED       STATUS       PORTS                                   NAMES
a30efe4e8f57   httpd_volume:1.0   "httpd-foreground"   2 hours ago   Up 2 hours   0.0.0.0:8080->80/tcp, :::8080->80/tcp   web01_volume
[root@docker ~]#
[root@docker ~]# docker run --name web01 -dit -p 8081:80 -v web01-vol:/usr/local/apache2/htdocs:ro httpd:2.4
4566fb11b68bb4fc261fe66b86a76f5f435bb2ac0efcc99f0b8758c101e55f3c
[root@docker ~]#
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND             CREATED         STATUS         PORTS                                   NAMES
4566fb11b68b   httpd:2.4          "httpd-foreground"   21 seconds ago   Up 20 seconds   0.0.0.0:8081->80/tcp, :::8081->80/tcp   web01
a30efe4e8f57   httpd_volume:1.0   "httpd-foreground"   2 hours ago     Up 2 hours      0.0.0.0:8080->80/tcp, :::8080->80/tcp   web01_volume
[root@docker ~]#
[root@docker ~]# docker exec -it web01 /bin/bash
root@4566fb11b68b:/usr/local/apache2#
root@4566fb11b68b:/usr/local/apache2# ls
bin build cgi-bin conf error htdocs icons include logs modules
root@4566fb11b68b:/usr/local/apache2#
root@4566fb11b68b:/usr/local/apache2# cd htdocs/
root@4566fb11b68b:/usr/local/apache2/htdocs#
root@4566fb11b68b:/usr/local/apache2/htdocs# ls
index.html
root@4566fb11b68b:/usr/local/apache2/htdocs#
root@4566fb11b68b:/usr/local/apache2/htdocs# echo 123 >> index.html
bash: index.html: Read-only file system
root@4566fb11b68b:/usr/local/apache2/htdocs#
root@4566fb11b68b:/usr/local/apache2/htdocs# exit    
exit
[root@docker ~]#
[root@docker ~]# cd /var/lib/docker/volumes/web01-vol/_data/
[root@docker _data]#
[root@docker _data]# ls
index.html
[root@docker _data]#
[root@docker _data]# echo "123" >> index.html
[root@docker _data]#


👍 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!


PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我吧!


原文作者:超哥的IT私房菜;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论
专注于IT系统集成、运维、架构二十年的IT职场老兵,拥有CCNA、OCA、OCP、PGCA、PGCE认证证书,公众号:超哥的IT私房菜,知识星球:超哥的IT私房菜,目前是多家IT厂商的咨询顾问。

注册时间:2021-08-27

  • 博文量
    552
  • 访问量
    303484