Поиск по сайту:

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


Введение

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

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

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

Предпосылки

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

  • Пользователь без полномочий root с правами sudo, следуя руководству по начальной настройке сервера с Ubuntu 18.04.
  • Docker установлен в соответствии с инструкциями из шагов 1 и 2 раздела «Как установить и использовать Docker в Ubuntu 18.04».

Если вы новичок в Docker, серия Docker Ecosystem содержит подробный обзор ключевых концепций.

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

Шаг 1 — Связывание тома

Следующая команда создаст каталог с именем nginxlogs в домашнем каталоге текущего пользователя и подключит его к /var/log/nginx в контейнере:

  1. 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 -g daemon off для запуска Nginx.

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

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

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

Шаг 2 — Доступ к данным на хосте

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

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

Что еще интереснее, если мы заглянем в каталог ~/nginxlogs на хосте, мы увидим access.log, созданный nginx контейнера. который покажет наш запрос:

  1. cat ~/nginxlogs/access.log

Это должно отображать что-то вроде:

Output
203.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.