Время прочтения: 5 мин.
В случае, если у вас установлен Docker, то всё, что вам необходимо сделать — запустить команду в консоли:
$ docker run --name=mysql -d -p 3306:3306 mysql/mysql-server
Через несколько мгновений будет скачан образ (docker image) mysql-server и запустится контейнер с полностью функционирующей СУБД MySQL. Она будет принимать соединения на порту 3306 (параметр -p). То есть всё, одна команда, и СУБД полностью готова к использованию!
Для лучшего усвоения материала настоятельно рекомендуется сразу установить docker и выполнять команды, продемонстрированные в статье. На Windows команды будут немного отличаться из-за разных разделителей в пути.
Установка docker:
Работа с контейнером
Докер контейнер — это изолированная среда, в которой запущена наша СУБД. Независимо от того, какая у Вас операционная система, MySQL “думает”, что он запущен на ОС Alpine Linux, он “видит” только те файлы, которые мы скажем, может использовать только тот объем оперативной памяти и ЦПУ, который мы ему позволим.
Контейнер создается из образа (docker image), который в нашем случае был скачан с DockerHub. Образы можно создавать самому и это несложно, но рассмотрим это позже.
Запустите команду $ docker ps, выводящую список запущенных докер-контейнеров
Вы увидите, что Вашему контейнеру присвоен уникальный ID (CONTAINER ID) и имя “mysql” (мы его задали сами при помощи флага —name=mysql). Также указан докер-образ (IMAGE), из которого сделан наш контейнер. STATUS — показывает статус контейнера. Если в контейнере все хорошо, то значение статуса будет “Up”.
docker logs
Чтобы посмотреть логи нашего сервера БД, выполним простую команду:
$ docker logs mysql
Из логов можно получить наш пароль для root пользователя (GENERATED ROOT PASSWORD), скопируйте его куда-нибудь, он еще пригодится.
docker exec
Приступаем к работе с нашей базой данных. Если бы мы запустили MySQL на нашем компьютере без докера, то, чтобы войти в mysql, нам нужно было бы выполнить такую команду:
$ mysql -uroot -p
Мы можем выполнять команды в нашем контейнере точно также, как мы это делаем и в терминале/консоли нашей операционной системы. Для этого надо использовать инструкцию такого вида:
$ docker exec -it [имя_контейнера] [команда]
Мы знаем, что имя нашего контейнера — “mysql”, значит делаем так:
$ docker exec -it mysql mysql -uroot -p
MySQL спросит пароль, который мы запомнили, выполняя команду docker logs. После ввода пароля мы попадаем в консоль mysql в нашем контейнере.
Флаг —it означает “Интегрировать терминал”. То есть наша консоль/терминал уже будет внутри контейнера.
Давайте выполним базовые запросы: зададим новый пароль для root и создадим базу данных “mydb”
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'старый пароль'
mysql> CREATE DATABASE mydb;
В моем случае это выглядит так:
Можно создавать таблицы, наполнять их данными и, например, подключаться к базе данных по адресу localhost:3306. Она полностью готова к использованию.
docker stop, docker start и docker rm
Пора выйти из контейнера обратно в нашу привычную консоль. Обычно это сочетание клавиш CTRL+D. Теперь мы опять можем работать с docker, а не только с mysql. Пора остановить контейнер
$ docker stop mysql
Наш контейнер остановлен, база данных больше не доступна на localhost: 3306. Контейнер больше не использует ЦПУ и память, но он не удален. Это означает, что в любой момент времени мы можем использовать команду:
$ docker start mysql
И меньше, чем через секунду наш MySQL опять работает, и наша база данных “mydb” никуда не пропала! Сделаем вывод — можно хранить контейнеры локально и запускать их, когда они нужны через простой интерфейс docker stop/start. Это удобно для локальных сред разработки. Docker часто используется для интеграционных тестов.
Чтобы удалить контейнер:
$ docker rm mysql
После этого контейнер удаляется, наша база данных “mydb” тоже удалена. Если она содержала какие-то данные, то они тоже пропали.
Volumes. Монтируем директорию в контейнер
Логичный вопрос — а как сохранить данные после удаления контейнера? Все просто — нам нужно смонтировать директорию в контейнер при его запуске ($ docker run).
Нам нужно добавить флаг -v или —volume
$ docker run --name=mysql -d -p 3306:3306 -v ~/mysql_data:/var/lib/mysql mysql/mysql-server
-v ~/mysql_data:/var/lib/mysql означает что директория ~/mysql_data на нашей машине смонтирована в директорию /var/lib/mysql внутри контейнера. Всё, что находилось в нашей директории ~/mysql_data при старте контейнера попадет в директорию /var/lib/mysql. В процессе работы контейнера эти директории будут синхронизироваться. То есть если какие-то данные будут изменены в MySQL, то и данные в ~/mysql_data также будут изменены.
Если контейнер удалить, то данные никуда не пропадут. Они будут находиться в директории ~/mysql_data.
Заключение
Мы рассмотрели важные аспекты использования docker для локальной разработки. Но раскрыли далеко не весь потенциал.
Исследуйте DockerHub и Вы найдете множество полезных образов, из которых можете запустить контейнер. У вас не установлен Python, а вам срочно нужно запустить программу на нем? Пожалуйста, вы уже знаете, что делать. Занимаетесь машинным обучением? Вот TensorFlow. Есть даже образ, в котором, по мнению автора и многих других, есть вообще всё, что нужно для машинного обучения — dl-docker. Можете запускать что угодно, на что хватит системных ресурсов.
Полезные ссылки: