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