Изучаваме Docker, част 6: работа с данни

В днешната част от превода на серията материали за Docker ще говорим за работа с данни. По-конкретно — за Docker томовете. В тези материали постоянно сравнявахме софтуерните механизми на Docker с различни хранителни аналози. Няма да отклоним от тази традиция и тук. Данните в Docker ще бъдат подправки. В света съществуват много видове подправки, а в Docker — много начини за работа с данни.

→ Част 1: основи
→ Част 2: термини и концепции
→ Част 3: файлове Dockerfile
→ Част 4: намаляване на размера на образите и ускоряване на тяхното изграждане
→ Част 5: команди
→ Част 6: работа с данни

Изучаваме Docker, част 6: работа с данни

Обърнете внимание, че този материал е подготвен с използването на Docker версия 18.09.1 и API версия 1.39.

Данните в Docker могат да се съхраняват или временно, или постоянно. Нека започнем с времевите данни.

Временно съхранение на данни

В Docker контейнерите организационната работа с времевите данни може да бъде реализирана по два начина.

По подразбиране файловете, създавани от приложението, работещо в контейнера, се съхраняват в слоя на контейнера, който поддържа запис. За да работи този механизъм, не е необходимо нищо специално да се настройва. Получава се евтино и сърцато. Приложението просто трябва да запази данните и да продължи с работата си. Въпреки това, след като контейнерът спре да съществува, данните, съхранени по този прост начин, също ще изчезнат.

За съхранение на времеви файлове в Docker може да се използва и друго решение, подходящо за случаи, когато е необходим по-висок налягане на производителността в сравнение с това, което може да се постигне чрез стандартния механизъм за временно съхранение на данни. Ако не е необходимо данните ви да се съхраняват дълго, след като контейнерът съществува, можете да свържете контейнера с tmpfs — временно хранилище на информация, което използва оперативната памет на хоста. Това ще ускори операциите по запис и четене на данни.

Често се случва данните да трябва да се съхраняват и след като контейнерът спре да съществува. За това ще ни пригодят механизмите за постоянно съхранение на данни.

Постоянно съхранение на данни

Има два начина, по които можете да удължите живота на данните извън живота на контейнера. Един от начините е чрез използване на технологията bind mount. При този подход можете да монтирате, например, реално съществуваща папка към контейнера. Процесите извън Docker също ще могат да работят с данните, съхранявани в такава папка. Ето как изглеждат монтиране на tmpfs и технологията bind mount.

Изучаваме Docker, част 6: работа с данни
Монтиране на tmpfs и bind mount

Недостатъците на използването на технологията bind mount са, че нейното използване усложнява резервното копиране на данните, миграцията на данните и съвместното използване на данните от различни контейнери. Много по-добре за постоянно съхранение на данни е да се използват томове на Docker.

Томове на Docker

Томът е файлова система, разположена на хост машината извън контейнерите. Docker се занимава със създаването и управлението на томовете. Ето основните свойства на томовете на Docker:

  • Те представляват средства за постоянно съхранение на информация.
  • Те са независими и отделени от контейнерите.
  • Различни контейнери могат да ги използват заедно.
  • Те позволяват организиране на ефективно четене и запис на данни.
  • Томовете могат да се разполагат на ресурси на отдалечен облачен доставчик.
  • Могат да бъдат криптирани.
  • Могат да получават имена.
  • Контейнерът може да организира предварително запълване на тома с данни.
  • Удобни са за тестване.

Както виждате, томовете на Docker притежават забележителни свойства. Нека поговорим за начина на тяхното създаване.

Създаване на томове

Томовете могат да бъдат създавани чрез средствата на Docker или с помощта на API заявки.

Ето инструкция в Dockerfile, която позволява да се създаде том при стартиране на контейнера.

VOLUME /my_volume

При използването на такава инструкция, Docker ще създаде том, съдържащ данните, които вече съществуват на посоченото място, след създаването на контейнера. Обърнете внимание, че ако създавате том с помощта на Dockerfile, това не ви освобождава от необходимостта да посочите точка на монтиране на тома.

Томове в Dockerfile могат да се създават и чрез JSON формат.

Освен това, томове могат да се създават и чрез командния ред по време на работа на контейнера.

Работа с томове от командния ред

▍Създаване на том

