Docker 1.9.0 及以上版本
使用volume API
docker volume create --name hello
docker run -d -v hello:/container/path/for/volume container_image my_command
这意味着必须放弃纯数据容器模式以支持新卷。
实际上,volume API 只是实现数据容器模式的更好方法。
如果您使用-v volume_name:/container/fs/path 创建一个容器,Docker 会自动为您创建一个命名卷,它可以:
- 通过
docker volume ls列出
- 通过
docker volume inspect volume_name识别
- 作为普通目录备份
- 通过
--volumes-from 连接像以前一样备份
新的卷 API 添加了一个有用的命令,可让您识别悬空卷:
docker volume ls -f dangling=true
然后通过它的名字删除它:
docker volume rm <volume name>
正如@mpugach 在 cmets 中强调的那样,您可以用一个漂亮的单线摆脱所有悬空的卷:
docker volume rm $(docker volume ls -f dangling=true -q)
# Or using 1.13.x
docker volume prune
Docker 1.8.x 及以下版本
似乎最适合生产的方法是使用仅数据容器。
仅数据容器在准系统映像上运行,实际上除了暴露数据卷之外什么都不做。
然后您可以运行任何其他容器来访问数据容器卷:
docker run --volumes-from data-container some-other-container command-to-execute
-
Here你可以很好地了解如何排列不同的容器。
-
Here 可以很好地了解卷的工作原理。
在this blog post 中有一个很好的描述所谓的container as volume pattern,它阐明了data only containers的要点。
Docker documentation has now the DEFINITIVE description of the container as volume/s pattern.
以下是 Docker 1.8.x 及以下版本的备份/恢复过程。
备份:
sudo docker run --rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
- --rm:容器退出时移除容器
- --volumes-from DATA:附加到 DATA 容器共享的卷
- -v $(pwd):/backup:绑定挂载当前目录到容器中;将 tar 文件写入
- busybox:一个小而简单的图像 - 适合快速维护
- tar cvf /backup/backup.tar /data:为/data目录下的所有文件创建一个未压缩的tar文件
恢复:
# Create a new data container
$ sudo docker run -v /data -name DATA2 busybox true
# untar the backup files into the new container᾿s data volume
$ sudo docker run --rm --volumes-from DATA2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
data/
data/sven.txt
# Compare to the original container
$ sudo docker run --rm --volumes-from DATA -v `pwd`:/backup busybox ls /data
sven.txt
这是一个很好的article from the excellent Brian Goff,解释了为什么对容器和数据容器使用相同的图像是好的。