mongodb - Docker:更改存储 docker 卷的文件夹

标签 mongodb amazon-ec2 docker ubuntu-14.04 volumes

在我的 Ubuntu EC2 上,我托管了一个使用 docker 容器的应用程序。 db 数据和 upload 数据存储在卷 CaseBook-data-dbCaseBook-data-uploads 中正在使用此命令创建:

docker volume create --name=CaseBook-data-db
docker volume create --name=CaseBook-data-uploads

通过 docker-compose 文件附加的卷:

version: '2'
services:
    mongo:
        container_name: "CaseBook-db"
        restart: always
        image: mongo:3.2.7
        ports:
            - "27017"
        volumes:
            - data_db:/data/db
        labels:
            - "ENVIRONMENT_TYPE=meteor"

    app:
        container_name: "CaseBook-app"
        restart: always
        image: "meteor/casebook"
        build: .
        depends_on:
            - mongo
        environment:
            - MONGO_URL=mongodb://mongo:27017/CaseBook
        ports:
            - "80:3000"
        volumes:
            - data_uploads:/Meteor-CaseBook-Container/.uploads
        labels:
            - "ENVIRONMENT_TYPE=meteor"
volumes:
     data_db:
        external:
            name: CaseBook-data-db
     data_uploads:
        external:
            name: CaseBook-data-uploads

我需要将这些 docker 卷存储在主机的不同文件夹中(例如 /home/ubuntu/data/)。如何更改卷的 docker 存储文件夹?或者有更好的方法吗?提前谢谢你。

最佳答案

命名卷将存储在 docker 的文件夹 (/var/lib/docker) 中。如果要在特定主机文件夹中创建卷,请使用具有以下语法的主机卷:

docker run -v /home/ubuntu/data/app-data:/app-data my-image

或从您的撰写文件:

version: '2'
services:
    mongo:
        container_name: "CaseBook-db"
        restart: always
        image: mongo:3.2.7
        ports:
            - "27017"
        volumes:
            - /home/ubuntu/data/db:/data/db
        labels:
            - "ENVIRONMENT_TYPE=meteor"

    app:
        container_name: "CaseBook-app"
        restart: always
        image: "meteor/casebook"
        build: .
        depends_on:
            - mongo
        environment:
            - MONGO_URL=mongodb://mongo:27017/CaseBook
        ports:
            - "80:3000"
        volumes:
            - /home/ubuntu/data/uploads:/Meteor-CaseBook-Container/.uploads
        labels:
            - "ENVIRONMENT_TYPE=meteor"

对于主机卷,镜像中卷的任何内容都将被主机文件夹的确切内容覆盖,包括主机文件夹的 UID。空主机文件夹不会像空命名卷那样从镜像中初始化。 UID 映射往往是使用主机卷最困难的部分。


编辑:根据下面的评论,如果您需要一个命名卷作为主机卷,则有一个 local persist volume plugin列在 docker's plugin list 上.安装插件后,您可以创建指向主机文件夹的卷,其特点是即使在删除命名卷后,主机目录仍然存在。插件的示例用法包括:

docker volume create -d local-persist -o mountpoint=/data/images --name=images
docker run -d -v images:/path/to/images/on/one/ one
docker run -d -v images:/path/to/images/on/two/ two

它们还包含一个带有以下卷示例的 v2 组合文件:

volumes:
  data:
    driver: local-persist
    driver_opts:
      mountpoint: /data/local-persist/data

我在过去一个月中了解到的一个附加选项是使用本地卷驱动程序的挂载选项手动创建绑定(bind)挂载。这类似于 docker 中的主机卷,但有以下区别:

  • 如果该目录不存在,则尝试启动一个容器并使用指向绑定(bind)安装的命名卷将失败。对于主机卷,docker 会将其初始化为 root 拥有的空目录。
  • 如果目录为空,命名卷将使用挂载位置的镜像内容初始化绑定(bind)挂载,包括文件和目录所有权/权限。对于主机卷,主机目录内容没有初始化。

要创建命名卷作为绑定(bind)挂载,您可以提前创建它:

docker volume create --driver local \
  --opt type=none \
  --opt device=/home/user/test \
  --opt o=bind \
  test_vol

docker run 命令中,这可以通过 --mount 完成:

docker run -it --rm \
    --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=/home/user/test \
    foo

或者在撰写文件中,您可以创建命名卷:

volumes:
  data:
    driver: local
    driver_opts:
      type: none
      o: bind 
      device: /home/user/test 

如果您需要命名卷功能,我的偏好是将命名卷与本地驱动程序一起使用,而不是使用本地持久性第 3 方驱动程序。

关于mongodb - Docker:更改存储 docker 卷的文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38396139/

相关文章:

mongodb - Logstash + MongoDB Atlas 输出 : Failed to handshake with xxx. gcp.mongodb.net :27017: ArgumentError: wrong number of arguments (given 2, 预期 1)

amazon-web-services - ECS 服务的基于路径的路由不起作用

linux - Tensorflow 服务 Git 存储库过时了吗? Tensorflow 文件夹不存在

Docker - 需要特定的 docker 服务版本

android - 我应该直接访问mongodb吗?

mongodb - 多个单一集合数据库,还是具有多个集合的数据库?

java - 为使用 Selenium 网络驱动程序的网络应用程序选择云计算服务

amazon-ec2 - 我需要亚马逊的 EC2、Cloudfront、RDS 吗?

mongodb - 使用 docker-compose 将 mongodb 保存在卷上

mongodb - 限制 MongoDB 数据库大小?