这一节介绍如何在 Docker 内部以及容器之间管理数据,在容器中管理数据主要有两种⽅式:
① 数据卷(Data Volumes)
② 挂载主机目录 (Bind mounts)
目录
1️⃣数据卷
2️⃣挂载主机目录
数据卷 是⼀个可供⼀个或多个容器使⽤的特殊⽬录,它绕过 UFS ,可以提供很多有⽤的特性:
1.数据卷 可以在容器之间共享和重⽤
2.对 数据卷 的修改会⽴⻢⽣效
3.对 数据卷 的更新,不会影响镜像
4.数据卷 默认会⼀直存在,即使容器被删除
注意:数据卷 的使⽤,类似于 Linux 下对⽬录或⽂件进⾏ mount,镜像中的被指定为挂载点的⽬ 录中的⽂件会隐藏掉,能显示看的是挂载的 数据卷。
选择 -v 还是 -–mount 参数: Docker 新⽤户应该选择 --mount 参数,经验丰富的 Docker 使⽤者对 - v 或者 --volume 已经很熟悉了,但是推荐使⽤ --mount 参数。
创建一个数据卷:
$ docker volume create my-vol
查看所有的数据卷:
$ docker volume ls
local my-vol
在主机里使用以下命令可以查看指定数据卷的信息:
$ docker volume inspect my-vol
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]
启动⼀个挂载数据卷的容器:在⽤ docker run 命令的时候,使⽤ --mount 标记来将 数据卷 挂载到容 器⾥。在⼀次 docker run 中可以挂载多个 数据卷。下⾯创建⼀个名为 web 的容器,并加载⼀个 数据 卷 到容器的 /webapp ⽬录。
$ docker run -d -P \
--name web \
# -v my-vol:/wepapp \
--mount source=my-vol,target=/webapp \
training/webapp \
python app.py
查看数据卷的具体信息:在主机⾥使⽤以下命令可以查看 web 容器的信息:
$ docker inspect web
...
"Mounts": [
{
"Type": "volume",
"Name": "my-vol",
"Source": "/var/lib/docker/volumes/my-vol/_data",
"Destination": "/app",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
...
删除数据卷:
$ docker volume rm my-vol
数据卷 是被设计⽤来持久化数据的,它的⽣命周期独⽴于容器,Docker 不会在容器被删除后⾃动删除 数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引⽤的 数据卷。如果需要在删除容器 的同时移除数据卷。可以在删除容器的时候使⽤ docker rm -v 这个命令。 ⽆主的数据卷可能会占据 很多空间,要清理请使⽤以下命令
$ docker volume prune
选择 -v 还是 -–mount 参数: Docker 新⽤户应该选择 --mount 参数,经验丰富的 Docker 使⽤者对 -v 或者 --volume 已经很熟悉了,但是推荐使⽤ --mount 参数。
挂载⼀个主机⽬录作为数据卷:使⽤ --mount 标记可以指定挂载⼀个本地主机的⽬录到容器中去。
$ docker run -d -P \
--name web \
# -v /src/webapp:/opt/webapp \
--mount type=bind,source=/src/webapp,target=/opt/webapp \
training/webapp \
python app.py
上⾯的命令加载主机的 /src/webapp ⽬录到容器的 /opt/webapp⽬录。这个功能在进⾏测试的时候⼗分 ⽅便,⽐如⽤户可以放置⼀些程序到本地⽬录中,来查看容器是否正常⼯作。本地⽬录的路径必须是 绝对路径,以前使⽤ -v 参数时如果本地⽬录不存在 Docker 会⾃动为你创建⼀个⽂件夹,现在使⽤ -- mount 参数时如果本地⽬录不存在,Docker 会报错。
Docker 挂载主机⽬录的默认权限是 读写,⽤户也可以通过增加 readonly 指定为 只读。
$ docker run -d -P \
--name web \
# -v /src/webapp:/opt/webapp:ro \
--mount type=bind,source=/src/webapp,target=/opt/webapp,readonly \
training/webapp \
python app.py
加了 readonly 之后,就挂载为 只读 了。如果你在容器内 /opt/webapp ⽬录新建⽂件,会显示如下错误:
/opt/webapp # touch new.txt
touch: new.txt: Read-only file system
查看数据卷的具体信息:在主机⾥使⽤以下命令可以查看 web 容器的信息
$ docker inspect web
...
"Mounts": [
{
"Type": "bind",
"Source": "/src/webapp",
"Destination": "/opt/webapp",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
挂载⼀个本地主机⽂件作为数据卷: --mount 标记也可以从主机挂载单个⽂件到容器中
$ docker run --rm -it \
# -v $HOME/.bash_history:/root/.bash_history \
--mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history \
ubuntu:17.10 \
bash
root@2affd44b4667:/# history
1 ls
2 diskutil list
这样就可以记录在容器输入过的命令了。