docker - 如何知道 docker 容器中的哪些数据能够正确地将其映射为卷
问题描述
我正在尝试安装 bluespice wiki 并希望将数据保留在容器之外。 https://hub.docker.com/r/bluespice/bluespice-free
为了在我的主机上节省一些空间,我想将一些数据放在 S3 存储上。据我了解,wiki 的开发人员将所有服务直接包含在容器中(Web 服务器等)
所以我的想法是让主机上的重要数据(例如网络服务器)和 S3 上的实际文件(图片、视频、帖子)。这是可以实现的吗?如果是这样,我将如何最好地解决这个问题?目前我不明白我如何知道正确的路径。
我的 docker-compose 文件目前看起来像这样:
services:
bluespice:
container_name: Bluespice-Wiki
image: bluespice/bluespice-free:3.2
command: -H unix:///var/run/docker.sock
restart: always
volumes:
- /mnt/s3fs:/data
这会将所有数据放在 3s 存储上,这真的很慢,而且可能也不聪明。所以我的理解是创建这样的东西:
volumes:
- <localshare>:/data/webserver
- <s3share>:/data/www/datafiles
希望有人理解我的问题:)
解决方案
下面是演示,以便您更好地理解:
一次之后:
# docker-compose up -d
您可以使用以下任何方法来了解可用的容器卷:
# docker inspect -f '{{ .Mounts }}' <your-container-id-or-name>
# docker inspect <your-container-id-or-name> | jq --raw-output .[].Mounts
例如我有 mariadb 容器:
root@sys:/home/akshay/Documents/test2# docker inspect 00f70198a466 | jq --raw-output .[].Mounts
[
{
"Type": "volume",
"Name": "2a583fc243a9a2bb80cf45a80e5befbdc88db3b14026ff2349f80345f58c9562",
"Source": "/var/lib/docker/volumes/2a583fc243a9a2bb80cf45a80e5befbdc88db3b14026ff2349f80345f58c9562/_data",
"Destination": "/var/lib/mysql",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
在这里,您可以看到Source:
主机上的实际路径,以及Destination:
容器内的绝对路径。
现在说,例如,如果您希望存储在云上,首先停止您的容器,将您的外部存储安装在主机上,Source:
如果需要,移动/复制内容。
然后在卷中你只需要设置路径,例如
# creating local directory
# mkdir mysql-data
# copying contents whatever in volume
# cp -r /var/lib/docker/volumes/2a583fc243a9a2bb80cf45a80e5befbdc88db3b14026ff2349f80345f58c9562/_data mysql-data
# we copied data to directory of our interest
# instead of keeping in /var/lib/docker/volumes/...../_data
docker-compose down
在你的 docker-compose.yml 里面
volumes:
# local mount
- "./mysql-data:/var/lib/mysql"
# path to your remote storage ex: upload directory
- "/path/where/s3-bucket/mounted:/var/www/somesite/uploads/"
接着
# now we refer volumes in local directory
docker-compose up -d
如果没有可用的卷,则只需输入您的容器,如下所示,并找出您想要将数据保存在容器外的目录的绝对路径。
# with bash
# docker exec -it <your-container-id-or-name> bash
# or with shell
# docker exec -it <your-container-id-or-name> sh
# and then browser folders
# for example
root@sys:~# docker exec -it 00f70198a466 bash
root@00f70198a466:/# pwd
/
root@00f70198a466:/# ls
bin boot dev docker-entrypoint-initdb.d etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
root@00f70198a466:/# cd /var/lib/mysql/
root@00f70198a466:/var/lib/mysql# pwd
/var/lib/mysql
推荐阅读
- subdomain - 在 Segment 上禁用子域跟踪
- javascript - 使用 lodash(或等效)_.get() 函数通过引用而不是值获取对象
- python - 如何制作一个可以下载目录文件的 Python HTTP 服务器
- rust - 你如何定义一个可以接受 Vec 或任何可以迭代的函数参数?
- database - 将大型 csv ( 200+ GB ) 数据从 HDFS 加载到 Teradata 的最佳方法?
- javascript - 护照 - 发送后无法设置标题
- selenium - 使用 Selenium——如何在特定列中迭代 Trello 卡片?
- firebase - Firebase 身份验证自定义 URL - 删除 api 密钥
- ios - 注释框架的iOS注释字典值中的PDFKit返回NSRect
- c++ - “扩展初始化列表仅适用于 -std=c++11 或 -std=gnu++11”,我收到此错误