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

Рассмотрим ситуацию, когда вам необходимо установить локально СУБД, например, MySQL. Для этого вам необходимо: найти, откуда ее скачать, установить, настроить и запустить. Это не самый сложный процесс, но зачастую довольно трудозатратный и скучный. К счастью, есть способ намного проще.

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

0
10 комментариев
Написать комментарий...
Zoibana

очередной десятитысячный одинаковый мануал по докеру.
а есть хоть что-то новое?

Ответить
Развернуть ветку
Ludmila Vybornova

Спасибо. Вы правы, почти все уже в этом мире изучено и написано.
В этой статье наш коллега делится пошагово своим опытом работы с Docker. 

Ответить
Развернуть ветку
Zoibana

Зачем? Есть в этом тексте хоть что-то, отличающее его от тысяч других точно таких же текстов? Чем он лучше? Чем он отличается от них?
Не лучше ли написать что-то действительно полезное и нужное вместо повторения мануалов?

Ответить
Развернуть ветку
Tim Programmer

мозгодрочер

Ответить
Развернуть ветку
Татьяна Кириллова

А по-моему, хамство как раз и свидетельствует о скудности интеллекта и отсутствии элементарного воспитания. Страничкой пользуются не только «гуру», а и новички. Не интересно, ищите другие источники. Или разместите здесь свой опыт, а мы посмотрим скажет ли кто-то: вау! Вы гений!)

Ответить
Развернуть ветку
M J

Именно.  Для новичка очень даже полезно

Ответить
Развернуть ветку
yesYouStp

"Рассмотрим ситуацию, когда вам необходимо установить локально СУБД, например, MySQL. Для этого вам необходимо: найти, откуда ее скачать, установить, настроить и запустить. Это не самый сложный процесс, но зачастую довольно трудозатратный и скучный."
sudo apt install mysql-server

Рассмотрим ситуацию, когда вам скучно и хочется геморроя:
docker run --name=mysql -d -p 3306:3306 mysql/mysql-server

"Это не самый сложный процесс, но зачастую довольно трудозатратный и скучный" - у тебя интеллект выше 90?

Чем это
sudo apt install mysql-server
трудозатратнее, чем это?
docker run --name=mysql -d -p 3306:3306 mysql/mysql-server

Тебе надо установить либо одну сущность либо две. Что проще? При этом во втором случае ты ставишь еще и условный черный ящик, через который придется коммуницировать с первой сущностью.

Ответить
Развернуть ветку
Sano

ну докер гораздо удобнее
- можно запускать различные версии для различных проектов
- docker-compose конфиг позволит поднимать все необходимые зависимости одной командой
- скопировать на другой комп один проект становиться тривиальной задачей

Ответить
Развернуть ветку
Дмитрий

Спасибо, как раз помогли конкретным примером, как сохранить лог-файл при закрытии контейнера.

Ответить
Развернуть ветку
NTA
Автор

Спасибо за фидбэк!

Ответить
Развернуть ветку
7 комментариев
Раскрывать всегда