SQL, Анализ данных

Эффективное использование Docker

Время прочтения: 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. Можете запускать что угодно, на что хватит системных ресурсов.

Полезные ссылки:

Советуем почитать