天天看点

Docker 数据卷

Docker适合许多无状态的服务,对于数据的存储和共享一般是通过数据卷和数据卷容器的方式,这里将介绍Docker数据卷的相关内容。

docker数据卷的实现方式有两种:

1、创建一个数据卷容器。

2、创建一个容器,分配存储空间,让其他容器访问。

数据卷

数据卷可以当作一个特殊的容器。docker的其他容器都可以对他进行访问,类似于NFS。

创建一个数据卷,在容器内部挂载/data:

1

<code>docker run -it --name volume -</code><code>v</code> <code>/data</code> <code>centos</code>

-v 指定挂载一个卷或者容器卷。

在容器中可以看到有一个/data目录:

2

<code>[root@ed9ca073c034 /]</code><code># df -h|grep data</code>

<code>/dev/mapper/centos-root</code>             <code>38G  3.8G   34G  10% </code><code>/data</code>

我们可以通过查看容器的信息,确认容器中/data的所映射的宿主机目录:

3

4

5

6

7

8

9

10

11

12

<code># docker inspect volume|grep  "Mounts" -A 10</code>

<code>        </code><code>"Mounts"</code><code>: [</code>

<code>            </code><code>{</code>

<code>                </code><code>"Name"</code><code>: "0ceaa3d20a99dd152b542b,</code>

<code>                </code><code>"Source"</code><code>: </code><code>"/var/lib/docker/volumes/0ceaa3d20a99dd152b/_data"</code><code>,</code>

<code>                </code><code>"Destination"</code><code>: </code><code>"/data"</code><code>,</code>

<code>                </code><code>"Driver"</code><code>: </code><code>"local"</code><code>,</code>

<code>                </code><code>"Mode"</code><code>: </code><code>""</code><code>,</code>

<code>                </code><code>"RW"</code><code>: </code><code>true</code><code>,</code>

<code>                </code><code>"Propagation"</code><code>: </code><code>""</code>

<code>            </code><code>}</code>

<code>        </code><code>],</code>

在Source 项中,指定了本地的路径/var/lib/docker/volumes/0ceaa/_data,映射到容器中的就是/data目录,在容器的/data目录中写入的数据,在宿主机的此路径一样可以看到,其实相当于是容器挂载的宿主机的某个目录。

使用上面的方式系统会默认使用宿主机/var/lib/docker/volumes这个路径,如果我们想指定一个路径可以使用如下方式:

宿主机创建一个挂载目录:

<code> </code><code>mkdir</code> <code>/docker_volume</code>

创建容器卷,映射宿主机/docker_volume目录到容器的/data目录:

<code>docker run  -it --name volume1 -</code><code>v</code> <code>/docker_volume/</code><code>:</code><code>/data</code> <code>centos</code>

可以指定容器对目录的读写权限:

<code>docker run  -it --name volume1 -</code><code>v</code> <code>/docker_volume/</code><code>:</code><code>/data</code><code>:ro  centos   </code><code>#只读</code>

<code>docker run  -it --name volume1 -</code><code>v</code> <code>/docker_volume/</code><code>:</code><code>/data</code><code>:rw  centos   </code><code>#读写</code>

如果设置为只读状态,尝试对目录文件进行修改时会提示只读:

<code>[root@f7f41d28af31 data]</code><code># touch bb</code>

<code>touch</code><code>: cannot </code><code>touch</code> <code>'bb'</code><code>: Read-only </code><code>file</code> <code>system</code>

也可以对文件进行挂载(不推荐):

<code>docker run  -it --name volume1 -</code><code>v</code> <code>/test</code><code>.log/:</code><code>/test</code><code>.log  centos</code>

容器卷可以不启动,其他容器也能正常访问,只有当所有容器都卸载容器卷磁盘时容器才可以被删除。

访问数据卷容器

数据卷容器就是让一个容器访问另一个容器的卷。

创建一个容器volumeA,访问volume1容器中的/data目录:

<code>docker run -it --name volumeA --volumes-from volume1 centos</code>

查看volumeA中的目录:

<code># df -h|grep data</code>

<code>/dev/mapper/centos-root</code>                  <code>38G  3.8G   34G  10% </code><code>/data</code>

容器就可以共享宿主机的/docker_volume目录中的所有文件了。

提示:如果是通过以上的方式从宿主机映射一个目录到容器中,其他容器通过挂载此容器的方式来访问数据卷,当这个容器停止甚至删除后对其它容器不会有任何影响。

 本文转自 酥心糖 51CTO博客,原文链接:http://blog.51cto.com/tryingstuff/1946241