В чем разница между объявлением тома docker-compose.yml разделом и службой? - PullRequest
0 голосов
/ 03 марта 2019

В чем разница между объявлением в разделе docker-compose.yml раздела тома и просто использованием ключевого слова volume в службе?

Например, я сопоставляю том таким образом для контейнера:

services:
   mysqldb:
      volumes:
         - ./data:/var/lib/mysql

Это сопоставит папку с данными из моего рабочего каталога.

Но я также могу сопоставить том, объявив раздел тома и использовать его псевдоним для контейнера:

services:
   mysqldb:
      volumes:
         - data_volume:/var/lib/mysql
volumes:
   data_volume:
      driver: local

В этом методе фактическое местоположение, где хранятся сопоставленные файлы, кажется, в некоторой степени управляется составлением докера.

В чем различия между этими двумя методами или они одинаковы?Какой из них мне действительно стоит использовать?

Есть ли преимущества использования одного метода над другим?

1 Ответ

0 голосов
/ 03 марта 2019

Разница между методами, которые вы описали, заключается в том, что первый метод - это bind mount , а другой - том .Это больше функций Docker (нежели Docker Compose), и есть несколько преимуществ, которые предоставляют тома при монтировании пути из файловой системы вашего хоста.Как описано в документации, они:

  • проще создавать резервные копии или переносить
  • можно управлять с помощью docker volumes или API (в отличие от необработанной файловой системы)
  • работает как с контейнерами Linux, так и с Windows
  • можно безопасно разделять между несколькими контейнерами
  • может иметь содержимое, предварительно заполненное контейнером (с помощью монтирования bind иногда приходится копировать данные, затем перезапустите контейнер)

Еще одним значительным преимуществом использования томов являются драйверы томов , которые вы должны указать вместо local.Они позволяют удаленно хранить тома (например, в облаке и т. Д.) Или добавлять другие функции, такие как шифрование.Это является основой концепции контейнеров, поскольку если запущенный контейнер не имеет состояния и использует удаленные тома, вы можете перемещать контейнер между узлами, и его можно запускать без перенастройки.

Поэтому рекомендуетсяиспользовать тома Docker.Другим хорошим примером является следующий:

services:
  webserver_a:
    volumes:
      - ./serving/prod:/var/www
  webserver_b:
    volumes:
      - ./serving/prod:/var/www
  cache_server:
    volumes:
      - ./serving/prod:/cache_root

Если вы переместите каталог ./serving в другое место, привязка монтирования прекратится, потому что это относительный путь.Как вы заметили, тома имеют псевдонимы и имеют путь, которым управляет Docker, поэтому:

  1. вам не нужно будет искать и заменять путь 3 раза
  2. тома, используя local хранит данные где-то еще в вашей системе и будет продолжать монтировать просто отлично

TL; DR: попробуйте и используйте тома.Они переносимы и поощряют действия, которые уменьшают зависимости от вашего хост-компьютера.

...