zaLinux.ru

Как передавать данные между контейнером Docker и хостом


Введение

В целом, контейнеры 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».


Рекомендуемые статьи:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *