数据卷(Data Volumes)

  • Docker 宿主机和容器之间文件拷贝
  • 数据卷
  • 数据卷容器

本章知识:

1、Docker 宿主机和容器之间文件拷贝
2、数据卷
3、数据卷容器

本篇博客需要具备了解 Docker命令 的条件下哦!

Docker 宿主机和容器之间文件拷贝

前言:

Docker 数据管理

在生产环境中使用 Docker ,往往需要 对数据进行持久化,或者 需要在多个容器之间进行
数据共享
,OK,这必然涉及 容器的数据管理操作

容器中的管理数据主要有两种方式(官方推荐):

  • 数据卷 (Data Volumes ) 容器内数据直接映射到本地主机环境
  • 数据卷容器(Data Volume Containers) 使用特定容器维护数据卷

当然还有最原始的方式------copy,这个也是管理数据的方式,但是基本不会用到的,ennnnn,这里我还是讲一下啦, O(∩_∩)O哈哈~;

最原始的copy方式管理数据:

  • 宿主机文件 copy to 容器内
docker cp 需要拷贝的文件或者目录   容器名称:容器目录

实例:

docker cp /dj/monitorlogs/ db3:/test/software
  • 容器内 copy to 宿主机
docker cp 容器名称:容器目录    宿主机目录

实例:

docker cp db3:/javadj/software/test.txt /dj

docker内部 vi命令没有 docker volumes-from_docker

注意:
虽然说,数据共享有三种方式,一种是直接从容器内 copy 到宿主机,还有两种是官方推荐的。
但是,用原始方式copy的,如果容器中同名的文件内容发生改变,那么,这两个文件互不干扰,也就是宿主机里的文件并不会发生改变;
用官方推荐的方法就不一样了,如果容器中同名的文件内容发生改变,那么宿主机里的文件也会发生改变。

数据卷

数据卷(Data Volumes) 是一个可供一个或多个容器使用的特殊目录,它将主机操作系统目录直接映射进容器

数据卷(Data Volumes) 可以提供很多有用的特性:

  1. 数据卷 可以在容器之间共享和重用
  2. 对 数据卷 的修改会立马生效
  3. 对 数据卷 的更新,不会影响镜像
  4. 数据卷 默认会一直存在,即使容器被删除

数据卷相关操作 :

  1. 创建数据卷
docker volume create my-vol

此时,数据卷默认会放到 /var/lib/docker/volumes 路径下,会发现所新建的数据卷位置,查看命令如下:

docker内部 vi命令没有 docker volumes-from_Docker_02

## 参数可以为数字“1”,字母L:大小写均可,但效果不一样 
 
 	 ls -1 /var/lib/docker/volumes

docker内部 vi命令没有 docker volumes-from_Docker_03

  1. 查看所有的数据卷
docker volume ls

docker内部 vi命令没有 docker volumes-from_Docker_04

  1. 查看指定数据卷的详细信息 (显示一个JSON格式的数据)
docker volume inspect my-vol

docker内部 vi命令没有 docker volumes-from_docker内部 vi命令没有_05

  1. 删除一个volume
docker volume rm my-vol

docker内部 vi命令没有 docker volumes-from_docker_06

注:数据卷 是被设计用来持久化数据的,它的生命周期独立于容器,Docker不会在容器被删除后自动删除数据卷,
并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷,无主的数据卷可能会占据很多空间,
所以要及时删除。

## 挂载数据卷,最好是通过 run 而非 create/start 创建启动容器
 	   ## create/start 命令创建启动容器后,再挂载数据卷相当麻烦,要修改很多配置文件,但并非不可以
  1. 启动一个挂载数据卷的容器
    查看:
## demo1
      docker run -d \
        -it \
        --name tomcat01 \
        --mount source=my-vol,target=/webapp \
        centos:7

docker内部 vi命令没有 docker volumes-from_Docker_07


注意:此行命令执行后的效果是,宿主机路径 /var/lib/docker/volumes/my-vol/_data 与 tomcat01 容器路径 /webapp 完成映射。

## demo2
  docker run -d \
    -it \
    --name tomcat02 \
    --mount type=bind,source=/javadj/data,target=/root/webapp02 \
    centos:7
注1:linux命令结尾加斜杠有什么用
 
      加了“\”意为将最后的回车换行给注释了,系统理解为命令还没有结束,因而是继续等待用户进行输入,直到读到结束符,如回车



 注2:source=my-vol,target=/webapp
 
      my-vol为要挂载的数据卷,如果数据卷不存在,docker会自动创建
      /webapp为容器上目录,如果目录不存在, Docke会自动创建
      
      

 注3:mount选项高级用法
 
      --mount选项的type参数支持三种类型的数据卷
      
      --mount标志:由多个名值对组成,逗号分隔,每个键值由 <key> = <value> 元组组成 
      
      1.type=volume普通数据卷(默认即这种类型),映射到主机/var/lib/docker/volumes路径下;
        --mount type=volume,source=my-vol,target=/webapp
        注:这是type的默认值
        
      2.bind:绑定数据卷,映射到主机指定路径下;
        --mount type=bind,source=/webapp,destination=/webapp2
        
      3.tmpfs :临时数据卷,只存在于内存中
        docker run -d \
          -it \
          --name tmptest \
          --mount type=tmpfs,destination=/app \
          nginx:latest

数据卷容器

数据卷容器 :

如果用户 需要在多个容器之间共享一些持续更新的数据 ,最简单的方式是使用数据卷容器。

数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载。

数据卷容器相关操作 :

  1. 新建数据卷容器
docker run -di --name db_data -v /db_data centos:7

注:-v 后面接的共享数据真实存放路径

  1. 用容器db1、db2测试数据卷容器是否可用
docker run -di --name db1 --volumes-from db_data centos:7
     docker exec -it db1 bash
     cd db_data
	 
	 docker run -di --name db2 --volumes-from db_data centos:7
     docker exec -it db2 bash
     cd db_data

随便创建一个aaa.txt文件就可以查看效果了

效果:上面例子中db1、db2通过db_data来共享了数据

docker内部 vi命令没有 docker volumes-from_Docker_08

本章总结:

  • 1、宿主机与容器之间文件数据的拷贝
Docker cp /javadj/docker 容器名:/webapp   (webapp 这个路径必须存在)
  
  Docker cp 容器名:/webapp /javadj/docker   (Docker cp  命令是要在宿主机下面执行)
  • 2、数据卷
    概念:在宿主机上创建一个共享的目录,这个目录可以与宿主机上的任意容器共享数据。
    创建数据卷:
1、Docker Volume create XXX
  	数据卷实际上是一个目录:_data 就是真正共享数据的目录
  	
  	2、Docker run -d -it --name XXX
  	--mount  (type=bind , source="dir" , target="指定了容器内的某一个路径")
  	镜像
  • 3、数据卷容器
    概念:在宿主机上创建一个特定的容器,只不过这个容器会与其它容器共享数据
Docker run -it --name db_data -V /db_data 镜像
  	Docker run -it --name db1 from volume db_data 镜像
  	Docker run -it --name db2 from volume db_data 镜像