Почему docker mysql не сохраняет базу данных
Перейти к содержимому

Почему docker mysql не сохраняет базу данных

  • автор:

phpMyAdmin не сохраняет данные

Моя задача заключалась в том, чтобы с помощью docker обернуть мое приложение с базой данных в контейнеры. Для мониторинга базы данных использовался phpMyAdmin. Финальный стек: MySQL + Docker + phpMyAdmin + Java + Hibernate. Мой docker-compose.yml файл:

version: "3" services: db: image: mysql:8.0.18 restart: always environment: MYSQL_USER: root MYSQL_PASSWORD: root MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: usersDB ports: - '3306:3306' volumes: - mysql-data:/var/lib/mysql phpmyadmin: image: phpmyadmin:latest restart: always ports: - '8080:80' environment: - PMA_ARBITRARY=1 volumes: mysql-data: 

hibernate.cfg.xml файл:

    jdbc:mysql://localhost:3306/usersDB?createDatabaseIfNotExist=true com.mysql.cj.jdbc.Driver root root org.hibernate.dialect.MySQL8Dialect update   

После запуска программы и проверки работы базы данных оказывается, что данные записываются локально в MySQL Workbench, а на phpMyAdmin ничего нет. Абсолютно пусто. MySQL Workbench phpMyAdmin docker ps

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

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

10K открытий

В случае, если у вас установлен Docker, всё, что вам необходимо сделать, запустить команду в консоли:

$ docker run —name=mysql -d -p 3306:3306 mysql/mysql-server

Через несколько мгновений будет скачан образ (docker image) mysql-server и запустится контейнер с полностью функционирующей СУБД MySQL. Она будет принимать соединения на порту 3306 (параметр -p). То есть всё, одна команда, и СУБД полностью готова к использованию!

Для лучшего усвоения материала настоятельно рекомендуется сразу установить docker и выполнять команды, продемонстрированные в статье. На Windows команды будут немного отличаться из-за разных разделителей в пути.

Работа с контейнером

Докер контейнер — это изолированная среда, в которой запущена наша СУБД. Независимо от того, какая у Вас операционная система, 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. Можете запускать что угодно, на что хватит системных ресурсов.

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

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

Развернуть ветку

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

Развернуть ветку

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

Развернуть ветку

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

Развернуть ветку

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

Развернуть ветку

«Рассмотрим ситуацию, когда вам необходимо установить локально СУБД, например, 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

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

Использование Docker для MySQL сервера

В работе ИТ-инженера бывают случаи, когда надо что-то протестировать, например что-то в базе данных, а доступного сервера с базой данных нет. В то же самое время на свой компьютер не хочется ставить сервер баз данных, чтобы не засорять операционную систему машины. Выходом из ситуации является виртуализация. И не просто виртуализация, а использование контейнеров вместо полноценных виртуальных машин.

То есть, чтобы не ставить на свой компьютер ни сервер баз данных, ни вторую операционную систему в виртуальной машине Hyper-V, VMware, VirtualBox и подобных, а после чего настраивать саму гостевую ОС и нужный продукт в ней, необходимо один раз установить и настроить систему контейнеризации и использовать готовые образы с нужным программным обеспечением, которые занимают мало места и очень быстро запускаются.

В этой заметке я расскажу, как установить систему контейнеризации Docker Desktop в операционной системе Windows 10 Professional и использовать эту систему для развертывания контейнера с базой данных MySQL.

Примечание. В операционной системе Windows 10 Home установка и функционал немного отличаются, но принципы аналогичны описанному ниже. Установщик докера сам попросит доустановить нужные пакеты, которые отсутствуют в версии Home.

Итак, для установки платформы контейнеризации Docker desktop потребуется, чтобы компьютер-хост поддерживал виртуализацию. Проверить это можно в Диспетчере задач на вкладке Производительность процессора. В ней опция Виртуализация должна быть отображена Включенной (иногда хотя аппаратная часть поддерживает эту опцию, но в BIOS она выключена — необходимо зайти в BIOS и поискать что-то связанное с виртуализацией). Так же в компонентах операционной системы должны быть установлены пакеты Контейнеризации и Виртуализации Hyper-V (не все версии операционных систем поддерживают эти функции, инструкция, как установить Docker Desktop на Windows 10 Home находится тут), а сама операционная система должна быть 64-битной.

Using MySQL in Docker - 01

Если все условия для установки выполнены, то можно скачать пакет инсталляции по ссылке https://www.docker.com/products/docker-desktop и установить программу с параметрами по умолчанию.

Using MySQL in Docker - 02

Далее нужно найти программу в меню Пуск и запустить ее.

Using MySQL in Docker - 03

После успешного запуска в системном трее появится значок кита с нагруженными на него контейнерами. Щелкнув по нему правок кнопкой мыши, нужно вызвать контекстное меню, где выбрать Settings.

Using MySQL in Docker - 04

В основных настройках Докера я рекомендую отключить Автоматический запуск, Проверку обновлений и Отправку статистики, которые включены по умолчанию.

