Docker, Volumes vs Bind Mounts для постоянных данных, таких как БД, elasticsearch?

объем данных докера и смонтированный каталог хоста

говорит, что volumes следует предпочесть bind mounts

У меня есть несколько вопросов по теме. В сообщении говорится:

When you create a volume, it is stored within a directory on the Docker host

Потерпите меня, но я новичок в докере, и мне интересно, что здесь docker host.

Это машина, на которой я создаю образ (вероятно, нет)?
Это машина, на которой будет запускаться образ? Если это так, что произойдет, если я запущу образ на нескольких машинах, создаст ли он два независимых тома?
Если у меня есть настройки developement и production, как docker управляет двумя отдельными томами для каждой среды?

Кроме того, кажется, что довольно легко потерять данные, выполняя docker-compose down, когда я использую тома данных, это первое препятствие, которое заставляет меня сомневаться в использовании data volumes, есть ли очевидное решение для смягчения проблемы?


person eugene    schedule 04.02.2019    source источник


Ответы (1)


На самом деле это не доктрина - не использовать привязку. Да, они могут повредить файловую систему вашего хоста, если будут смонтированы неточно (например, -v /bin:/var/log), если по умолчанию у вас есть привилегии root внутри контейнера; также они менее переносимы, но облегчают обмен файлами между хостом и контейнером. Когда вы хотите предоставить первоначальную конфигурацию для своей службы или поместить исходный код для компиляции в контейнер, я полагаю, что вы предпочтете bind mount вместо создания и запуска временного контейнера для docker volume cp операций. Кроме того, вы всегда должны использовать параметр :ro, когда это возможно (только для чтения), чтобы предотвратить изменение данных внутри контейнера.

Хост Docker — это машина (ПК), на которой запущен демон Docker.

Это машина, на которой я создаю образ (вероятно, нет)?

Не правда. Вы можете строить с помощью docker CLI или docker API удаленно.

Это машина, на которой будет запускаться образ?

Да, изображения управляются демоном докеров, и поэтому он будет хостом.

Если это так, что произойдет, если я запущу образ на нескольких машинах, создаст ли он два независимых тома?

Это зависит. Запускать образы на разных машинах можно по-разному, начиная с оркестраторов вроде kubernetes или docker swarm и заканчивая ручным запуском на отдельных демонах докеров. С оркестраторами можно иметь один и тот же том, разделенный между разными хостами, но в этом случае вы не можете использовать bind mounts, вы используете volumes.

Когда у меня есть настройка для разработки и производства, как докер управляет двумя отдельными томами для каждой среды?

Докер не управляет вами.

Кроме того, кажется, что довольно легко потерять данные, выполнив docker-compose down, когда я использую тома данных, это первое препятствие, которое заставляет меня колебаться при использовании томов данных, есть ли очевидное решение для смягчения проблемы?

Объемы могут легко сохраняться между сеансами docker-compose. Самый явный способ добиться этого — заранее объявить том с помощью

docker volume create foo

а затем используйте его в своих файлах компоновки:

version: '3'
services:
  abc:
    volumes:
      foo:/foo
volumes:
  foo:
    external: true
person grapes    schedule 04.02.2019
comment
Вы подразумеваете, что том, созданный docker volume create foo, не удаляется, если вы явно не удалите каким-либо delete or remove command, что маловероятно при обычном использовании docker/docker-compose? - person eugene; 04.02.2019
comment
Точно, он будет жить до тех пор, пока вы явно не вызовете docker volume rm или что-то вроде docker system prune, если в данный момент к нему никто не подключен. - person grapes; 04.02.2019
comment
В порядке. Итак, я делаю docker volume create foo на хосте, я запускаю докер, и он будет создан на этой машине и будет внешним по отношению к контейнерам докеров (или составлению докеров)? - person eugene; 04.02.2019
comment
После docker volume create foo этот том будет доступен на вашем хосте, пока вы его не удалите. Смысл external в том, что он является внешним по отношению к docker-compose, а не для удаленных ПК. external указывает docker-compose не автоматически воссоздавать такой том, а вместо этого искать среди объявленных томов и подключаться к ним. - person grapes; 04.02.2019
comment
Фактически, docker-compose down не удаляет ни одного тома, если вы не добавите параметр -v в эту команду. Таким образом, опция external не требуется. См. документацию. Если указана опция external, том не будет удален даже с docker-compose down -v. Но это не означает, что вы всегда должны использовать опцию external только для защиты ваших томов от случайного удаления. Используйте его только тогда, когда это действительно внешний том (а не тот, которым владеет ваш docker-compose.yml). - person Ruslan Stelmachenko; 02.03.2019