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

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

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

Данное руководство поможет вам получить доступ к данным внутри контейнера с хост-машины.

Требования

  • Сервер Ubuntu 16.04.
  • Пользователь с доступом к sudo (инструкции здесь).
  • Предварительно установленная платформа Docker (руководство по установке – здесь).

Читайте также:

Экосистема Docker: базовые компоненты

Экосистема Docker: основы контейнеризации

Примечание: Руководство предназначено для Ubuntu 16.04, однако с небольшими правками оно подойдёт и для других дистрибутивов.

1: Монтирование тома

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

docker run --name=nginx -d -v ~/nginxlogs:/var/log/nginx -p 5000:80 nginx

Рассмотрим команду подробнее:

  • –name=nginx: задаёт имя контейнера.
  • -d: отсоединяет процесс и запускает его в фоновом режиме. Если этого не сделать, командная строка будет занята выполнением этого процесса, и вы не сможете получить доступ к терминалу.
  • -v ~/nginxlogs:/var/log/nginx: указывает том, который нужно смонтировать. Он связывает каталог /var/log/nginx внутри контейнера nginx с каталогом ~/nginxlogs на локальной машине. Docker использует двоеточие, чтобы разделить пути к каталогам.
  • -p 5000:80: указывает порты. Контейнер Nginx использует порт 80 по умолчанию. Хост-система будет использовать порт 5000.
  • nginx: указывает образ, из которого нужно собрать контейнер. При этом будет выполнена команда nginx -g “daemon off.

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

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

2: Доступ к данным

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

Загрузите адрес в браузере:

http:// IP_адрес_или_имя_хоста:5000

На экране появится:

Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. […]

Теперь проверьте ~/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.

Заключение

Теперь вы знаете, как настроить обмен данными между контейнером и хостом.

Tags: ,

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