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-битной.

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

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

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

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

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

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

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

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

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

Если перейти на страницу образа, то там можно прочитать, общую информацию о продукте, как установить его, какие переменные поддерживаются и тому подобное. В документации на сайте 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

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

3. Подключиться к серверу баз данных и посмотреть имеющиеся базы данных.
docker exec -it mysql57 mysql -uroot -p SHOW DATABASES; exit

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

5. Посмотреть запущенные контейнеры, остановить/запустить/удалить контейнеры по его ID или имени и удалить ненужные контейнеры.
docker container ls docker stop 61cdba01396f docker container ls -a docker start mysql57 docker container stop mysql57 docker container rm 61cdba01396f

Тестовая установка прошла успешно. Ненужный тестовый контейнер можно удалить.
Чтобы создать контейнер с возможностью подключаться с компьютера-хоста к базе данных в контейнере, необходимо пробросить порт из контейнера в хост, а так же создать пользователя в базе данных, которому разрешено подключаться с клиентов.
Создание контейнера с последней версией 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

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

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

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

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

Как видно из примеров, всё работает и достаточно быстро настраивается.
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