Если MySQL-контейнер пробрасывает порт на хост, делать дамп можно прямо с хостовой машины. Не нужно заходить через
docker exec, запускаете mysqldump локально, и всё.Для этого нужны два условия: на хосте установлен MySQL-клиент, и в конфигурации контейнера прописан проброс порта.
Настройка Docker Compose
В
docker-compose.yml должна быть секция ports:services:
mysql:
image: mysql:8
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: yourpassword
volumes:
- mysql-data:/var/lib/mysql
Запуск дампа с хоста:
mysqldump -h 127.0.0.1 -P 3306 \
-u root -p'yourpassword' \
--single-transaction \
mydatabase > backup.sql
Флаг
--single-transaction важен для InnoDB: он снимает дамп без блокировок таблиц.Когда это имеет смысл
Версия
mysqldump на хосте может отличаться от той, что внутри контейнера. Это важно, потому что поведение флагов и формат дампа меняются от версии к версии. Если вы хотите точно контролировать, какая версия утилиты делает дамп, этот способ даёт такую возможность.Ещё один плюс: если у вас уже есть скрипты резервного копирования на хосте, этот подход встраивается в них без лишних правок.
Про безопасность
В разработке открытый порт не проблема. В продакшне стоит убедиться, что
3306 слушает только 127.0.0.1, а не все интерфейсы. Иначе база доступна снаружи, что плохо.В
docker-compose.yml это выглядит так:ports:
- "127.0.0.1:3306:3306"
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека devops'a
#root_prompt