Введение
В целом, контейнеры Docker эфемерны, работают ровно столько, сколько нужно для выполнения введённой команды. По умолчанию, любые данные, созданные внутри контейнера, доступны только внутри этого контейнера и только когда он запущен.
Тома Docker могут использоваться для расшаривания (передачи) файлов между системой хоста и контейнером Docker. Например, допустим вы хотите использовать официальный образ Docker Nginx и сохранить постоянную копию файлов журнала Nginx для дальнейшего анализа. По умолчанию, образ nginx Docker будет вести журнал в директорию /var/log/nginx внутри контейнера Docker Nginx. Обычно она недоступна из файловой системы хоста.
В этой инструкции мы узнаем, как сделать данные внутри контейнера доступными на машине хоста.
Шаг 1 — Привязка тома
Следующая команда создаст в домашней директории папку nginxlogs пользователя localhost и привяжет её к /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 Настраивает привязываемый том, чтобы он указывал на директорию /var/log/nginx изнутри контейнера Nginx на директорию ~/nginxlogs на хостовой машине. Docker в качестве разделителя пути на хосте и пути в контейнере использует : (двоеточие) и путь на хосте всегда ставится первым.
- -p 5000:80 устанавливает перенаправление портов. Контейнер Nginx по умолчанию прослушивает порт 80. Этот флаг сопостовляет 80 порт на 5000 порт хостовой системы.
- nginx означает, что контейнер должен быть построен из образа Nginx, который для запуска Nginx выдаёт команду nginx -g "daemon off".
Помните: флаг -v очень гибкий. Он может привязать или назвать том небольшим изменением синтаксиса. Если первый аргумент начинается с / или ~/ вы создаёте привязку. Удалите их и вы назовёте том. Например:
- -v /путь:/путь/в/контейнере монтирует директорию хоста /путь в /путь/в/контейнере
- -v путь:/путь/в/контейнере создаёт том по названию пути без отношения к хосту.
Больше о поименованных томах (named volumes), смотрите в инструкции «Как передавать данные между контейнерами Docker».
Шаг 2 — Доступ к данным на хосте
Теперь у нас есть экземпляр Nginx внутри контейнера Docker на нашей машине, и наша хостовая машина сопоставляет порт 5000 напрямую к порту 80 этого экземпляра Nginx.
Загрузите адрес в веб-браузере, используя IP адрес или имя хоста вашего сервера и номер порта, http://203.0.113.0:5000. Вы должны увидеть:
Больше интересного если мы заглянем в директорию ~/nginxlogs на хосте, мы увидим access.log созданные контейнером nginx который покажет наш запрос:
cat ~/nginxlogs/access.log
Отобразиться что-то вроде:
203.0.113.0 - - [11/Nov/2016: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 для обмена информацией между контейнером и хостовой файловой системой. Это полезно в среде разработки, когда для отладки необходим доступ к логам доступа. Чтобы узнать, как обмениваться данными между контейнерами, посмотрите инструкцию «Как передавать данные между контейнерами Docker».
Связанные статьи:
- Установка и использование Docker в Linux (Debian, Ubuntu, Arch Linux) (100%)
- Как удалить образы, контейнеры и тома Docker (100%)
- Присвоение имени контейнерам Docker: 3 совета для новичков (100%)
- Как передавать данные между контейнерами Docker (100%)
- Для чего нужен Docker и когда его следует использовать? (100%)
- Как использовать кавычки в регулярных выражениях grep (RANDOM - 50%)