如何知道 docker 容器中的哪些数据能够正确地将其映射为卷
Posted
技术标签:
【中文标题】如何知道 docker 容器中的哪些数据能够正确地将其映射为卷【英文标题】:How to know which data is within a docker container to be able to map it correctly as a volume 【发布时间】:2021-08-15 15:11:29 【问题描述】:我正在尝试安装 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
希望有人能理解我的问题:)
【问题讨论】:
【参考方案1】:以下是演示,以便您更好地理解:
一次之后:
# 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
【讨论】:
非常感谢您的回复!一个可能非常基本的问题。我当前的卷:/mnt/s3fs:/data -> :/data 它是一个命名变量吗?因为docker容器上没有/data。Absolute-path-on-host:Absolute-path-on-container
冒号前的第一部分用于主机端,第二部分用于容器端,这取决于您希望将数据保存在容器外的哪个位置。 :/data
的路径不可变
好吧,还是不明白,我的 docker 文件看起来像这样:volumes: - /localdrive/wiki/data:/data 在文件共享上启动容器后看起来像这样:_ /localdrive/wiki/data -> mysql -> www _ docker 怎么知道 data 里面一定是这两个文件夹?
您必须使用卷内的每个路径来覆盖,您可以在进入 docker chroot 后使用df -h
验证所有安装在 docker 内的内容。首先docker exec -it your-container bash
,然后在容器内df -h
以上是关于如何知道 docker 容器中的哪些数据能够正确地将其映射为卷的主要内容,如果未能解决你的问题,请参考以下文章
vector<vector<float> >的使用方法有哪些?