2016-07-15 182 views
2

在我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 

我需要存储那些搬运工卷主机的不同文件夹(例如/home/ubuntu/data/)。如何更改容器的码头存储文件夹?或者有更好的方法来做到这一点?先谢谢你。

回答

-1

使用本地坚持码头附加组件帮助我解决了这个问题。感谢BMitch的回答。

7

命名卷将被储存码头工人的文件夹(在/ var/lib中/泊坞窗)内。如果你想创建一个特定的主机文件夹的卷,使用主机体积的语法如下:

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映射往往是使用主机卷最困难的部分。


编辑:从下面的评论,如果你需要一个名为卷充当主机的体积,有可能对docker's plugin list上市local persist volume plugin。安装插件后,您可以创建指向主机文件夹的卷,即使在删除指定的卷之后,主机目录也会留下。从插件使用范例包括:

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 

,我已经在已取得的认识的一个附加选项过去的一个月是使用本地卷驱动程序的挂载选项来手动创建绑定挂载。这类似于搬运工主机卷有以下区别:

  • 如果该目录不存在,试图启动一个容器名为量指着一个绑定安装会失败。通过主机卷,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 

如果您需要命名的卷功能,我的首选是使用带有本地驱动程序的命名卷,而不是本地持久性第三方驱动程序。

+0

但有没有办法使用命名卷,但具有相同的逻辑? – DimonVersace

+1

不适用于默认的命名卷,至少不是我所知。您可以添加其他音量驱动程序,例如[local persist](https://github.com/CWSpear/local-persist),以支持此功能。 – BMitch

+1

这实际上帮助我,节省了我的时间。谢谢! – DimonVersace

0

内建驱动当地另一种方式:

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

(此使用DimonVersace例如有:data_db声明为码头工人,撰写和/家庭/ Ubuntu的外部命名为音量/数据/作为主机上的文件夹)