Docker:更改存储 docker 卷的文件夹
Posted
技术标签:
【中文标题】Docker:更改存储 docker 卷的文件夹【英文标题】:Docker: change folder where to store docker volumes 【发布时间】:2016-11-18 15:58:37 【问题描述】:在我的Ubuntu EC2
上,我使用 docker 容器托管了一个应用程序。 db
数据和 upload
数据存储在使用此命令创建的卷 CaseBook-data-db
和 CaseBook-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 插件帮助我解决了这个问题。感谢 BMitch 的回答。 【参考方案1】:命名卷将存储在 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 映射往往是使用主机卷最困难的部分。
编辑:从下面的 cmets 中,如果您需要一个作为主机卷的命名卷,那么在 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 中的主机卷,但有以下区别:
如果该目录不存在,尝试使用指向绑定挂载的命名卷启动容器将失败。使用主机卷,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
如果您需要命名卷功能,我的偏好是使用带有本地驱动程序的命名卷,而不是使用本地持久性 3rd 方驱动程序。
【讨论】:
但是有没有办法使用命名卷,但逻辑相同? 不使用默认命名卷,至少据我所知不是。您可以添加支持此功能的其他卷驱动程序,例如 local persist。 这实际上帮助了我并节省了我的时间。谢谢! @ivantalalaev 主机卷是 docker 术语中绑定挂载的另一个名称。 success.docker.com/KBase/Different_Types_of_Volumes @Vinciuz 它被传递给 mount 系统调用。类型表示文件系统类型,例如ext4 或 nfs,但使用绑定挂载,没有类型。【参考方案2】:内置驱动本地的另一种方式:
docker volume create --opt type=none --opt device=/home/ubuntu/data/ --opt o=bind data_db
(此使用 DimonVersace 示例:data_db 在 docker-compose 中声明为外部命名卷,/home/ubuntu/data/ 为主机上的文件夹)
【讨论】:
以上是关于Docker:更改存储 docker 卷的文件夹的主要内容,如果未能解决你的问题,请参考以下文章