docker 12 docker容器数据卷

数据卷概念

♣我们知道,当我们把一个运行中的容器关闭后,容器里的数据就没有了(如果你做了docker commit操作,数据会保留到新的镜像里面)。所以我们就需要用容器数据卷把容器数据进行持久化储存。

♣还有一种情况,就是希望容器之间能共享数据,这时也需要容器数据卷。

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

♣卷就是目录或者文件,存在一个或者多个容器中,由docker宿主机挂载到容器上,但是不属于联合文件系统,因此能绕过联合文件系统提供一些用于持久化存储或者共享数据的特性。

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

♣特点:

1)数据卷可以再容器之间共享或者重用数据;

2)卷的更改可以直接生效

3)数据卷中得更改不会包含在镜像的更新中;

4)数据卷的生命周期一直持续到没有容器使用它为止

5)数据卷可以完成容器到宿主主机、宿主机到容器之家的数据共享

容器内添加数据卷

♣在容器中添加数据卷有两种方法,一个是直接用命令添加,一个是用dockerfile添加,下面分别介绍

♣直接命令添加数据卷

1)命令:docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名

说明:-v是volume的意思

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

[root@t-docker chenzx]# 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/

2)查看数据卷是否挂载成功

[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才能可读写
                "Propagation": "rprivate"

3)验证容器和宿主机之间数据共享

在/myDataVolume和/dataVolumeContainer上各创建文件,都能互相看到。

4)容器停止退出后,主机修改后数据是否还同步

答:同步

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
99d00ed3abbe        centos              "/bin/bash"         5 minutes ago       Exited (0) 11 seconds ago         

[root@localhost myDataVolume]# touch c.txt

[root@localhost ~]# docker exec -it 99d00ed3abbe /bin/bash
[root@99d00ed3abbe /]# ls
DataVolumeContainer  bin  etc   lib    media  opt   root  sbin  sys  usr
anaconda-post.log    dev  home  lib64  mnt    proc  run   srv   tmp  var
[root@99d00ed3abbe /]# cd DataVolumeContainer/
[root@99d00ed3abbe DataVolumeContainer]# ls
a.txt  b.txt  c.txt

5)带权限的数据卷

命令:docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

说明:-v是volume卷的意思

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

ro是read only只读权限

[root@t-docker chenzx]# 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"

6)其他

♣有时候可能会出现docker挂载的宿主机目录,容器访问出现cannot open directory:permission denied。

解决办法:在挂载目录后面多加一个--privileged=true参数即可。

[root@t-docker chenzx]# docker run -it -v /myDataVolume:/dataVolumeContainer -privileged=true centos

dockerfile方式添加数据卷

1)根目录下创建mydocker文件夹并进入

[root@t-docker chenzx]# mkdir /mydocker
[root@t-docker chenzx]# cd /mydocker/

2)可在dockerfile中使用volume指令给镜像添加一个或者多个数据卷

语法:VOLUME ["/dataVolumeContainer",‘/data/VolumeContainer2‘,‘/dataVolumeContainer3‘]

说明:出于可移植性和分享的考虑,用-v主机目录:容器目录这种方法不能直接在dockerfile中实现。因为宿主机目录是依赖于特定宿主机的,并不能保证在所有的宿主机上都存在这样的特定目录。

3)dockerfile构建

[root@t-docker chenzx]# cd /mydocker/
[root@t-docker mydocker]# cat Dockerfile
#volume test
#继承centos镜像
FROM centos
#在上面继承的centos目录下建立两个数据卷
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------success1"
CMD /bin/bash

4)build后生成镜像

[root@t-docker mydocker]# cd /mydocker/
[root@t-docker mydocker]# docker build -f /mydocker/Dockerfile  -t chenzx/centos /mydocker
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 chenzx/centos:latest
[root@t-docker mydocker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
chenzx/centos       latest              a37b96c1c7a7        18 seconds ago      200MB

♣ 说明: -t是-tag list的意思

5)run容器

[root@t-docker mydocker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
chenzx/centos       latest              a37b96c1c7a7        7 minutes ago       200MB
[root@t-docker mydocker]# docker run -it chenzx/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两个目录

6)查看容器内的卷目录地址对应的宿主机目录地址

[root@t-docker /]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
3ccb67a921de        chenzx/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": ""
            }

上面我们看到是宿主机上的

/var/lib/docker/volumes/0055c21730734a9a73751de1ae1c7a5865f369e180d911490569d4aa1b78479d/_data对应容器里面的/dataVolumeContainer1,

/var/lib/docker/volumes/18c5bc0fba2ec1913a7fd4997fc2181d16f2640d0c271571c0b580db89797c06/_data对应容器里面的/dataVolumeContainer2

容器数据卷

♣命名的容器挂载数据卷,其他容器通过挂载这个父容器实现数据共享,挂载数据卷的容器,称之为数据卷容器。

♣下面我们以以上一步新建的镜像chenzx/centos为模板并运行容器dc01/dc02/dc03。

