Docker:更改存放泊坞窗卷的文件夹

在我的Ubuntu EC2我使用docker容器托pipe一个应用程序。 db数据和upload数据被存储在使用这个命令创buildCaseBook-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)中。 如果要在特定主机文件夹中创build卷,请使用以下语法使用主机卷:

 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的插件列表 。 安装插件后,您可以创build指向主机文件夹的卷,即使在删除指定的卷之后,主机目录也会被留下。 插件的示例用法包括:

 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 

在过去的一个月中,我已经意识到另一个选项是使用本地卷驱动程序的挂载选项来手动创build绑定挂载。 这与Docker中的主机卷类似,具有以下区别:

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

要创build一个命名卷作为绑定挂载,您可以预先创build它:

 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 

或者在撰写文件中,您可以使用以下命令创build指定的卷:

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

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

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

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

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

使用本地持久docker附加程序帮助我解决了这个问题。 感谢BMitch的回答。