docker教程(3)--volume

来源:互联网 发布:淘宝闺蜜投诉入口 编辑:程序博客网 时间:2024/05/29 11:03

      • volume概念
      • volume的创建
        • 从容器中挂在volume
        • 从宿主机中挂在volume
        • 通过容器创建volume
        • 使用Dockfile创建volume

volume概念

Docker 的镜像是由一系列的只读层组合而来,当启动一个容器的时候,Docker加载镜像的所有制度层,并在最上层加一个读写层。这个设计使得Docker可以提高镜像构建、存储和分发的效率,节省了时间和存储空间,然而也存在如下问题:

  1. 容器中的文件在宿主机上存在形式复杂,不能在宿主机上很方便的对容器中的文件进行访问
  2. 多个容器之间的数据无法共享
  3. 当删除容器时,容器产生的数据将会丢失

为了解决这些问题,Docker引入了数据卷(volume)机制。volume是存在一个或多个容器中的特定文件或文件夹,这个目录能独立于联合文件系统的形式在宿主机中存在,并为数据的共享与持久提供一下遍历。

  1. volume 在容器创建时就初始化,在容器运行时就可以使用其中的文件
  2. volume 能在不同的容器之间共享和重要
  3. volume 中的数据操作会马上生效
  4. volume 中的数据操作会影响到镜像本身
  5. volume 的生存周期独立于容器的生存周期,及时删除容器,volume仍然会存在,没有任何容器使用volume也不会被Docker删除

总的来说,volume的存在就是将容器和容器产生的数据进行分离,提供独立于容器之外的持久化存储

volume的创建

从容器中挂在volume

  1. docker run -d --name nginx_volume -v /usr/share/nginx/html nginx
    参数解析:
    --name nginx_vlolume 指定容器的名称
    -v /usr/share/nginx/html nginx 指定容器的挂载目录

  2. 使用 docker inspect nginx_volume 命令查看容器配置,在输出的内容中找到以下内容:

    "Mounts": [        {            "Type": "volume",            "Name": "ec6b1159bad6e3ad2fd48479ae4e732a011da93f7691d72158d82e07c8f433fb",            "Source": "/var/lib/docker/volumes/ec6b1159bad6e3ad2fd48479ae4e732a011da93f7691d72158d82e07c8f433fb/_data",            "Destination": "/usr/share/nginx/html",            "Driver": "local",            "Mode": "",            "RW": true,            "Propagation": ""        }    ],

    其中:Source,指的是容器的挂在点,而Destination指的是数据卷的物理文件地址,及宿主机中的文件地址。
    但是当我们在控制台查看Destination文件时,却提示如下:

container_volume

产生此问题的原因是,docker并不是直接运行在mac系统中,在两者之间还存在一个虚拟层,所以我们需要进入到虚拟层中才能查看:screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty,
然后输入:ls /var/lib/docker/volumes/ec6b1159bad6e3ad2fd48479ae4e732a011da93f7691d72158d82e07c8f433fb/_data,即可查看,如下图:

这里写图片描述

如果是linux系统,则不会产生此问题,直接查看即可。

  1. 我们可以改动index.html文件,如 echo "volume data changed!" > index.html
    打开一个新的窗口,输入命令:docker exec -it nginx_volume /bin/bash,即可进入容器的交互模式,
    查看我们刚刚修改过的文件内容:cat /usr/share/nginx/html/index.html,输出:volume data changed!

从宿主机中挂在volume

  1. docker run -p 8080:80 -v $PWD/code:/usr/share/nginx/html -d nginx

    该命令是将宿主机的当前目录下的code目录挂载到容器中的/usr/share/nginx/html目录,
    其中code目录下有存在一个index.html文件,其内容是

    <html>    <h1>Hello Docker</h1></html>

    使用浏览器访问即可看到结果也是 Hello Docker,并不是nginx的默认页面。

  2. 使用此种方式可以将nginx的docker容器作为一个静态服务器来使用。

通过容器创建volume

  1. 首先创建数据容器卷:

    mkdir -p data #在当前目录下创建data目录docker create -v $PWD/data:/var/mydata --name data_container ubuntu
  2. 使用该数据卷容器运行容器:

    docker run -it --volumes-from data_container ubuntu /bin/bash

    进入到容器中,执行mount,会有如下输出:

    这里写图片描述

    打开 /var/mydata/目录,并任意创建一个文件,如

    cd /var/mydata/ && touch whatever.txt

    然后执行exit退出当前目录,到宿主机的$PWD/data目录下,即可看到在容器中创建的whatever.txt文件

使用Dockfile创建volume

参考:http://blog.csdn.net/dream_broken/article/details/52314993