如何处理docker中的永久存储(例如数据库)

人们如何处理码头集装箱的持久存储? 我目前正在使用这种方法:构建图像,例如Postgres,然后启动容器

docker run --volumes-from c0dbc34fd631 -d app_name/postgres

恕我直言,这有缺点,我不能(无意)删除容器“c0dbc34fd631”。

另一个想法是将主机卷“-v”安装到容器中,然而,在容器内的用户ID并不一定来自主机匹配的用户ID,然后权限可能会混乱。

注意:除了--volumes-from 'cryptic_id'您还可以使用--volumes-from my-data-container ,其中my-data-container是您分配给仅my-data-container的名称,例如docker run --name my-data-container ... (查看接受的答案)


Docker 1.9.0及以上版本

使用卷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连接--volumes-from
  • 新的卷api添加了一个有用的命令,可让您识别悬挂卷:

    docker volume ls -f dangling=true
    

    然后通过它的名字删除它:

    docker volume rm <volume name>
    

    正如@mpugach在评论中强调的那样,你可以用一个漂亮的衬垫去掉所有悬挂的卷:

    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
    
  • 在这里你可以得到一个关于如何安排不同容器的好照片
  • 这里有关于卷如何工作的很好的见解
  • 在这篇博客文章中,有一个很好的容器描述,即容量模式 ,它阐明了只有数据容器的要点。

    Docker文档现在将容器的定义描述定义为volume / s模式。

    以下是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
    

    下面是来自杰出的Brian Goff的一篇很好的文章,解释了为什么在容器和数据容器中使用相同的图像是很好的。


    Docker发行版v1.0中 ,通过给定的命令可以在主机上绑定文件或目录的挂载:

    $ docker run -v /host:/container ...
    

    上面的卷可以用作运行docker的主机上的持久存储。


    从docker-compose 1.6开始,Docker Compose现在已经改进了对数据卷的支持。 以下组合文件将创建一个数据映像,该映像将在父容器的重新启动(甚至删除)之间持续存在:

    这是博客公告:https://blog.docker.com/2016/02/compose-1-6/

    以下是一个撰写文件的例子:

    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:
    

    据我所知:这将创建一个数据卷容器( db_data ),它将在重新启动之间持续存在。

    如果您运行: docker volume ls您应该看到列出的卷:

    local               mypthonapp_db-data
    ...
    

    你可以得到关于数据量的更多细节:

    docker volume inspect mypthonapp_db-data
    [
      {
        "Name": "mypthonapp_db-data",
        "Driver": "local",
        "Mountpoint": "/mnt/sda1/var/lib/docker/volumes/mypthonapp_db-data/_data"
      }
    ]
    

    一些测试:

    # 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). 
    

    笔记:

  • 您还可以在volumes块中指定各种驱动程序。 例如:你可以指定flocker为DB_DATA驱动程序:

    volumes:
      db-data:
        driver: flocker
    
  • 随着他们改进Docker Swarm和Docker Compose之间的集成(并且可能开始将Flocker集成到Docker生态系统中(我听说Docker已经收购Flocker的传言),我认为这种方法应该变得越来越强大。
  • 免责声明:这种方法很有前途,我在开发环境中成功使用它。 我会担心在生产中使用它!

    链接地址: http://www.djcxy.com/p/3005.html

    上一篇: How to deal with persistent storage (e.g. databases) in docker

    下一篇: How does one remove an image in Docker?