卷(Volume)
众所周知卷(Volume)是容器中的一个数据挂载点,卷可以绕过联合文件系统,从而为Docker 提供持久数据,所提供的数据还可以在宿主机-容器或多个容器之间共享。通过卷,我们可以可以使修改数据直接生效,而不必重新构建镜像。
一、数据卷
数据卷是一个可以绕过联合文件系统的,专门指定的可在一或多个容器间共享目录。卷为提供为持久化或共享数据提供了一些有用的特性。
数据卷设计的初哀是提供持久化数据,而与容器的生命周期无关。因此,在删除容器时,Docker不会自动删除卷,直到没有容器再引用。
1.1 添加数据卷
可以在docker create
和docker create
命令创建容器时,通过-v参数为容器添加数据卷。-v参数参数可以多次使用,以添加多个数据卷。
如,可以像下面这样为容器添加一个卷:
$ sudo docker run -t -i -v /home/test --name test itbilu/test /bin/bash
这样就会在容器内/webapp位置创建一个卷。
除了在创建容器时添加数据卷外,还可以通过Dockerfile文件中通过Volume指令添加,Volume可以多次使用以添加多个数据卷。
说明:本文中使用的示例镜像(itbilu/test)通过以下Dockerfile文件创建:
# Version: 0.0.3FROM ubuntu:16.04MAINTAINER 何民三 "cn.liuht@gmail.com"RUN apt-get updateRUN apt-get install -y nginxRUN echo 'Hello World, 我是个容器' / > /var/www/html/index.htmlRUN mkdir /home/itbilu/ENV ITBILU_PATH /home/itbilu/VOLUME [$ITBILU_PATH]EXPOSE 80
1.2 卷位置
添加卷后,可以通过docker inspect
来查看数据卷在容器中的位置:
$ sudo docker inspect test
docker inspect
可以用来查看容器或镜像的详细配置信息。可以在容器的Mounts节点下,查看容器的卷信息:
..."Mounts": [{ "Type": "volume", "Name": "5f869c580c06e6079b0de2c5ce682c1c9467286c76b506703d87bf11d1271c24", "Source": "/var/lib/docker/volumes/5f869c580c06e6079b0de2c5ce682c1c9467286c76b506703d87bf11d1271c24/_data", "Destination": "/home/test", "Driver": "local", "Mode": "", "RW": true, "Propagation": ""},{ "Type": "volume", "Name": "e4fd6c3a91ba2e03b14cf174c2023f366abbe9f2f73ca07e6bac223f68e47773", "Source": "/var/lib/docker/volumes/e4fd6c3a91ba2e03b14cf174c2023f366abbe9f2f73ca07e6bac223f68e47773/_data", "Destination": "[/home/itbilu/]", "Driver": "local", "Mode": "", "RW": true, "Propagation": ""}],...
在以上示例中,有两个挂载卷,一个是在docker run
创建容器时创建的,而另一个是在创建运行容器镜像的Dockerfile文件中通过VOLUME指令创建。其中,Source表示宿主机源文件位置,Destination表示数据卷在容器中的挂载位置,而RW表示卷是否可读/写。
1.3 挂载本地数据到容器数据卷
在前面示例中,我们运行容器时并没有指定要挂载到容器中数据卷的本地目录,所在Docker使用一个默认数据目录。 -v
参数除了可以在容器中创建数据卷外,还可以将宿主机中的目录挂载到容器中的数据卷。
如,运行容器,并将本地的~/code/itbilu目录挂载到容器的/home/itbilu数据卷上:
$ sudo docker run -t -i -v ~/code/itbilu:/home/itbilu --name test itbilu/test /bin/bas
新闻热点
疑难解答