Перейти к содержимому
Главная страница » Как обмениваться данными между контейнером Docker и хостом

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

В общем, контейнеры Docker являются эфемерными и выполняются ровно столько, сколько требуется для выполнения команды, выданной в контейнере. По умолчанию любые данные, созданные внутри контейнера, доступны только изнутри контейнера и только во время работы контейнера.

Для обмена файлами между хост-системой и контейнером Docker можно использовать тома Docker. Допустим, вы используете официальный образ Docker Nginx и вам нужно сохранить постоянную копию файлов журнала Nginx для последующего анализа. По умолчанию nginx образ Docker будет регистрировать логи в /var/log/nginx каталоге внутри контейнера Docker Nginx и это место будет недоступно из файловой системы хоста.

В этом руководстве мы рассмотрим, как сделать данные внутри контейнера доступными на хост-компьютере.

Предварительные требования

Чтобы следовать этой статье, вам понадобится сервер Ubuntu 18.04 со следующим:

  • Пользователь, не являющийся root, с sudo привилегиями;
  • Установленный Docker.

Примечание: Хотя в Предварительных требованиях приведены инструкции по установке Docker в Ubuntu 18.04, docker команды для томов данных Docker в этой статье должны работать в других операционных системах, пока установлен Docker.

Привязка тома

Следующая команда создаст каталог с именем 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.

Примечание: Флаг -v очень гибкий. Он может выполнять привязку или присвоение имени тому с небольшой корректировкой синтаксиса. Если первый аргумент начинается с / или ~/, вы создаете bindmount . Удалите это, и вы присвоите тому имя.

  • -v /path:/path/in/container монтирует каталог хоста, /path на /path/in/container
  • -v path:/path/in/container создает том с именем path, не имеющий отношения к хосту.

Подробнее об именованных томах см. в разделе Как обмениваться данными между контейнерами Docker

Доступ к данным на хосте

Теперь у нас есть копия Nginx, запущенная внутри контейнера Docker на нашей машине, и порт нашей хост-машины 5000 сопоставляется непосредственно с этой копией порта Nginx 80.

Загрузите адрес в веб-браузере, используя IP-адрес или имя хоста вашего сервера и номер порта: http://your_server_ip:5000. Вы должны увидеть:

Обмен данными между контейнером Docker и хостом

Что еще интереснее, если мы заглянем в ~/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 для обмена информацией между контейнером и хостом. Это полезно в средах разработки, где необходимо иметь доступ к логам для отладки. Чтобы узнать больше об обмене постоянными данными между контейнерами, ознакомьтесь с Как обмениваться данными между контейнерами Docker.

Добавить комментарий

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