♣我们通过前面新建的镜像chenzx/centos为模板,生成的容器是挂载着/dataVolumeContainer1和/dataVolumeContainer2两个数据卷

1)先启动一个父容器dc01,并在dataVolumeContainer1中新增内容

[root@t-docker chenzx]# docker images chenzx/centos
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
chenzx/centos       latest              a37b96c1c7a7        3 hours ago         200MB
[root@t-docker chenzx]# docker run -it --name dc01 chenzx/centos
[root@b786166d80d7 /]# ls
dataVolumeContainer1   dataVolumeContainer2 

[root@b786166d80d7 /]# cd dataVolumeContainer1
[root@b786166d80d7 dataVolumeContainer1]# touch dc01_add.txt
[root@t-docker chenzx]#
[root@t-docker chenzx]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
b786166d80d7        chenzx/centos       "/bin/sh -c /bin/bash"   8 minutes ago       Up 8 minutes                            dc01

2)dc02/dc03继承dc01(--volumes-from参数)

[root@t-docker chenzx]# docker run -it --name dc02 --volumes-from dc01 chenzx/centos
[root@e71e1991a17b /]# 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@e71e1991a17b /]# cd dataVolumeContainer1
[root@e71e1991a17b dataVolumeContainer1]# ls
dc01_add.txt
[root@e71e1991a17b dataVolumeContainer1]# touch dc02_add.txt
[root@e71e1991a17b dataVolumeContainer1]# ls
dc01_add.txt  dc02_add.txt
[root@t-docker chenzx]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
e71e1991a17b        chenzx/centos       "/bin/sh -c /bin/bash"   3 minutes ago       Up 3 minutes                            dc02
b786166d80d7        chenzx/centos       "/bin/sh -c /bin/bash"   14 minutes ago      Up 14 minutes                           dc01
[root@t-docker chenzx]# docker run -it --name dc03 --volumes-from dc01 chenzx/centos
[root@69c4c254cb0f /]# cd dataVolumeContainer1 

[root@69c4c254cb0f dataVolumeContainer1]# ls
dc01_add.txt  dc02_add.txt
[root@69c4c254cb0f dataVolumeContainer1]# touch dc03_add.txt
[root@69c4c254cb0f dataVolumeContainer1]# ls
dc01_add.txt  dc02_add.txt  dc03_add.txt
[root@t-docker chenzx]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
69c4c254cb0f        chenzx/centos       "/bin/sh -c /bin/bash"   2 minutes ago       Up About a minute                       dc03
e71e1991a17b        chenzx/centos       "/bin/sh -c /bin/bash"   7 minutes ago       Up 7 minutes                            dc02
b786166d80d7        chenzx/centos       "/bin/sh -c /bin/bash"   18 minutes ago      Up 18 minutes                           dc01

3)回到dc01可以看到dc02/dc03添加的数据了

[root@t-docker chenzx]# docker exec -it dc01 /bin/bash
[root@b786166d80d7 /]# 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@b786166d80d7 /]# cd dataVolumeContainer1
[root@b786166d80d7 dataVolumeContainer1]# ls
dc01_add.txt  dc02_add.txt  dc03_add.txt

4)删除dc01,dc02修改后dc03可否访问

[root@t-docker chenzx]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
69c4c254cb0f        chenzx/centos       "/bin/sh -c /bin/bash"   About an hour ago   Up About an hour                        dc03
e71e1991a17b        chenzx/centos       "/bin/sh -c /bin/bash"   About an hour ago   Up About an hour                        dc02
b786166d80d7        chenzx/centos       "/bin/sh -c /bin/bash"   About an hour ago   Up About an hour                        dc01
[root@t-docker chenzx]#
[root@t-docker chenzx]# docker rm -f dc01
dc01
[root@t-docker chenzx]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
69c4c254cb0f        chenzx/centos       "/bin/sh -c /bin/bash"   About an hour ago   Up About an hour                        dc03
e71e1991a17b        chenzx/centos       "/bin/sh -c /bin/bash"   About an hour ago   Up About an hour                        dc02
[root@t-docker chenzx]# docker attach dc02
[root@e71e1991a17b dataVolumeContainer1]# ls
dc01_add.txt  dc02_add.txt  dc03_add.txt
[root@e71e1991a17b dataVolumeContainer1]# touch dc02_update.txt
[root@e71e1991a17b dataVolumeContainer1]# ls
dc01_add.txt  dc02_add.txt  dc02_update.txt  dc03_add.txt

5)删除dc02后,dc03仍然可以访问

6)新建dc04继承dc03后再删除dc03

[root@t-docker chenzx]# docker run -it --name dc04 --volumes-from dc03 chenzx/centos
[root@7b7f4dd0c965 /]# cd dataVolumeContainer1
[root@7b7f4dd0c965 dataVolumeContainer1]# ls
dc01_add.txt  dc02_add.txt  dc02_update.txt  dc03_add.txt

7)结论:容器之间配置信息的传递。数据卷的生命周期一直持续到没有容器使用它为止

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28916011/viewspace-2213253/,如需转载,请注明出处,否则将追究法律责任

原文地址:https://www.cnblogs.com/charon2/p/10428413.html

时间: 2024-10-12 02:53:04

docker 12 docker容器数据卷的相关文章

(九) Docker 容器数据卷(挂载)

一.容器数据卷 docker 容器数据卷是容器在运行过程中持久化数据的一种方式,卷是目录或文件,存在于一个或多个容器中,由docker 挂载到容器,但不属于联合文件系统,因此能够绕过Union File System  提供一些用于持续存储或共享数据的特性:卷的设计目的就是数据持久化,完全独立于容器的生命周期,因此docker不会在容器删除时,删除其挂载的数据卷. 特点: 数据卷可在容器之间共享或重用数据. 卷中的更改可以直接生效. 数据卷中的更改,不会包含在镜像中的更新. 数据卷的生命周期一直

5、docker容器数据卷

Docker容器数据卷 是什么 一句话:有点类似我们Redis里面的rdb和aof文件 能干嘛 容器的持久化 容器间继承+共享数据 数据卷 容器内添加 直接命令添加 命令 docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名 查看数据卷是否挂载成功 容器和宿主机之间数据共享 容器停止退出后,主机修改后数据是否同步 命令(带权限) docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 DockerFile添加 根目录下新建mydocker文

Docker Kubernetes Volume 本地数据卷

Docker Kubernetes Volume 本地数据卷 emptyDir 当Pod分配到Node时,首先创建一个空卷,并挂载到Pod中的容器. Pod中的容器可以读取和写入卷中的文件. 当Pod从节点中删除emptyDir时,该数据也会被删除. 注:适用于容器之间的数据共享. hostPath 一个hostPath卷挂载Node文件系统上的文件或目录到Pod中的容器. 注:指定宿主级的数据目录挂载到容器中. 环境: 系统:Centos 7.4 x64 Docker版本:18.09.0 Ku

Docker:网络及数据卷设置 [四]

一.Docker网络设置 默认情况下,docker会创建一个桥接网卡[docker 0],docker有2种映射方式,一种是随机映射,一种是指定映射 提示:生产场景一般不使用随机映射,但是随机映射的好处就是由docker分配,端口不会冲突 案例1:使用docker启动nginx随机映射配置 [[email protected] ~]# docker run -d -P nginx 63cbe30165c8fb2ce7789a8173db6f2060705028ce6c326d1f0cd467bd

Docker系列-第五篇Docker容器数据卷

1.是什么 在生产环境中使用 Docker,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作 . 容器中的管理数据主要有两种方式 : 数据卷 ( Data Volumes ) : 容器内数据直接映射到本地主机环境: 数据卷容器( Data Volume Containers ) : 使用特定容器维护数据卷. 一句话:有点类似我们Redis里面的rdb和aof文件 将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的

Docker容器数据卷

容器关闭,数据消失: 我们对数据的要求希望是 持久化的: 容器之间希望可以共享数据: 一.能干嘛: 1.持久化 2.数据共享,双向拷贝 二.数据卷 容器内添加: 1.直接命令添加 2.DockerFile添加 3.备注 原文地址:https://www.cnblogs.com/pthaochiya/p/11666235.html

docker深入1-docker的数据卷

参考: http://docs.docker.com/userguide/dockervolumes/ 针对数据的存储,有个data volume的概念. 使用参数: -v 在container中创建一个volume,或者类似目录映射的方式,挂载一个数据盘或者目录到docker的container中. 环境准备: [[email protected] ~]# yum install docker-io -y [[email protected] ~]# docker -v Docker vers

Linux修改docker镜像和容器数据存储位置

指定镜像和容器存放路径的参数是--graph=/var/lib/docker,其默认存储位置为/var/lib/docker, Docker 的配置文件可以设置大部分的后台进程参数,在各个操作系统中的存放位置不一致, 1. 在 Ubuntu 中的位置是:/etc/default/docker, OPTIONS=--graph="/root/data/docker" -H fd://# 或者DOCKER_OPTS="-g /root/data/docker" 最后重新

容器数据卷网络基本配置

容器和主机.容器与容器之间需要数据共享时可以使用数据卷技术解决 容器中管理数据的主要方式有两种:数据卷.数据卷容器 1 数据卷 1.1 数据卷特性 可在容器之间共享和重用 对数据卷的修改马上生效 对数据卷的更新不影响镜像 卷会一直存在,直到没有容器使用 1.2 在容器内创建一个数据卷的方式,在启动的时候使用 -v 标记,可以创建一个数据卷挂载到容器指定目录中,也可以挂载本地目录到容器中作为数据卷. 说明:本地目录路径必须是绝对路径,如果不存在,docker会自动创建. 1.3 数据卷容器,可以在