Volume VS Bind в Docker
Сегодня рассмотрим, как и в каких случаях правильно использовать bind или volume при запуске docker контейнеров.
Пересмотрев кучу docker compose файлов, можно сделать вывод — большинство даж не понимают что они делают. Что печально, прожжённые девопс-инженеры продолжают харкодить и творить дичь. Видимо придерживаются методологии — у меня работает, остальное похуй.
Вообще есть правило:
- Если нужно редактировать файлы руками с хоста, используешь Bind Mount.
- Если данные нужны только приложению (БД, логи, кэш) используешь Volumes.
ㅤ
Шпаргалка, что есть что:
Ну и никто не запрещает это совмещать, но старайся разделять. Тем более при работе с volumes, в docker есть удобные команды, ну и через midnight commander можешь физически потыкать файлы, при условии если есть рутовый доступ к файловой системе.
Самое главное не делай так:
Про этот случай я и писал в начале поста, вроде человек 20 лет отрубил в айтишке, а пишет хуйню.
Тут идет жесткая привязка к путям и после запуска наступишь на грабли, либо получишь по ебалу от бедолаги который это запустит. Короче так не делай!
Bind mount удобен при разработке и отладки. Ты монтируешь папку с исходным кодом проекта. Правишь код в IDE на хосте и изменения мгновенно подхватываются приложением внутри контейнера.
А еще есть полезный флаг: «RO», используется в ситуациях, когда тебе нужно что-бы приложение в контейнере не перезаписывало данные в примонтированном каталоге. Удобно для отладки или для каких-то ограничений.
Пример:
При всём желании, конфиг
Ну и пожелания:
- Используйте именованные тома, вместо анонимных томов (которые выглядят как длинный хеш
- Придерживайся принципа - «Один контейнер — один вольюм». Старайтесь не монтировать один и тот же вольюм в 10 разных контейнеров на запись. Если нужно делиться данными, один контейнер должен быть «владельцем» (RW), а остальные — «потребителями» (RO).
- Бэкап: Правило «3-2-1». Volume — это не бэкап, это просто место хранения. Если ты случайно ёбнешь вольюм командой
Используйте временный контейнер для создания архива:
- Docker со временем накапливает «висячие» (dangling) вольюмы — это те, что остались от удаленных контейнеров. Периодически запускай
- Разницы в скорости между Bind и Volume почти нет, оба работают напрямую через ядро. Но это зависит от операционной системы, если у тебя винда и 100500 абстракций, то будут тормоза.
Вот такие пироги, если есть чё добавить, жду тебя в комментариях.
🛠 #docker #linux #devops
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Сегодня рассмотрим, как и в каких случаях правильно использовать bind или volume при запуске docker контейнеров.
Пересмотрев кучу docker compose файлов, можно сделать вывод — большинство даж не понимают что они делают. Что печально, прожжённые девопс-инженеры продолжают харкодить и творить дичь. Видимо придерживаются методологии — у меня работает, остальное похуй.
Вообще есть правило:
- Если нужно редактировать файлы руками с хоста, используешь Bind Mount.
- Если данные нужны только приложению (БД, логи, кэш) используешь Volumes.
ㅤ
Шпаргалка, что есть что:
# Это docker volume, данные хранятся в
# /var/lib/docker/volumes/
volumes:
- nginx_data:/etc/data
# Это bind mount, данные хранятся рядом
# с файлом docker-compose.yml
volumes:
- ./data:/etc/data
Ну и никто не запрещает это совмещать, но старайся разделять. Тем более при работе с volumes, в docker есть удобные команды, ну и через midnight commander можешь физически потыкать файлы, при условии если есть рутовый доступ к файловой системе.
Самое главное не делай так:
Про этот случай я и писал в начале поста, вроде человек 20 лет отрубил в айтишке, а пишет хуйню.
volumes:
- /home/anus/conf.d:/etc/nginx/cond.f
- /home/anus/data/logs:/var/log/nginx
Тут идет жесткая привязка к путям и после запуска наступишь на грабли, либо получишь по ебалу от бедолаги который это запустит. Короче так не делай!
Я лично предпочитаю volumes и порой даже конфиги в нем храню, потому что этот volume можно легко примаунтить к любому другому контейнеру и получить доступ к этим файлам.
Банально возьмем связку nginx + php-fpm, используем один общий volume и php скрипты корректно выполняются.
Bind mount удобен при разработке и отладки. Ты монтируешь папку с исходным кодом проекта. Правишь код в IDE на хосте и изменения мгновенно подхватываются приложением внутри контейнера.
А еще есть полезный флаг: «RO», используется в ситуациях, когда тебе нужно что-бы приложение в контейнере не перезаписывало данные в примонтированном каталоге. Удобно для отладки или для каких-то ограничений.
Пример:
services:
web:
image: nginx:alpine
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./logs:/var/log/nginx
При всём желании, конфиг
nginx.conf нельзя модифицировать из приложения в контейнере. Это можно сделать только на хостовой машине. Второй же bind mount по умолчанию - «RW».Ну и пожелания:
- Используйте именованные тома, вместо анонимных томов (которые выглядят как длинный хеш
4f32a...) всегда давайте томам осмысленные имена: db_data, app_uploads- Придерживайся принципа - «Один контейнер — один вольюм». Старайтесь не монтировать один и тот же вольюм в 10 разных контейнеров на запись. Если нужно делиться данными, один контейнер должен быть «владельцем» (RW), а остальные — «потребителями» (RO).
- Бэкап: Правило «3-2-1». Volume — это не бэкап, это просто место хранения. Если ты случайно ёбнешь вольюм командой
prune, данные исчезнут.Используйте временный контейнер для создания архива:
docker run --rm -v db_data:/data -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
- Docker со временем накапливает «висячие» (dangling) вольюмы — это те, что остались от удаленных контейнеров. Периодически запускай
docker volume prune. Оно удалит только те тома, которые не подключены ни к одному контейнеру (включая остановленные).- Разницы в скорости между Bind и Volume почти нет, оба работают напрямую через ядро. Но это зависит от операционной системы, если у тебя винда и 100500 абстракций, то будут тормоза.
Вот такие пироги, если есть чё добавить, жду тебя в комментариях.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
6 59
Please open Telegram to view this post
VIEW IN TELEGRAM
10 109
Почтовый сервер у себя дома
Вчера решал интересную задачку. У меня в интернетах крутится собственный почтовый сервер на домене, сервер ежемесячно поджирает стабильно около 2к рублей. Хотя за месяц от силы я получаю 10-20 писем.
ㅤ
Избыточно в плане инфраструктуры и затрат? Конечно! Разумно перетащить его к себе на домашний proxmox и избавиться от одной статьи расходов.
Во время проектирования миграции, было много вопросов и самый главный — у меня нет белого IP в домашнем сегменте, как быть? DynDNS я ебал, да и с микротиком возиться не хочется.
Всё оказалось достаточно просто. Создаем условно за 100 рублей сервер в интернетах с белым IP, втыкаем на него angie с модулем stream, объединяем этот сервер с домашней сетью с помощью netbird или другой технологией. И просто проксипасим все запросы в домашний сегмент.
Звучит логично. Но на практике пришлось поебстись и почитать спецификации всей этой кухни.
Конфиг для angie получился такой, он работает при условии наличия модуля stream.
Суть тут такая, все запросы на определенные порты, перенаправляются в netbird сеть, а
Получилась банальная прокся. Великолепно то, что angie автоматом получает SSL сертификаты и в почтовых программах с этим заморачиваться не нужно, просто указываем домен, порт и всё работает как часы.
Да, в роле почтового сервера у меня установлен docker-mailserver. Штука классная, установил, пару тычек выписал в конфиг и оно работает. Морды в ней нет, чисто логическая часть, что-то вроде бекенда.
Еще нюанс в конфиге docker-mailserver я прописал SSL сертификаты, эти сертификаты я взял в angie после того как он мне их выдал. В этом плане нужно еще придумать, как организовать передачу этих сертов к себе в proxmox.
Ну и важное уточнение, отправлять почту во вне, тебе в нынешних реалиях никто не даст (25 порт на отправку везде заблочен), поэтому используем какой-нибудь relay для этого. Благо есть полно таких, кто дает отправить 10-15к писем в месяц легально и бесплатно. Я пользуюсь этим сервисом несколько лет.
Что еще. Возможно будут проблемы с SPF, но если оно тебе в хуй не уперлось, то отключаем в конфиге docker-mailserver -
Ну и SIEVE включается там же через
Плюсом можешь воткнуть mail archiver и вообще горя не знать. Теперь все твоиписьки письма под контролем и ты сам себе хозяин этой суеты. Ну и дополнительная экономия на избыточной инфраструктуре.
На этом всё, изучай. Концепт я тебе показал, нюансы рассказал, так что дерзай, всё решаемо.
🛠 #selfhosting #proxmox #devops
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Вчера решал интересную задачку. У меня в интернетах крутится собственный почтовый сервер на домене, сервер ежемесячно поджирает стабильно около 2к рублей. Хотя за месяц от силы я получаю 10-20 писем.
ㅤ
Избыточно в плане инфраструктуры и затрат? Конечно! Разумно перетащить его к себе на домашний proxmox и избавиться от одной статьи расходов.
Во время проектирования миграции, было много вопросов и самый главный — у меня нет белого IP в домашнем сегменте, как быть? DynDNS я ебал, да и с микротиком возиться не хочется.
Всё оказалось достаточно просто. Создаем условно за 100 рублей сервер в интернетах с белым IP, втыкаем на него angie с модулем stream, объединяем этот сервер с домашней сетью с помощью netbird или другой технологией. И просто проксипасим все запросы в домашний сегмент.
Про MX, SPF, DKIM писать не буду, все это настраивается отдельно, не сложно.
Звучит логично. Но на практике пришлось поебстись и почитать спецификации всей этой кухни.
Конфиг для angie получился такой, он работает при условии наличия модуля stream.
nginx
upstream imap_backend {
server 100.106.7.8:993;
}
upstream smtp_backend {
server 100.106.7.8:587;
}
upstream sieve_backend {
server 100.106.7.8:4190;
}
server {
listen 993;
proxy_pass imap_backend;
proxy_timeout 1h;
proxy_connect_timeout 30s;
}
server {
listen 587;
proxy_pass smtp_backend;
proxy_timeout 1h;
proxy_connect_timeout 30s;
}
server {
listen 4190;
proxy_pass sieve_backend;
proxy_timeout 1h;
proxy_connect_timeout 30s;
}
дополнительные порты сам добавь, сюда всё не влезло
Суть тут такая, все запросы на определенные порты, перенаправляются в netbird сеть, а
100.106.7.8 это IP адрес как раз моего LXC контейнера с почтовым сервером в домашнем proxmox.Получилась банальная прокся. Великолепно то, что angie автоматом получает SSL сертификаты и в почтовых программах с этим заморачиваться не нужно, просто указываем домен, порт и всё работает как часы.
sieve_backend нужен, чтобы управлять фильтрами в почте, например при получении письма с определенным заголовком, переносить это письмо в другую папку.Я использую nextcloud mail, и там есть поддержка sieve из коробки. Потыкал еще roundcube для морды, но чёт не зашла, топорная какая-то штука, хотя рабочая.
Да, в роле почтового сервера у меня установлен docker-mailserver. Штука классная, установил, пару тычек выписал в конфиг и оно работает. Морды в ней нет, чисто логическая часть, что-то вроде бекенда.
Еще нюанс в конфиге docker-mailserver я прописал SSL сертификаты, эти сертификаты я взял в angie после того как он мне их выдал. В этом плане нужно еще придумать, как организовать передачу этих сертов к себе в proxmox.
environment:
- SSL_TYPE=manual
- SSL_CERT_PATH=/tmp/dms/custom-certs/certificate.pem
- SSL_KEY_PATH=/tmp/dms/custom-certs/private.key
volumes:
- ./ssl:/tmp/dms/custom-certs/:ro
Банально можно через scp копировать, но в идеале поднять vault hashicorp и хранить серты там и по необходимости дергать от туда в любое место.
Ну и важное уточнение, отправлять почту во вне, тебе в нынешних реалиях никто не даст (25 порт на отправку везде заблочен), поэтому используем какой-нибудь relay для этого. Благо есть полно таких, кто дает отправить 10-15к писем в месяц легально и бесплатно. Я пользуюсь этим сервисом несколько лет.
Что еще. Возможно будут проблемы с SPF, но если оно тебе в хуй не уперлось, то отключаем в конфиге docker-mailserver -
ENABLE_POLICYD_SPF=0.Ну и SIEVE включается там же через
ENABLE_MANAGESIEVE=1.Плюсом можешь воткнуть mail archiver и вообще горя не знать. Теперь все твои
На этом всё, изучай. Концепт я тебе показал, нюансы рассказал, так что дерзай, всё решаемо.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
3 46
С наступающим! Здоровья тебе и твоим близким!
Каждому из вас хочу сказать огромное спасибо за вклад в наше уютное сообщество. Вы все прекрасные специалисты, профессионалы и просто хорошие люди.
Пусть в 2026 году у тебя всё получится, главное не опускай руки и никого не слушай.
Прекрасных тебе праздников и береги себя!
Всех обнял🙃 🙃 🙃
Каждому из вас хочу сказать огромное спасибо за вклад в наше уютное сообщество. Вы все прекрасные специалисты, профессионалы и просто хорошие люди.
Пусть в 2026 году у тебя всё получится, главное не опускай руки и никого не слушай.
Прекрасных тебе праздников и береги себя!
Всех обнял
Please open Telegram to view this post
VIEW IN TELEGRAM
16 170
Ну началось…
ㅤ
Нашел я тебе тут новейший браузер для терминала. Причем не огрызок ебаный вроде
Называется это чудо Brow6el, из пакетов ты его не поставишь, потому что разрабатывает его гикнутый профессор, соответственно тебе придется собрать его самому из исходников.
Благо товарищ побеспокоился об ущербных и дал нам Bash скрипты для билда.
Поехали собирать:
Готово! Теперь запускаем:
Как это работает?
В основе лежит Chromium Embedded Framework (CEF), который рендерит страницы без графического интерфейса. Затем Brow6el преобразует полученное изображение в sixel-графику — формат, который поддерживают многие терминалы. В результате браузер выводит картинку в терминал и обновляет её в реальном времени.
Функции:
- поддержка мыши и клавиатуры
- обычный ввод и прокрутка
- вкладки
- менеджер загрузок
- система закладок
- приватный режим
- JavaScript-консоль
- внедрять скрипты по шаблону URL
Фича: ввод мыши возможен как с реальной мыши, так и через виртуальную мышь, управляемую клавиатурой, что позволяет работать даже если у тебя отсутствует мышь.
Возможно тебе сгодится для тайлинга или чего-то еще. Забирай в копилку.
🛠 #utilites #linux #terminal
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
ㅤ
Нашел я тебе тут новейший браузер для терминала. Причем не огрызок ебаный вроде
lynx, а прям полноценный, с поддержкой графики, скриптов и со всеми современными технологиями.Называется это чудо Brow6el, из пакетов ты его не поставишь, потому что разрабатывает его гикнутый профессор, соответственно тебе придется собрать его самому из исходников.
Благо товарищ побеспокоился об ущербных и дал нам Bash скрипты для билда.
Поехали собирать:
git clone https://codeberg.org/janantos/brow6el.git
sudo apt install build-essential cmake gitlibsixel-dev libgtk-3-dev libx11-dev libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev libglib2.0-dev
cd /tmp/brow6el
chmod +x download_cef.sh
./download_cef.sh
mkdir -p build
cd build
cmake ..
make -j$(nproc)
Готово! Теперь запускаем:
cd build
./run_brow6el.sh https://linuxfactory.ru
Как это работает?
В основе лежит Chromium Embedded Framework (CEF), который рендерит страницы без графического интерфейса. Затем Brow6el преобразует полученное изображение в sixel-графику — формат, который поддерживают многие терминалы. В результате браузер выводит картинку в терминал и обновляет её в реальном времени.
Функции:
- поддержка мыши и клавиатуры
- обычный ввод и прокрутка
- вкладки
- менеджер загрузок
- система закладок
- приватный режим
- JavaScript-консоль
- внедрять скрипты по шаблону URL
Фича: ввод мыши возможен как с реальной мыши, так и через виртуальную мышь, управляемую клавиатурой, что позволяет работать даже если у тебя отсутствует мышь.
Короче забавная штука, пользоваться я этим говнищем не буду, но как концепт потыкать вполне себе достойно.
Возможно тебе сгодится для тайлинга или чего-то еще. Забирай в копилку.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
6 62