docker volume数据卷

1.创建volume

  • Docker 1.9之后引入新的子命令,docker volume,可以对volume进行创建、查看和删除。
$ sudo docker volume create --name vol_simple
  • 使用docker run或docker create创建容器时,也可以使用-v标签为容器添加volume。
$ sudo docker run -d -v /data ubuntu
  • 以下命令创建制定名字volume,并挂载到容器中到/data目录下
$ sudo docker run -d -v vol_simple: /data ubuntu
  • 使用docker volume inspect查看volume到信息
$ sudo docker volume inspect vol_simple

2.挂载volume

  • 使用如下命令创建并挂载volume
$ sudo docker volume create --name vol
$ sudo docker run -d -v vol: /data ubuntu
  • 将宿主机上到目录挂载到容器中,文件夹必须使用绝对路径,如果宿主机中不存在/host/dir,将创建一个空文件夹。如果镜像中原本存在/container/dir文件夹,该文件夹下原有到内容将被隐藏,以保持与宿主机中到文件夹一致。(以主机内容为主)
$ sudo docker run -v /host/dir:/container/dir ubuntu
  • 挂载单个文件,文件必须使用绝对路径,文件不存在/host/file,则创建一个同名空目录。挂载后文件内容与宿主机到文件一致,也就是说如果容器中原本存在/container/file,该文件将被隐藏。(以主机内容为主)
$ sudo docker run -it -v /host/file:/container/file ubuntu
  • 主机到文件或文件夹作为volume挂载时,可以使用:ro指定volume为只读,z和Z指定为是否共享,默认为z,即共享该volume
$ sudo docker run -it -v /host/dir:/container/dir:ro

3.使用Dockerfile添加volume

1.使用VOLUME指令向容器添加volume,如果镜像中存在/data文件夹,这个文件夹中到内容将全部复制到宿主机对应到文件夹下。(以容器内容为主)
VOLUME /data

使用VOLUME可以添加多个volume:VOLUME ["/data1","/data2"].

2.需要注意到是,在Dockerfile中使用VOLUME指令之后到代码,如果尝试对这个volume进行修改,这些修改都不会生效。例如:
FROM ubuntu
RUN useradd foo
VOLUME /data
RUN touch /data/file #不生效
RUN chown -R foo:foo /data #不生效

正确为:

#改变对volume文件夹修改对顺序
FROM ubuntu
RUN useradd foo
RUN mkdir /data && touch /data/file && chown -R foo:foo /data 
VOLUME /data

或者

# 将修改操作放到CMD或者ENTRYPOINT指令中
FROM ubuntu
RUN useradd foo
VOLUME /data
CMD  touch /data/file && chown -R foo:foo /data 

4.共享volume

  • 在docker run或者docker create创建容器时,可以使用--volumes-from标签使得容器与已有的容器共享volume。
$ sudo docker run --rm -it --volumes-from vol_simple ubuntu
  • 如果一些数据,比如配置文件、数据文件等,要在多个容器之间共享,一种常见的做法时创建一个数据容器,其他容器与之共享volume。
    如下:首先创建一个挂载了volume的数据容器vol_data,该容器仅仅输出一条提示后就停止运行以避免浪费资源;接下来的两个容器与这个数据容器共享这个volume;如此就将需要共享数据的容器进行较好的解耦。
$ sudo docker run --name vol_data -v /data ubuntu echo "data-only"
$ sudo docker run -it --name vol_share1 --volumes-from vol_data ubuntu
$ sudo docker run -it --name vol_share2 --volumes-from vol_data ubuntu

5.删除volume

  • docker volume rm <volume_name>
  • docker rm -v <container_name>
  • 在运行容器时使用docker run --rm,--rm标签会在容器停止运行时删除容器以及容器所挂载的volume

推荐阅读更多精彩内容