Вступление
В общем, Docker-контейнеры эфемерны и работают так же долго, как и команда, выполненная в контейнере, для завершения. По умолчанию любые данные, созданные внутри контейнера, доступны только внутри контейнера и только во время работы контейнера.
Тома Docker можно использовать для обмена файлами между хост-системой и контейнером Docker. Например, предположим, что вы хотели использовать официальный образ Docker Nginx и сохранить постоянную копию файлов журнала Nginx для последующего анализа. По умолчанию образ Dockernginx
регистрируется в каталоге/var/log/nginx
inside контейнера Docker Nginx. Обычно он недоступен из файловой системы хоста.
В этом руководстве мы рассмотрим, как сделать данные из контейнера доступными на хост-компьютере.
Предпосылки
Чтобы следовать этой статье, вам понадобится сервер Ubuntu 18.04 со следующим:
-
Пользователь без полномочий root с привилегиями sudo, следуя руководствуInitial Server Setup with Ubuntu 18.04.
-
Докер установлен с помощью инструкцийStep 1 иStep 2 изHow To Install and Use Docker on Ubuntu 18.04.
Если вы новичок в Docker, серияThe Docker Ecosystem содержит подробный обзор ключевых концепций.
[.note] #Note: Несмотря на то, что в предварительных требованиях есть инструкции по установке Docker в Ubuntu 18.04, командыdocker
для томов данных Docker в этой статье должны работать в других операционных системах, пока Docker установлен.
#
[[step-1 -—- bindmounting-a-volume]] == Шаг 1. Привязка монтирования тома
Следующая команда создаст каталог с именемnginxlogs
в домашнем каталоге вашего текущего пользователя и подключит его к/var/log/nginx
в контейнере:
docker run --name=nginx -d -v ~/nginxlogs:/var/log/nginx -p 5000:80 nginx
Давайте на минутку рассмотрим эту команду подробно:
-
--name=nginx
называет контейнер, чтобы нам было проще обращаться к нему. -
-d
отключает процесс и запускает его в фоновом режиме. В противном случае мы просто будем наблюдать пустое приглашение Nginx и не сможем использовать этот терминал, пока не убьём Nginx. -
-v ~/nginxlogs:/var/log/nginx
устанавливает том bindmount, который связывает каталог/var/log/nginx
внутри контейнера Nginx с каталогом~/nginxlogs
на хост-машине. Docker использует:
, чтобы отделить путь хоста от пути к контейнеру, и путь хоста всегда идет первым. -
-p 5000:80
устанавливает переадресацию порта. Контейнер Nginx по умолчанию прослушивает порт80
. Этот флаг отображает порт контейнера80
на порт5000
в хост-системе. -
nginx
указывает, что контейнер должен быть построен из образа Nginx, который выдает командуnginx -g "daemon off"
для запуска Nginx.
[.Примечание]##
Note: Флаг-v
очень гибкий. Он может связывать или называть том с помощью небольшой корректировки синтаксиса. Если первый аргумент начинается с/
или~/
, вы создаете bindmount. Удалите это, и вы называете том.
-
-v /path:/path/in/container
монтирует каталог хоста,/path
в/path/in/container
-
-v path:/path/in/container
создает том с именемpath
, не имеющий отношения к хосту.
Подробнее об именованных томах см.How to Share Data Between Docker Containers
[[step-2 -—- accessing-data-on-the-host]] == Шаг 2 - Доступ к данным на хосте
Теперь у нас есть копия Nginx, работающая внутри контейнера Docker на нашем компьютере, а порт5000
нашего хост-компьютера напрямую сопоставляется с этой копией порта80
Nginx.
Загрузите адрес в веб-браузере, используя IP-адрес или имя хоста вашего сервера и номер порта:http://your_server_ip:5000
. Тебе следует увидеть:
Что еще интереснее, если мы заглянем в каталог~/nginxlogs
на хосте, мы увидимaccess.log
, созданный контейнеромnginx
, который покажет наш запрос:
cat ~/nginxlogs/access.log
Это должно отобразить что-то вроде:
Output203.0.113.0 - - [11/Jul/2018:00:59:11 +0000] "GET / HTTP/1.1" 200 612 "-"
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36" "-"
Если вы внесете какие-либо изменения в папку~/nginxlogs
, вы также сможете увидеть их внутри контейнера Docker в режиме реального времени.
Заключение
В этом руководстве мы продемонстрировали, как создать том данных Docker для обмена информацией между контейнером и файловой системой хоста. Это полезно в средах разработки, где необходимо иметь доступ к журналам для отладки. Чтобы узнать больше о совместном использовании постоянных данных между контейнерами, взгляните наHow To Share Data between Docker Containers.