Docker-核心篇(4)-容器数据卷

一、容器数据卷

  1. Docker理念
    • 将应用与运行的环境打包形成容器运行 ,运行环境可以伴随着容器,但是数据需要持久化
    • 容器之间希望有可能共享数据,方便数据处理
  2. Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,
    那么当容器删除后,数据自然也就没有了
  3. 容器的数据卷就是用来将数据共享到宿主机,当容器删除时并不删除共享的内容,从而实现数据的持久化
  4. 卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
  5. 卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
    • 数据卷可在容器之间共享或重用数据
    • 卷中的更改可以直接生效
    • 数据卷中的更改不会包含在镜像的更新中
    • 数据卷的生命周期一直持续到没有容器使用它为止
  6. 核心功能如下
    • 容器的持久化
    • 容器间继承+共享数据

二、数据卷添加

  • 前台运行:docker run -it --name -v /宿主机绝对路径目录:/容器内目录 镜像名
  • 后台运行:docker run -d --name -v /宿主机目录:/容器内目录 镜像名
  1. 如果创建时宿主机的目录不存在也会自动创建
  2. docker inspect 容器ID 可以查看是否添加成功
    • RW:是否可读写
...
"Mounts":[
  {
    
    
    "Type":"bind",
    "Source":"/root/docker/mysql/log",
    "Destination":"/var/log/mysql",
    "Mode":"",
    "RW":true,
    "Propagation":"rprivate"
  },
  {
    
    
    "Type":"bind",
    "Source":"/root/docker/mysql/conf",
    "Destination":"/etc/mysql",
    "Mode":"",
    "RW":true,
    "Propagation":"rprivate"
  },
  {
    
    
    "Type":"bind",
    "Source":"/root/docker/mysql/data",
    "Destination":"/var/lib/mysql",
    "Mode":"",
    "RW":true,
    "Propagation":"rprivate"
  }
]
...
  1. 此时在挂在目录内,无论是在宿主机修改还是在容器内修改,两者可见
  2. 即使容器停止过,在宿主机内新增的信息仍然会同步到容器内
  3. 也可以在启动时指定容器的权限:docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
    • ro:只读,rw:读写
  4. Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied解决办法
    • 在挂载目录后多加一个 –privileged=true 参数即可

三、数据卷容器

  1. 命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
  2. 可以类比为一个池子,参与共享的容器都可以对池子进行增加、修改、删除,由于是公共资源,当任意容器修改资源时,别的容器可见
  3. 通过命令 <基础容器> --volumes-from <父容器> 来指定一个正在启动的基础容器需要同步父容器的什么内容
    • docker run -it --name redis --privileged=true --volumes-from parentRedis 8cf625070931
  4. 容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止

猜你喜欢

转载自blog.csdn.net/sinat_34104446/article/details/125033548