В общем, контейнеры 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. Вы должны увидеть:

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