Docker:更改文件夹存储泊坞窗卷的位置

时间:2016-07-15 12:28:29

标签: 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存储文件夹?或者有更好的方法来做到这一点?提前谢谢。

2 个答案:

答案 0 :(得分:10)

命名卷将存储在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 compose文件,其中包含以下卷示例:

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

我在过去一个月中了解到的另一个选项是使用本地卷驱动程序的挂载选项手动创建绑定挂载。这与docker中的主机卷类似,但有以下不同之处:

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

要将命名卷创建为绑定装载,可以使用以下命令预先创建:

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 

如果您需要指定的卷功能,我的首选是使用本地驱动程序而不是local-persist第三方驱动程序使用命名卷。

答案 1 :(得分:1)

使用内置驱动程序本地的另一种方法:

docker volume create --opt type=none --opt device=/home/ubuntu/data/ --opt o=bind data_db

(这使用DimonVersace示例: data_db 在docker-compose中声明为外部命名卷, / home / ubuntu / data / 在主机上声明为文件夹)