Using MySQL in Docker - 05

В разделе настройки ресурсов можно выставить параметры, сколько ресурсов от компьютера-хоста могут расходовать контейнеры (виртуальные машины).

Using MySQL in Docker - 06

Если для выхода в Интернет используется прокси-сервер, то его необходимо указать на вкладке Прокси, не забыв указать исключения из отправки пакетов на прокси-сервер.

Using MySQL in Docker - 07

В настройках сети можно изменить подсеть, используемую контейнерами (виртуальными машинами).

Using MySQL in Docker - 08

Закрыв настройки Докера, можно увидеть, что ни одного контейнера не запущено, а так же пример команды, как запустить первый контейнер.

Using MySQL in Docker - 09

Так как нас интересует контейнер с сервером MySQL, то необходимо найти этот контейнер в репозирии по ссылке https://hub.docker.com/search?q=mysql&type=image.

Using MySQL in Docker - 10

Если перейти на страницу образа, то там можно прочитать, общую информацию о продукте, как установить его, какие переменные поддерживаются и тому подобное. В документации на сайте MySQL можно так же найти информацию с командами докера, как установить и настроить контейнер с MySQL. Если требуется контейнер с Microsoft SQL сервером, то его можно найти по ссылке https://hub.docker.com/_/microsoft-mssql-server.

Ниже описан простой пример, как быстро установить контейнер с сервером MySQL и проверить его с помощью тестовой базы данных.

1. Скачать пакет с нужной версией MySQL сервера. Например, чтобы скачать версию 5.7, нужно в параметрах команды указать mysql-server:5.7. Если не указать версию, то будет поставлен параметр latest — последняя версия.

docker pull mysql/mysql-server:5.7

Using MySQL in Docker - 11

2. Запустить контейнер с MySQL сервером, указав в параметрах имя, пароль для root, язык и пакет с нужным образом.

docker run --name mysql57 -e MYSQL_ROOT_PASSWORD=passw -e LANG=C.UTF-8 -d mysql/mysql-server:5.7 docker logs mysql57

Using MySQL in Docker - 12

3. Подключиться к серверу баз данных и посмотреть имеющиеся базы данных.

docker exec -it mysql57 mysql -uroot -p SHOW DATABASES; exit

Using MySQL in Docker - 13

4. Импортировать свою базу данных (например тестовую) и выполненить нескольких запросов.

Примечание. В PowerShell эта команда не выполняется, так как символ < зарезервирован для другой команды. Эту команду лучше выполнять в обычной командной стороке CMD.

docker exec -i mysql57 mysql -uroot -ppassw < C:\Temp\MySQL_SampleDB.sql docker exec -it mysql57 mysql -uroot -ppassw SampleDB SHOW TABLES; SELECT * FROM product; exit

Using MySQL in Docker - 14

5. Посмотреть запущенные контейнеры, остановить/запустить/удалить контейнеры по его ID или имени и удалить ненужные контейнеры.

docker container ls docker stop 61cdba01396f docker container ls -a docker start mysql57 docker container stop mysql57 docker container rm 61cdba01396f

Using MySQL in Docker - 15

Тестовая установка прошла успешно. Ненужный тестовый контейнер можно удалить.

Чтобы создать контейнер с возможностью подключаться с компьютера-хоста к базе данных в контейнере, необходимо пробросить порт из контейнера в хост, а так же создать пользователя в базе данных, которому разрешено подключаться с клиентов.

Создание контейнера с последней версией MySQL сервера, с поддержкой русского языка, с заданием пароля администратора и пробросом порта 3306:

docker run --name mysql_instance -e MYSQL_ROOT_PASSWORD=passw -e LANG=C.UTF-8 -p 3306:3306 -d mysql/mysql-server:latest

Импортирование тестовой базы данных, конфигурация которой сохранена в файле MySQL_SampleDB.sql в папке C:\Temp.

docker exec -i mysql_instance mysql -uroot -ppassw < C:\Temp\MySQL_SampleDB.sql

Подключение к MySQL серверу в режиме командной строки непосредственно в контейнере

docker exec -it mysql_instance mysql -uroot -ppassw

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

CREATE USER 'dba'@'localhost' IDENTIFIED BY 'dbaPass'; GRANT ALL PRIVILEGES ON *.* TO 'dba'@'localhost' WITH GRANT OPTION; CREATE USER 'dba'@'%' IDENTIFIED BY 'dbaPass'; GRANT ALL PRIVILEGES ON *.* TO 'dba'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES; exit

Using MySQL in Docker - 16

Логи развертывание контейнера и работы базы данных можно посмотреть в графической оболочке Docker, выбрав раздел Logs нужного контейнера.

Using MySQL in Docker - 17

В разделе Inspect можно найти переменные, которые были переданы в контейнер при его создании.

Using MySQL in Docker - 18

Подключение к базе данных из программы MySQL Workbench можно выполнить, введя учетные данные пользователя (dba / dbaPass), которого создали выше, имя хоста localhost и порт 3306.

