береженого кольт бережет
береженого кольт бережет

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

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

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

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

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

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

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

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

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

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

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

Теперь проверьте ~/nginx/logs. В нём вы найдёте 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" "-"

Если вы внесёте изменения в каталог ~/nginx/logs, вы сможете увидеть их в контейнере Docker.