• Docker知识总结 (四) 数据卷


    数据卷相关docker命令

    https://docs.docker.com/engine/reference/commandline/volume_create/

    数据卷介绍

    Docker将运用与运行的环境打包形成容器运行, Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了。 为了能保存数据在Docker中我们使用卷。

    卷就是目录或文件,存在于一个或多个容器中,由Docker挂载到容器,但卷不属于联合文件系统(Union FileSystem),因此能够绕过联合文件系统提供一些用于持续存储或共享数据的特性:。

    卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

    数据卷的特点:

    1. 数据卷可在容器之间共享或重用数据
    2. 卷中的更改可以直接生效
    3. 数据卷中的更改不会包含在镜像的更新中
    4. 数据卷的生命周期一直持续到没有容器使用它为止

    使用

    命令:

    docker run -it -v 主机目录:容器目录 镜像 
    
    • 1

    运行centos:

    [root@VM-4-17-centos home]# docker run -it -v /home/ceshi:/home centos /bin/bash
    [root@c5eb5967894d /]# ls     
    bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    
    • 1
    • 2
    • 3

    结果:host机中生成了一个ceshi目录

    [root@VM-4-17-centos ~]# ls /home
    ceshi  java_program  JiKeZhang  lighthouse  shell_program  www
    
    • 1
    • 2

    docker inspect c5eb5967894d 查看容器信息
    在这里插入图片描述
    共享数据测试:

    [root@VM-4-17-centos ceshi]# touch test.java  # 在主机对应的目录中添加一个文件
    [root@VM-4-17-centos ceshi]# ls
    test.java
    
    [root@c5eb5967894d home]# ls    # 查看容器中对应目录下的文件
    test.java
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Docker安装mysql建立数据卷同步数据

    docker pull mysql:下载最新的mysql镜像

    docker pull mysql
    
    • 1

    启动:

    	[root@VM-4-17-centos home]# docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
    5e45350f42b5164b0cc0f511d39dafb6839fcc5946e7c0766a476a0e56feda1d
    [root@VM-4-17-centos home]#
    
    • 1
    • 2
    • 3

    使用navicat等工具连接测试即可

    具名挂载和匿名挂载

    (1) 匿名挂载:

    1. 启动
    [root@VM-4-17-centos docker]# docker run -d --name nginx01 -p 3344:80 -v /etc/nginx nginx
    
    • 1
    1. 查看所有的卷:
    [root@VM-4-17-centos docker]# docker volume ls
    DRIVER    VOLUME NAME
    local     8bf3a19c90e0ead92c1d629c496520c24e5f10b90f45ce2c54250baf5637f63d
    local     c1b588271c994e07fc66e8d0a7d97e4470b2b9a0f12a8529b73858f3fde425ad
    
    • 1
    • 2
    • 3
    • 4
    1. 问题
      VOLUME NAME都是乱码,因为前面运行的时候只指定了容器内的目录

    (2) 具名挂载

    1. 启动
    [root@VM-4-17-centos docker]# docker run -d --name nginx02 -p 3345:80 -v juming:/etc/nginx nginx
    59c57a689f7e13d4bdffb1b3f58444559dd543ce6ba9d8f27b705a1eb208d6a4
    [root@VM-4-17-centos docker]#
    
    • 1
    • 2
    • 3
    1. 查看所有的卷:
    [root@VM-4-17-centos docker]# docker volume ls
    DRIVER    VOLUME NAME
    local     8bf3a19c90e0ead92c1d629c496520c24e5f10b90f45ce2c54250baf5637f63d
    local     c1b588271c994e07fc66e8d0a7d97e4470b2b9a0f12a8529b73858f3fde425ad
    local     juming
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 查看挂载的主机目录:
    [root@VM-4-17-centos docker]# docker volume inspect juming
    [
        {
            "CreatedAt": "2022-05-11T00:10:39+08:00",
            "Driver": "local",
            "Labels": null,
            "Mountpoint": "/var/lib/docker/volumes/juming/_data",  #主机内的目录
            "Name": "juming",
            "Options": null,
            "Scope": "local"
        }
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    1. 所有没有指定目录的卷都在 /var/lib/docker/volumes
    [root@VM-4-17-centos docker]# cd /var/lib/docker/volumes
    [root@VM-4-17-centos volumes]# ls
    8bf3a19c90e0ead92c1d629c496520c24e5f10b90f45ce2c54250baf5637f63d  backingFsBlockDev  c1b588271c994e07fc66e8d0a7d97e4470b2b9a0f12a8529b73858f3fde425ad  juming  metadata.db
    
    
    • 1
    • 2
    • 3
    • 4

    (3) 拓展

    docker run -d --name nginx02 -p 3345:80 -v juming:/etc/nginx;ro nginx
    或者
    docker run -d --name nginx02 -p 3345:80 -v juming:/etc/nginx;rw nginx
    
    • 1
    • 2
    • 3

    ro:(read only) 表示容器只有读的权限

    rw:(read write) 表示容器有读和写的权限(默认就是rw

    初识Dockerfile

    1. 新建一个文件dockerfile1
    FROM centos
    
    VOLUME ["volume01","volume02"]
    
    CMD echo "----end----"
    CMD /bin/bash
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    注意:这里的每一个命令,都各是一个镜像的一层。

    1. 执行docker build
    [root@VM-4-17-centos docker-test-volume]# docker build -f ./dockerfile1 -t zhxcentos:1.0 .
    Sending build context to Docker daemon  2.048kB
    Step 1/4 : FROM centos
     ---> 5d0da3dc9764
    Step 2/4 : VOLUME ["volume01","volume02"]
     ---> Running in 70814db381a5
    Removing intermediate container 70814db381a5
     ---> 3db65aef8482
    Step 3/4 : CMD echo "----end----"
     ---> Running in 92cdf24fdfef
    Removing intermediate container 92cdf24fdfef
     ---> 440c1fcbc31f
    Step 4/4 : CMD /bin/bash
     ---> Running in 6c860a2f7efd
    Removing intermediate container 6c860a2f7efd
     ---> d3bf78adc986
    Successfully built d3bf78adc986
    Successfully tagged zhxcentos:1.0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    1. 查看生成的镜像
    [root@VM-4-17-centos docker-test-volume]# docker images
    REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
    zhxcentos             1.0       d3bf78adc986   8 seconds ago   231MB
    
    
    • 1
    • 2
    • 3
    • 4
    1. 执行docker run 运行
    [root@VM-4-17-centos docker-test-volume]# docker run -it d3bf78adc986 /bin/bash
    [root@cbd17bdad4e4 /]#
    
    • 1
    • 2
    1. 查看容器的目录
      在这里插入图片描述
      注意:宿主机上一定有对应的目录,这里的挂载是匿名挂载。
    2. 查看一下卷挂载的路径
      在这里插入图片描述

    数据卷容器

    如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门用来提供数据卷供其他容器挂载。

    测试:

    1. 启动容器
      在这里插入图片描述
      在这里插入图片描述
    2. 进入docker01中的/volume01下创建一个文件,观察docker02中的volume01目录
      进入docker01:
      在这里插入图片描述
      查看docker02中的volume01目录:
      在这里插入图片描述
    3. 测试删除docker01容器,查看docker01中volume01下是否还存在创建的文件
      结果:依然存在。
      原因:docker01和docker02中的volume01和volume02实际上都挂载到了宿主机上的volumes目录中,只要不删除宿主机上的目录,文件就一直存在。
  • 相关阅读:
    教程分享:如何将微信公众号变成淘宝客查券返利机器人自动赚佣金?
    如何在Linux环境中远程访问企业级夜莺监控分析工具?
    Idea本地跑flink任务时,总是重复消费kafka的数据(kafka->mysql)
    6 个问题搞懂 HTTPS 加密通信的原理与 HTTPS 通信安全协议
    bcftools学习笔记丨软件简介、安装方式、使用方法、核心功能、参数解释等一文速览
    基于SpringBoot的自习室预约管理系统
    再次学习高精度
    使用.Net对图片进行裁剪、缩放、与加水印
    SpringBatch 使用过程中遇到的问题
    ArrayList集合2
  • 原文地址:https://blog.csdn.net/weixin_45773632/article/details/126195799