Конфигурация VPN переживает пересоздание контейнера, только если её смонтировать
Файл, отредактированный в работающем контейнере, живёт в слое, который исчезает. Сравните bind mount, тома и секреты, затем пересоздайте контейнер и проверьте четыре вещи.
Вы редактируете конфигурацию WireGuard внутри работающего контейнера, она работает, и следующее обновление образа её стирает. Ничего не было настроено неправильно. Файл жил в записываемом слое контейнера, который существует только для этого экземпляра контейнера. Важное сравнение не в том, какой инструмент использовать, а в том, какие входы объявляет ваше развёртывание. Всё, что вы отредактировали вручную, — это вход, о котором развёртывание не знает.
Два вида состояния, одно из них одноразовое
У контейнера есть записываемый слой для изменений во время работы, и этот слой отбрасывается, когда контейнер заменяют. Это не хранилище конфигурации и не резервная копия. Образ плюс объявленные входы — полное определение того, что работает.
Спросите, какие из ваших файлов VPN являются объявленными входами, а какие — случайностью:
docker diff wg-vpn
docker inspect --format '{{json .Mounts}}' wg-vpnDiff перечисляет, что изменилось в записываемом слое, и это ровно тот набор вещей, который исчезнет. Список монтирований показывает, что останется. Сравнение двух отвечает на вопрос, прежде чем вы что-то потеряете.
Bind mount, именованный том или секрет: что защищает каждый
Все три могут хранить профиль VPN, и они различаются тем, кто может его читать и что происходит при замене.
| Mechanism | Survives recreation | Who can read it |
|---|---|---|
| Writable layer | No | Anyone with container access, until it is gone |
| Bind mount | Yes, while the host path exists | Whatever the host permissions allow |
| Named volume | Yes, until the volume is removed | Managed by the runtime |
| Secret | Yes, as a declared input | The container process, by design |
Bind mount отображает путь хоста, поэтому файл защищён настолько, насколько защищён этот путь, и виден настолько, насколько позволяют права хоста. Именованный том управляется средой выполнения и переживает удаление контейнера, что делает его более безопасным вариантом по умолчанию для состояния, которым владеет развёртывание. Механизм секретов предназначен для материала, который вы не хотите держать в образе или переменной окружения.
Не относитесь к каждой переменной окружения и каждому файлу хоста как к равноценной защите, потому что это не так.
Редактирование внутри контейнера — это ловушка
Ловушка не в инструменте, а в направлении редактирования. Изменение, сделанное внутри работающего контейнера, невидимо для развёртывания, поэтому следующее пересоздание молча его откатывает, и симптом выглядит как регрессия в образе. Если вам нужно что-то изменить там для диагностики, сразу скопируйте это наружу и поместите в объявленный вход. Затем пересоздайте, чтобы доказать, что развёртывание это воспроизводит.
Профиль может содержать закрытые ключи и учётные материалы, что делает резервную копию этого файла задачей обращения с секретами, а не копированием файла. Держите владение и доступ на чтение ограниченными реальным процессом контейнера, вместо того чтобы расширять каталог хоста, лишь бы исчезла ошибка прав.
Именно такое расширение превращает удобство в контейнере в раскрытие хоста.
Пересоздайте осознанно, затем проверьте четыре вещи
Запишите версию образа, требуемое устройство и возможности, сетевое подключение и постоянные входы. Список устройств и возможностей особенно важен для контейнера VPN, потому что туннелю нужны сетевое устройство и право его настраивать.
Подтвердите, какое сгенерированное состояние времени выполнения нужно перестроить, а не сохранить. Ключи, которые туннель сгенерировал при первом запуске, — это состояние, и решение сохранить их или сгенерировать заново имеет последствия для каждого peer, который знает старый открытый ключ.
После контролируемого пересоздания проверьте идентичность, маршрутизацию, DNS и требуемую блокировку при сбое. Процесс, который запускается без ошибок, не доказывает ни одного из этих четырёх. Проверьте это, пока туннель работает, и ещё раз после его остановки, потому что блокировка при сбое проявляется только тогда, когда туннель исчезает.
Держите копию для восстановления вне контейнера
Держите копию для восстановления, которая живёт независимо от контейнера, и проверьте её восстановление по документированному процессу. Непроверенная резервная копия профиля VPN — это надежда, особенно когда путь восстановления включает права, нужные процессу контейнера.
Если контейнер, владеющий VPN, заменяют, согласуйте приложения, которые совместно используют его сетевой стек, в поддерживаемом жизненном цикле среды выполнения.
Эта согласованность — разница между перезапуском и простоем. Развёртывание должно описывать, откуда берётся конфигурация, а документация по томам — это место, где проверяют, что среда выполнения действительно сохраняет.