[关闭]
@maorongrong 2016-10-25T12:52:11.000000Z 字数 1340 阅读 611

docker volumes弄清楚

docker


date: 2016-10-25

摘要: 就是想搞明白,通过-v挂载与删除容器逻辑卷。

Volume可以使用两种方式创建:

随机挂载

命令docker run -v /container/dir随机挂载

Docker会在主机上创建一个目录,默认情况下是在/var/lib/docker下,然后将其挂载到指定的容器路径(/container/dir),当删除使用该Volume的容器时,Volume本身不会受到影响,可以一直保存下去。(NOTE:要彻底删除随机在宿主机创建的目录一定要docker rm -v)。

我们在主机上对/var/lib/docker目录的操作会同步到挂载该目录的容器中。

指定挂载

由命令docker run -v /host/dir:/container/dir指定挂载

由用户直接指定将宿主机目录/host/dir挂载到指定的容器目录/container/dir,NOTE:无论这个/host/dir处于哪个根目录下,其目录权限都是和/container/dir权限保持一致。

指定挂载的主机目录权限问题

NOTE:一般镜像在创建时使用其root用户,所以直接docker run后挂在的/container/dir目录UID:GID都是root的。即使挂载的宿主机上amy用户(sudo权限)家目录下的路径并由amy创建的容器,该家目录下的/host/dir依旧时root:root权限,amy只有只读权限。

解决方法:在创建的容器内,由root/container/dir目录权限更改为你宿主即amy用户的UID:GID

  1. amy@amy-HP:~$ sudo cat /etc/passwd | grep amy
  2. [sudo] amy 的密码:
  3. amy:x:1000:1000:amy,,,:/home/amy:/bin/bash

容器内更改权限:
root@0c74a13e77c9:/# chown 1000:1000 /container/dir

查看宿主机已存在目录:

  1. amy@amy-HP:~$ ll -d vtest
  2. drwxrwxr-x 2 amy amy 4096 10 25 20:36 vtest/
  3. amy@amy-HP:~$ sudo cat /etc/passwd | grep amy
  4. amy:x:1000:1000:amy,,,:/home/amy:/bin/bash

创建容器并查看容器内挂载目录权限:

  1. amy@amy-HP:~$ docker run -ti -v `pwd`/vtest:/test -P java:latest
  2. root@1b857a445b51:/# ll var/
  3. bash: ll: command not found
  4. root@1b857a445b51:/# ls -ld test/
  5. drwxrwxr-x 2 1000 1000 4096 Oct 25 12:36 test/

可见,挂载不存在的主机目录到容器后,最好先将容器对应目录权限改为host用户的UID:GID;
若主机目录已存在,则不需要。

指定主机目录删除容器

对于挂载指定目录不存、和挂载已存在目录启动的容器,最终删除容器docker rm -v也不会删除主机中新建或者已存在的目录。所以,docker rm不加-v参数也可以的。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注