В чём разница монтирования папок в docker на конкретном примере?
postgres: -v $HOME/docker/volumes/postgres:/var/lib/postgresql/data postgres
nginx: -v $HOME/docker/volumes/nginx:/usr/share/nginx/html nginx
в случае с postgres файлы из контейнера /var/lib/postgresql/dataскидываются в локуальную папку хоста $HOME/docker/volumes/postgres
но в случае с nginx ничего не скидывается, и чтобы запустилась страничка, необходимо наличие файла index.html в папке хоста $HOME/docker/volumes/nginx
Не могу понять - команды монтирования одинаковые, но процессы разные, почему? Docker только начал изучать. Спасибо!
Ответы (1 шт):
Postgres
Postgres использует каталог /var/lib/postgresql/data для хранения файлов БД.
Изначально, перед самым первым стартом, этот каталог пустой. Можем это проверить. Запустите:
docker run -it --rm --entrypoint= postgres:latest ls -la /var/lib/postgresql/data
# Вывод:
drwxrwxrwt 2 postgres postgres 4096 Feb 13 01:58 .
drwxr-xr-x 1 postgres postgres 4096 Feb 13 01:58 ..
Получается, что каталог присутствует в образе (и созданном на основе его контейнере), но пустой.
Когда Postgres стартует первый раз, он создает там файлы базы данных, как минимум - дефолтную БД postgres. В дальнейшем эти файлы используются, и не создаются заново, так как "монтируются", то есть постоянно хранятся на машине.
Nginx
У Nginx каталог /usr/share/nginx/html должен содержать файлы - они изначально требуются Nginx и изначально присутствуют в образе. Давайте проверим:
docker run -it --rm --entrypoint= nginx:latest ls -la /usr/share/nginx/html
# Вывод:
-rw-r--r-- 1 root root 497 Feb 14 16:03 50x.html
-rw-r--r-- 1 root root 615 Feb 14 16:03 index.html
И когда Nginx стартует, он не находит этих файлов, от чего крашится. Ну так он устроен, что не создает дефолтные, они уже должны быть.
Чтобы заработало, сохраните в монтируемый каталог $HOME/docker/volumes/nginx эти два файла. Я это делаю через docker cp, только не монтируйте в этот момент туда ничего.
Монтирование
Мне кажется, вы не до конца понимаете как работает монтирование. Если вы думаете, что файлы, которые находятся в образе/контейнере, после монтирования появятся на хост-машине, это не так. Все идет в обратную сторону.
When you use a bind mount, a file or directory on the host machine is mounted into a container.
То есть, если в контейнере есть каталог с файлами, при монтировании в него пустого каталога с хоста, внутри контейнера он также становится пустым. Это монтирование. А если перезапустите без монтирования - то снова обнаружите там файлы.
PS.
Выше я использовал пустую точку входа --entrypoint=, чтобы не было влияния на содержимое контейнера.