Using MySQL in Docker - 19

Консоль MySQL Workbench подключилась к базе данных в контейнере.

Using MySQL in Docker - 20

Как видно из примеров, всё работает и достаточно быстро настраивается.

�� Docker compose с постоянными данными MySQL

Важно сохранять постоянство данных для контейнеров с базами данных.

Docker предоставляет вам возможность сохранять файлы базы данных постоянными на томах Docker или хранить файлы непосредственно на хост-компьютере.

Используйте один из приведенных ниже вариантов, чтобы сохранить постоянную сохранность данных MySQL даже после воссоздания или удаления контейнеров Docker.

Вариант 1. Хранение данных MySQL на томах Docker

Тома Docker являются предпочтительным механизмом Docker для хранения постоянных данных контейнеров.

Вы можете легко создать том Docker на своем хост-компьютере и подключить его к контейнерам Docker.

docker-compose.yml:

version : ‘3’
image : mysql : 5.7
container_name : db
environment :
MYSQL_ROOT_PASSWORD : my_secret_password
MYSQL_DATABASE : app_db
MYSQL_USER : db_user
MYSQL_PASSWORD : db_user_pass
– dbdata : / var / lib / mysql

Приведенная выше конфигурация определяет один том данных с именем «dbdata», который подключен к контейнеру MySQL и смонтирован в каталоге /var/lib/mysql.

Это каталог по умолчанию, используемый MySQL для хранения всех файлов данных.

Затем выполните команду показанную ниже, чтобы запустить контейнер Docker.

docker-compose up -d
Creating network "db_default" with the default driver Creating volume "db_dbdata" with default driver Creating db . done

Вы можете просмотреть тома Docker, выполнив команду:

docker volume ls

Вариант 2 – Хранение данных MySQL на хост-машине

Мы рекомендуем использовать том docker вместо размещения файлов на хост-машине.

Но, если хотите, вы можете хранить файлы базы данных и на хост-машине.

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

Создайте каталог для хранения ваших файлов данных MySQL.

Я создаю структуру каталогов:

mkdir -p ./data/db

Затем настройте docker-compose.yml для использования ./data/db в качестве тома для хранения всех файлов, созданных сервером MySQL.

Затем создайте compose файл в текущем каталоге.

docker-compose.yml:
version: '3' services: db: image: mysql:5.7 container_name: db environment: MYSQL_ROOT_PASSWORD: my_secret_password MYSQL_DATABASE: app_db MYSQL_USER: db_user MYSQL_PASSWORD: db_user_pass ports: - "6033:3306" volumes: - ./data/db:/var/lib/mysql

После создания файла просто запустите приведенную ниже команду, чтобы запустить контейнер.

docker-compose up -d
Creating network "db_default" with the default driver Creating db . done

В этом случае контейнер MySQL создает все файлы на хост-компьютере в каталоге ./data/db.
Чтобы просмотреть эти файлы, просто запустите команду, показанную ниже.

ls -l ./data/db drwxr-x--- 2 systemd-coredump systemd-coredump 4096 Jul 1 11:07 app_db -rw-r----- 1 systemd-coredump systemd-coredump 56 Jul 1 11:07 auto.cnf -rw------- 1 systemd-coredump systemd-coredump 1676 Jul 1 11:07 ca-key.pem -rw-r--r-- 1 systemd-coredump systemd-coredump 1112 Jul 1 11:07 ca.pem -rw-r--r-- 1 systemd-coredump systemd-coredump 1112 Jul 1 11:07 client-cert.pem -rw------- 1 systemd-coredump systemd-coredump 1680 Jul 1 11:07 client-key.pem -rw-r----- 1 systemd-coredump systemd-coredump 1346 Jul 1 11:07 ib_buffer_pool -rw-r----- 1 systemd-coredump systemd-coredump 50331648 Jul 1 11:07 ib_logfile0 -rw-r----- 1 systemd-coredump systemd-coredump 50331648 Jul 1 11:07 ib_logfile1 -rw-r----- 1 systemd-coredump systemd-coredump 79691776 Jul 1 11:07 ibdata1 -rw-r----- 1 systemd-coredump systemd-coredump 12582912 Jul 1 11:07 ibtmp1 drwxr-x--- 2 systemd-coredump systemd-coredump 4096 Jul 1 11:07 mysql drwxr-x--- 2 systemd-coredump systemd-coredump 4096 Jul 1 11:07 performance_schema -rw------- 1 systemd-coredump systemd-coredump 1680 Jul 1 11:07 private_key.pem -rw-r--r-- 1 systemd-coredump systemd-coredump 452 Jul 1 11:07 public_key.pem -rw-r--r-- 1 systemd-coredump systemd-coredump 1112 Jul 1 11:07 server-cert.pem -rw------- 1 systemd-coredump systemd-coredump 1680 Jul 1 11:07 server-key.pem drwxr-x--- 2 systemd-coredump systemd-coredump 12288 Jul 1 11:07 sys

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *