juw*_*ter 969 docker docker-container
人们如何处理Docker容器的持久存储?
我目前正在使用这种方法:构建映像,例如PostgreSQL,然后启动容器
docker run --volumes-from c0dbc34fd631 -d app_name/postgres
Run Code Online (Sandbox Code Playgroud)
恕我直言,有缺点,我不能(偶然)删除容器"c0dbc34fd631".
另一个想法是将主机卷"-v"安装到容器中,但是,用户ID的容器内不一定匹配用户ID从主机,然后权限可能会混乱.
注:与其--volumes-from 'cryptic_id'你也可以使用--volumes-from my-data-container这里my-data-container是你分配到纯数据容器,如姓名docker run --name my-data-container ...(见接受的答案)
tom*_*sop 969
docker volume create --name hello
docker run -d -v hello:/container/path/for/volume container_image my_command
Run Code Online (Sandbox Code Playgroud)
这意味着必须放弃仅数据容器模式以支持新卷.
实际上,卷API只是实现数据容器模式的更好方法.
如果您使用-v volume_name:/container/fs/pathDocker 创建容器,则会自动为您创建一个命名卷,该卷可以:
docker volume lsdocker volume inspect volume_name--volumes-from连接备份新的卷API添加了一个有用的命令,可以识别悬空卷:
docker volume ls -f dangling=true
Run Code Online (Sandbox Code Playgroud)
然后通过其名称删除它:
docker volume rm <volume name>
Run Code Online (Sandbox Code Playgroud)
正如@mpugach在评论中强调的那样,你可以用一个漂亮的单行代码摆脱所有悬空音量:
docker volume rm $(docker volume ls -f dangling=true -q)
# Or using 1.13.x
docker volume prune
Run Code Online (Sandbox Code Playgroud)
似乎最适合生产的方法是使用仅数据容器.
仅数据容器在准系统映像上运行,除了暴露数据卷之外实际上什么都不做.
然后,您可以运行任何其他容器来访问数据容器卷:
docker run --volumes-from data-container some-other-container command-to-execute
Run Code Online (Sandbox Code Playgroud)
在这篇博文中,有一个很好的描述所谓的容量作为卷模式,它阐明了仅拥有数据容器的要点.
Docker文档现在将容器的DEFINITIVE描述为volume/s模式.
以下是Docker 1.8.x及更低版本的备份/恢复过程.
备份:
sudo docker run --rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
Run Code Online (Sandbox Code Playgroud)
恢复:
# 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
Run Code Online (Sandbox Code Playgroud)
这是来自优秀的Brian Goff的一篇很好的文章,解释了为什么对容器和数据容器使用相同的图像是好的.
ami*_*ula 71
在Docker发行版v1.0中,可以通过给定的命令在主机上绑定文件或目录的安装:
$ docker run -v /host:/container ...
Run Code Online (Sandbox Code Playgroud)
上述卷可以用作运行Docker的主机上的持久存储.
toa*_*oza 31
从Docker Compose 1.6开始,Docker Compose现在改进了对数据量的支持.以下撰写文件将创建一个数据映像,该映像将在父容器的重新启动(甚至删除)之间保持不变:
以下是博客公告:Compose 1.6:New Compose文件,用于定义网络和卷
这是一个组合文件的示例:
version: "2"
services:
db:
restart: on-failure:10
image: postgres:9.4
volumes:
- "db-data:/var/lib/postgresql/data"
web:
restart: on-failure:10
build: .
command: gunicorn mypythonapp.wsgi:application -b :8000 --reload
volumes:
- .:/code
ports:
- "8000:8000"
links:
- db
volumes:
db-data:
Run Code Online (Sandbox Code Playgroud)
据我所知:这将创建一个数据卷容器(db_data),它将在重新启动之间保持不变.
如果您运行:docker volume ls您应该看到您的卷列出:
local mypthonapp_db-data
...
Run Code Online (Sandbox Code Playgroud)
您可以获得有关数据量的更多详细信息:
docker volume inspect mypthonapp_db-data
[
{
"Name": "mypthonapp_db-data",
"Driver": "local",
"Mountpoint": "/mnt/sda1/var/lib/docker/volumes/mypthonapp_db-data/_data"
}
]
Run Code Online (Sandbox Code Playgroud)
一些测试:
# Start the containers
docker-compose up -d
# .. input some data into the database
docker-compose run --rm web python manage.py migrate
docker-compose run --rm web python manage.py createsuperuser
...
# Stop and remove the containers:
docker-compose stop
docker-compose rm -f
# Start it back up again
docker-compose up -d
# Verify the data is still there
...
(it is)
# Stop and remove with the -v (volumes) tag:
docker-compose stop
docker=compose rm -f -v
# Up again ..
docker-compose up -d
# Check the data is still there:
...
(it is).
Run Code Online (Sandbox Code Playgroud)
笔记:
您还可以在volumes块中指定各种驱动程序.例如,您可以为db_data指定Flocker驱动程序:
volumes:
db-data:
driver: flocker
Run Code Online (Sandbox Code Playgroud)免责声明:这种方法很有前景,我在开发环境中成功使用它.我还是很担心在生产中使用它!
ben*_*kly 17
如果从所选答案的更新5中不清楚,从Docker 1.9开始,您可以创建可以存在但不与特定容器关联的卷,从而使"仅数据容器"模式过时.
请参阅使用docker 1.9.0过时的仅限数据的容器?#17798.
我认为Docker维护者意识到仅数据容器模式有点像设计气味,并决定使卷成为一个独立的实体,可以在没有相关容器的情况下存在.
Tim*_*orr 13
虽然这仍然是Docker的一部分需要一些工作,但您应该使用VOLUME指令将卷放在Dockerfile中,这样您就不需要从另一个容器中复制卷.
这将使您的容器减少相互依赖,并且您不必担心删除一个影响另一个容器的容器.
Cza*_*ino 12
使用Docker Compose时,只需附加一个命名卷,例如,
version: '2'
services:
db:
image: mysql:5.6
volumes:
- db_data:/var/lib/mysql:rw
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
db_data:
Run Code Online (Sandbox Code Playgroud)
@ tommasop的答案很好,并解释了使用仅数据容器的一些机制.但是,有人最初认为数据容器是愚蠢的,当一个人可以将卷装入主机(如其他几个答案所示),但现在意识到实际上只有数据的容器非常整洁,我可以建议我自己关于此主题的博客文章:为什么Docker数据容器(卷!)是好的
另请参阅:我对" 管理Docker共享卷权限的最佳方法是什么? " 这一问题的回答,以获取如何使用数据容器来避免诸如权限和与主机的uid/gid映射之类的问题的示例.
解决OP的一个原始问题:不得删除数据容器.即使删除了数据容器,只要任何容器具有对该卷的引用,即任何通过该卷安装卷的容器,数据本身都不会丢失--volumes-from.因此,除非停止并删除所有相关容器(可以认为这相当于意外rm -fr /),否则数据是安全的.您始终可以通过执行--volumes-from任何具有该卷引用的容器来重新创建数据容器.
一如既往,尽管做备份!
更新:Docker现在拥有可以独立于容器进行管理的卷,这使得这更容易管理.
管理持久性数据有多个级别,具体取决于您的需求:
-v host-path:container-path将容器目录数据持久保存到主机目录.--volumes-from将该数据装入应用程序容器.这取决于您的场景(这不适合生产环境),但这是一种方式:
它的要点是使用主机上的目录来实现数据持久性.
| 归档时间: |
|
| 查看次数: |
277272 次 |
| 最近记录: |