如何知道 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 容器中的哪些数据能够正确地将其映射为卷的主要内容,如果未能解决你的问题,请参考以下文章

在 docker 容器中运行到不正确的 chromedriver 版本

使用 VS Code 调试在 Docker 容器中使用 ts-node 运行的 TypeScript 应用程序时,如何能够正确设置断点?

如何确定哪些容器使用 docker 卷?

Docker

你必须知道的容器监控 cAdvisor

为啥要使用docker服