数据卷(Data Volumes)
之前我们了解到 Container 仅包含镜像文件部分,对于进程运行的数据或可变的数据我们存在数据卷中,Docker 提供了两种形式数据管理:
- 数据卷 (Data Volumes)
- 数据卷容器 (Data Volumes Containers)
数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 数据卷默认会一直存在,即使容器被删除
简单的来说,卷就是将宿主机中的某个目录 mount 到容器中,这样在容器中修改了此目录下的内容即使容器关闭后数据也会保留下来。数据卷主要是为容器提供了一种数据持久化和共享文件夹。
创建数据卷
在用 docker run
命令的时候,可以使用 -v 标记来创建一个数据卷并挂载到容器在中。
我们也可以通过多次使用 -v
命令来指定多个挂载的文件到容器中,也可以让多个容器指定相同的宿主机目录达到共享目的。
Docker 挂载数据卷的默认权限是读写,用户也可以通过 :or
指定为只读。
也可以在 Dockerfile 中使用 VOLUMES 来添加一个或多个新的卷到由该镜像创建的任意容器。
docker run -d -P --name web -v /webapp training/webapp python app.py
挂载后我们可以通过 docker inspect
来查看容器的挂载数据卷的配置信息。
"Mounts": [
{
"Type": "volume",
"Name": "151d0b6ff7c37952155f932ddd524b14a5d63f86a9e7f870735984a07a6d5473",
"Source": "/var/lib/docker/volumes/151d0b6ff7c37952155f932ddd524b14a5d63f86a9e7f870735984a07a6d5473/_data",
"Destination": "/webapp",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
删除数据卷
数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v
这个命令。
挂载一个主机目录作为数据卷
docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
上面的意思是把宿主机的 /src/webapp
目录挂载到容器的 /opt/webapp
。这个功能在进行测试的时候十分方便,比如用户可以放置一些程序到本地目录中,来查看容器是否正常工作。本地目录的路径必须是绝对路径,如果目录不存在 Docker 会自动创建它。
挂载一个本地主机文件作为数据卷
docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
我们也可以指定单个文件挂载到容器中,这样可以对该文件进行操作。
数据卷容器
如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。
数据卷容器其实就是一个正常的容器,专门用来提供数据卷供其他容器挂载的。
docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres
然后在其他容器中使用 --volumes-from
来挂载 dbdata 容器中的数据卷。也可以指定多个 --volumes-from
来挂载不同的数据卷。
docker run -d --volumes-from dbdata --name db1 training/postgres
docker run -d --volumes-from dbdata --name db2 training/postgres