容器数据卷创建

什么是数据卷?

卷就是目录或文件,存在于一个或者多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能绕过Union File System提供一些用于持续存储或者共享数据的特性;
特点
1. 数据卷可在容器之间共享或重用数据
2. 卷中的更改可以直接生效
3. 数据卷中的更改不会包含在镜像的更新中
4. 数据卷的生命周期一直持续到没有容器使用它为止
5. 数据卷可以完成容器到宿主机,宿主机到容器之间的数据共享

一句话,数据卷就是用来解决数据持久化和数据共享的。

容器内添加数据卷

容器内添加数据卷有两种方法:一种是直接用命令添加,另一种是使用dockerfile添加

  1. 直接命令添加数据卷
命令:docker run -it -v /宿主机绝对路径目录: /容器内目录 镜像名
说明:-v是volume卷的意思
      宿主机绝对目录和容器内目录都不用提前建立
     
[root@t-docker lbb]# docker run -it -v /myDataVolume:/dataVolumeContainer centos
[root@8ad4df9ec2fd /]# ls
anaconda-post.log  dataVolumeContainer  etc   lib    media  opt   root  sbin  sys  usr
bin                dev                  home  lib64  mnt    proc  run   srv   tmp  var
[root@8ad4df9ec2fd /]# cd dataVolumeContainer/
  1. 查看数据卷是否挂载成功
[root@t-docker myDataVolume]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
8ad4df9ec2fd        centos              "/bin/bash"         5 minutes ago       Up 5 minutes                            lucid_swartz
[root@t-docker myDataVolume]# docker inspect 8ad4df9ec2fd
  "Mounts": [
            {
                "Type": "bind",
                "Source": "/myDataVolume",
                "Destination": "/dataVolumeContainer",
                "Mode": "",
                "RW": true,  ##注意RW是true才能可读写(read and write)
                "Propagation": "rprivate"
  1. 验证容器和宿主机之间的数据共享
在/myDataVolume和/dataVolumeContainer上各创建文件,都能互相看到。 

注意:
        容器停止退出后,主机修改后数据还在同步
  1. 带权限的数据卷
命令:docker run -it -v /宿主机绝对路径目录:/容器内目录:ro  镜像名

    说明:-v是volume卷的意思

        宿主机绝对目录和容器内目录都不用提前建立

        ro:是read only的意思 
        
[root@t-docker lbb]# docker run -it -v /myDataVolume:/dataVolumeContainer:ro centos
[root@c13998a78deb /]# ls
[root@t-docker myDataVolume]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
c13998a78deb        centos              "/bin/bash"         2 minutes ago       Up 2 minutes                            wonderful_khorana
[root@t-docker myDataVolume]# docker inspect c13998a78deb
 "Mounts": [
            {
                "Type": "bind",
                "Source": "/myDataVolume",
                "Destination": "/dataVolumeContainer",
                "Mode": "ro",
                "RW": false,  ##不能写,只能读
                "Propagation": "rprivate"

dockerfile方式添加数据卷

  1. 根目录下新建mydocker文件夹并进入
[root@t-docker lbb]# mkdir /mydocker
[root@t-docker lbb]# cd /mydocker/
  1. 可在dockerfile中使用colume指令来给镜像添加一个或多个数据卷
语法:VOLUME ["/dataVolumeContainer",'/data/VolumeContainer2','/dataVolumeContainer3']

    说明:出于可移植性和分享的考虑,用-v主机目录:容器目录这种方法不能直接在dockerfile中实现。因为宿主机目录是依赖于特定宿主机的,并不能保证在所有的宿主机上都存在这样的特定目录。 
  1. dockerfile构建
[root@t-docker lbb]# cd /mydocker/
[root@t-docker mydocker]# cat Dockerfile 
#volume test
#继承centos镜像
FROM centos
#在上面继承的centos目录下建立两个数据卷
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------success1"
CMD /bin/bash
  1. build生成镜像
[root@t-docker mydocker]# cd /mydocker/
[root@t-docker mydocker]# docker build -f /mydocker/Dockerfile  -t lbb/centos .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 5182e96772bf
Step 2/4 : VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
 ---> Running in d7a71c40c684
Removing intermediate container d7a71c40c684
 ---> 1edef45a66a2
Step 3/4 : CMD echo "finished,--------success1"
 ---> Running in 0cad5eaf3a5e
Removing intermediate container 0cad5eaf3a5e
 ---> 027d129bc237
Step 4/4 : CMD /bin/bash
 ---> Running in 0f4088e1bf0e
Removing intermediate container 0f4088e1bf0e
 ---> a37b96c1c7a7
Successfully built a37b96c1c7a7
Successfully tagged lbb/centos:latest
[root@t-docker mydocker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
lbb/centos       latest              a37b96c1c7a7        18 seconds ago      200MB

说明: -t是-tag list的意思 
  1. 启动容器
[root@t-docker mydocker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
lbb/centos       latest              a37b96c1c7a7        7 minutes ago       200MB
[root@t-docker mydocker]# docker run -it lbb/centos
[root@3ccb67a921de /]#
[root@3ccb67a921de /]# ls
anaconda-post.log  dataVolumeContainer1  dev  home  lib64  mnt  proc  run   srv  tmp  var
bin                dataVolumeContainer2  etc  lib   media  opt  root  sbin  sys  usr
[root@3ccb67a921de /]#

 ls后看到容器内有dataVolumeContainer1和dataVolumeContainer2两个目录 
  1. 查看容器内的卷目录地址对应宿主机目录地址
[root@t-docker /]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
3ccb67a921de        lbb/centos       "/bin/sh -c /bin/bash"   6 minutes ago       Up 6 minutes                            gallant_jang
[root@t-docker /]# docker inspect 3ccb67a921de
"Mounts": [
            {
                "Type": "volume",
                "Name": "0055c21730734a9a73751de1ae1c7a5865f369e180d911490569d4aa1b78479d",
                "Source": "/var/lib/docker/volumes/0055c21730734a9a73751de1ae1c7a5865f369e180d911490569d4aa1b78479d/_data",
                "Destination": "/dataVolumeContainer1",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "18c5bc0fba2ec1913a7fd4997fc2181d16f2640d0c271571c0b580db89797c06",
                "Source": "/var/lib/docker/volumes/18c5bc0fba2ec1913a7fd4997fc2181d16f2640d0c271571c0b580db89797c06/_data",
                "Destination": "/dataVolumeContainer2",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }

至此两种创建数据卷的方式已成功

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容