Можете да създадете независим том с помощта на следната команда:

docker volume create --name my_volume

▍Извличане на информация за томовете

За да видите списъка с томовете на Docker, използвайте следната команда:

docker volume ls

Специфичен том можете да проучите по следния начин:

docker volume inspect my_volume

▍Изтриване на том

Можете да изтриете том по следния начин:

docker volume rm my_volume

За да изтриете всички томове, които не се използват от контейнери, можете да използвате следната команда:

docker volume prune

Преди да изтриете томовете, Docker ще поиска от вас потвърждение за извършване на тази операция.

Ако томът е свързан с някой контейнер, такъв том не може да бъде изтрит, докато не бъде изтрит съответният контейнер. Освен това, дори ако контейнерът е изтрит, Docker не винаги разбира това. Ако това се случи, можете да използвате следната команда:

docker system prune

Тя е предназначена за почистване на ресурсите на Docker. След изпълнението на тази команда, трябва да можете да изтриете томовете, статусът на които до този момент е бил неправилно определен.

Флаговете —mount и —volume

Когато работите с томове, при извикване на командата docker, често ще трябва да използвате флаговете. Например, за да създадете том по време на създаването на контейнера, можете да използвате следната конструкция:

docker container run --mount source=my_volume, target=\/container\/path\/for\/volume my_image

Преди време (преди 2017 година) флагът --volume. Първоначално този флаг (може да се използва и в съкратен вид, тогава изглежда като -v) се използваше за независими контейнери, а флагът --mount беше предназначен за среда Docker Swarm. Въпреки това, от Docker 17.06, флагът --mount може да се използва в каквито и да е сценарии.

Трябва да се отбележи, че при използването на флага --mount обемът на допълнителните данни, които трябва да укажете в командата, нараства, но по няколко причини, е по-добре да използвате именно този флаг, вместо --volume. Флагът --mount --това е единственият механизъм, който позволява да работите със услуги или да задавате параметри на драйвера на тома. Освен това, работата с този флаг е по-лесна.

В съществуващите примери на команди, насочени към работа с данни в Docker, можете да срещнете много примери за употреба на флага -v. Когато се опитвате да адаптирате тези команди за себе си, имайте предвид, че флаговете --mount и --volume използват различни формати на параметри. Тоест, не можете просто да замените -v на --mount и да получите работеща команда.

Основната разлика между --mount и --volume е, че при използването на флага --volume всички параметри се събират заедно в едно поле, а при използването --mount параметрите се разделят.

При работа с --mount параметрите са представени като двойки ключ-стойност, а именно, изглеждат така ключ=стойност. Тези двойки се разделят с запетаи. Ето често използвани параметри --mount:

  • тип — тип на монтиране. Стойността за съответния ключ може да бъде bind, volume или tmpfs. Тук говорим за обеми, тоест - интересува ни стойността volume.
  • source — източник на монтиране. За именувани обеми това е - името на обема. За неименувани обеми този ключ не се уточнява. Може да бъде съкратен до src.
  • дестинация — пътят, по който файл или папка се монтира в контейнера. Този ключ може да бъде съкратен до dst или target.
  • readonly — монтира обем, който е предназначен само за четене. Използването на този ключ не е задължително, стойност не му се задава.

Ето пример за използване --mount с множество параметри:

docker run --mount type=volume,source=volume_name,destination=\/path\/in\/container,readonly my_image

Итог

Ето полезни команди, които можете да използвате при работа с Docker обеми:

  • docker volume create
  • docker volume ls
  • docker volume inspect
  • docker volume rm
  • docker volume prune

Ето списък с често използвани параметри за --mount, приложими в команда от вида docker run --mount my_options my_image:

  • type=volume
  • source=volume_name
  • destination=\/path\/in\/container
  • readonly

Сега, след като завършихме тази серия материали за Docker, е време да кажем няколко думи за това накъде може да продължи човек, който изучава Docker. Ето голяма добра статия за Docker. Ето книга за Docker (когато купувате тази книга, опитайте се да вземете най-новото й издание). Ето още една книга, която е подходяща за тези, които смятат, че практиката е най-добрият начин за изучаване на технологии.

Уважаеми читатели! Какви материали за Docker бихте препоръчали на новаците да изучат?

Изучаваме Docker, част 6: работа с данни

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster