Как узнать, какие данные находятся в контейнере docker, чтобы правильно отобразить их в виде тома

#docker #docker-compose #bluespice

Вопрос:

Я пытаюсь установить bluespice wiki и хотел сохранить данные за пределами контейнера. https://hub.docker.com/r/bluespice/bluespice-free

Чтобы сэкономить место на моем хосте, я хотел поместить некоторые данные в хранилище S3. Насколько я понял, у разработчика вики есть все сервисы непосредственно в контейнере (веб-сервер и т.д.)

Поэтому моя идея состояла бы в том, чтобы иметь важные данные (например, веб-сервер) на хосте и фактические файлы (фотографии, видео, сообщения) на 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
 

внутри вашего докера-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
 

Комментарии:

1. большое вам спасибо за ваш ответ! Один, вероятно, очень простой вопрос. Мой текущий том: /mnt/s3fs:/данные -> :/данные это именованная переменная? Потому что в контейнере docker нет /данных.

2. Absolute-path-on-host:Absolute-path-on-container первая часть перед двоеточием предназначена для стороны хоста, а вторая часть-для стороны контейнера, это зависит от того, в каком месте вы хотите сохранить данные за пределами контейнера. :/data не является переменной его путь

3. ладно, все равно не поймешь, мой докер файл выглядит следующим образом: объемы: — /каталог локальный_диск/Вики/сведения:/данные после запуска контейнера на файлообменники это выглядит так: _ /каталог локальный_диск/Вики/данные для MySQL -> ВСП _ как же докер знаю, что в данных должны быть эти две папки?

4. Вы должны использовать каждый путь внутри томов для переопределения, вы можете проверить, что все смонтировано внутри docker, используя df -h после входа в docker chroot. Сначала docker exec -it your-container bash , а затем внутри контейнера df -h