среда, 1 мая 2019 г.

Mysql в docker на Windows с сохранением данных

Вроде простая задачка, а провозился с ней несколько часов.


Задача:


На ПК windows сотрудника работающего с базами данных поднять mysql сервер и раскатать рабочую базу для удобной работы из Workbench или любой другой программы по работе с базами.

Решать задачку можно по-разному, к примеру можно вместе с Workbench поднять и mysql сервер на винде, но это не кошерный вариант.
Православным решением будет установка докера и настройка контейнера со всем содержимым. А пользователь просто подключится из Workbench к базе в docker и будет радоваться жизни.
Я ранее больше времени уделял docker-compose и при попытке выполнить задачу на голом docker я столкнулся с рядом трудностей.




Решение:

Для начала просто устанавливаем docker 
Сложностей с этим быть не должно, хоть с докером под виндой существует целый ворох проблем, для нашей простой задачки все будет хорошо. Не забудьте включить поддержку виртуализации в биос.

Что бы запустить правильный контейнер где все будет хорошо выполняем команду:

docker run -d -p 3306:3306 -v "//C/Users/db/test:/var/lib/mysql" --name mysql -e MYSQL_ROOT_PASSWORD=1234 mysql

Далее смотрим логи по команде
docker logs mysql и убеждаемся что все хорошо. Скорее всего, у вас что-то будет не так. Что бы понять в чем загвоздка нужно понимать параметры которые мы написали в команде.
Разбираем
docker run - запуск контейнера
-d - говорим что б он запустился в демоне (как служба, что бы при закрытии консоли контейнер продолжил работать)
-p 3306-3306 - проброс портов из контейнера в хостовую систему. Если мы этого не сделаем - достучаться до mysql сервера из хоста не получится. Имейте ввиду, если вы проводили вагон других испытаний, в т.ч. с попытками поставить сервер mysql на винду, нужно обязательно остановить все процессы и освободить порт 3306. Либо использовать другой порт, что не очень хорошо для человека который будет в последствие с этим всем работать.
-v "//C/Users/db/test:/var/lib/mysql" - самый сложный для моего понимания параметр. Тут мы указываем какую папку из хостовой системы пробросить в контейнер docker. Обратите внимание, путь в винде мы указываем именно таким образом //C/Users/.... - никаких C:\ и мы можем прокинуть только домашние директории пользователя Windows. По умолчанию в докере разрешено на хостовой системе windows пробрасывать только home dir. Второй важный момент - конечная папка на хосте должна быть пустой. Иначе контейнер ругнётся. Так же нужно запомнить, что сначала указываем папку на хосте, потом, через двоеточие - директорию в контейнере. Вспомним про нашу задачу - нам нужен mysql сервер с базами данных доступными из хоста. Значит в параметре нам нужно указать путь до места где docker контейнер хранит базы данных mysql. Для линукса это стандартный путь /var/lib/mysql. Если этого всего не сделать, то данные в контейнере не будут сохраняться (дисклеймер - я не продвинутый пользователь docker и в некоторых своих рассуждениях я могу ошибаться, если узнаю что я где-то не прав, обязательно поправлюсь).
--name mysql - задаем имя нашему контейнеру что бы удобно к нему обращаться.
-e MYSQL_ROOT_PASSWORD=1234 - задаем пароль от рута mysql. Если этого не сделать, контейнер сгенерит рандомный пароль от пользователя mysql, к тому же, по умолчанию через него нельзя будет подключиться из хоста (пользователь root в mysql по умолчанию может подключаться к базе только с локалхоста, т.е. в нашем случае только внутри контейнера)
mysql - последний параметр отвечающий за то, какой образ докера нам взять. Он их качает с докерхаба, где разработчики разных приложений выкладывают готовые и облегченные образы докера для работы. Нам нужен mysql потому мы так и написали.

Теперь входим в контейнер
docker exec -it mysql bash
и попадаем в консоль контейнера, идем проверяем смонтировалось ли у нас все как надо
ls -la /var/lib/mysql
и должны увидеть папку test (которая проброшена с хоста)
Ура, все получилось, теперь зайдем в mysql создадим новую базу и импортируем дамп в нее.
mysql -uroot -p1234
create database blablabla;
exit

Теперь нужно в эту базу импортировать дамп
mysql -uroot -p1234 blablabla< /var/lib/mysql/blablabla.sql.txt

вот и все. Можем останавливать контейнер и запускать и все будет на своих местах. А в воркбенче просто подключаемся к localhost 3306 и работаем с базой blablabla

Комментариев нет:

Отправить комментарий