Как запустить MySQL в контейнере Docker
Контейнеры Docker позволяют быстро запускать новые приложения, не загрязняя вашу систему зависимостями. База данных MySQL является общим требованием для веб-приложения. Вот как запустить новый экземпляр MySQL в Docker всего за несколько минут.
Начиная
Официальный образ MySQL на Docker Hub предоставляет все необходимое для начала работы. Изображения доступны для версий MySQL 5.6, 5.7 и 8.0. Укажите тот, который вы хотите использовать в качестве тега изображения:
docker pull mysql:8.0
Перед развертыванием вам необходимо настроить том Docker или выполнить привязку монтирования для сохранения базы данных. В противном случае ваши данные будут потеряны при перезапуске контейнера. Монтирование должно выполняться в /var/lib/mysql
внутри контейнера.
Вам также необходимо установить пароль для пользователя root MySQL. Используйте переменную среды MYSQL_ROOT_PASSWORD
. MySQL откажется инициализироваться, если эта переменная не установлена. Попробуйте выбрать безопасный пароль.
Вот как запустить MySQL, удовлетворяя этим требованиям:
docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=secret -v $HOME/mysql-data:/var/lib/mysql -d mysql:8.0
Процедура первого запуска MySQL займет несколько секунд. Вы можете проверить, работает ли база данных, запустив docker logs my-mysql
. Найдите строку, содержащую готово для подключения
.
Докер Сочинять
Команда docker run
может быстро стать длинной, особенно если у вас есть сложные требования к конфигурации. Написание файла docker-compose.yml
более удобно в сопровождении. Вот пример:
version: "3"
services:
mysql:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD
volumes:
- mysql:/var/lib/mysql
volumes:
mysql:
Вы можете запустить MySQL, используя MYSQL_ROOT_PASSWORD=secure docker-compose up -d
.
Подключение к MySQL
Вы можете получить интерактивную оболочку MySQL, подключившись к контейнеру и выполнив команду mysql
. Это обеспечивает полный интерфейс командной строки MySQL, так что вы можете использовать все знакомые команды и флаги.
docker exec -it my-mysql mysql -p
Эта команда открывает оболочку от имени пользователя root и запрашивает пароль.
Чтобы импортировать файл SQL из вашей файловой системы, вы можете передать его в команду:
docker exec -it my-mysql mysql -psecret database_name < path-to-file.sql
Вы должны настроить привязку порта, если хотите получить доступ к MySQL с вашего хоста. Привяжите порт хоста к порту контейнера 3306. Добавьте следующее в файл docker-compose.yml
в определении службы mysql
:
ports:
- 33060:3306
Это свяжет порт 33060 на вашем хост-компьютере с портом 3306 контейнера. Если вы не используете Docker Compose, передайте -p 33060:3306
в docker run
при запуске ваш контейнер. Теперь вы сможете подключаться к localhost:33060
с помощью клиентов MySQL, работающих на вашем хосте.
Если вам нужно подключиться из другого контейнера Docker, лучше всего использовать Docker Compose. Определите другую службу для нового контейнера. Оба контейнера будут существовать в одной сети Docker. Вы сможете подключиться, используя порт 3306 на имени хоста контейнера MySQL (это соответствует имени службы, определенному в вашем файле Compose).
Автоматическое создание базы данных и пользователя
Образы MySQL Docker поддерживают необязательные переменные среды, которые позволяют управлять настройкой базы данных при первом запуске. Установите эти переменные для автоматической подготовки новой пустой базы данных и учетной записи пользователя:
MYSQL_DATABASE
— имя схемы базы данных, создаваемой при первой инициализации сервера.MYSQL_USER
иMYSQL_PASSWORD
— создайте новую начальную учетную запись пользователя отдельно для пользователяroot
. Если вы также зададите переменнуюMYSQL_DATABASE
, вашей новой учетной записи пользователя будут автоматически предоставлены все привилегии для вновь созданной базы данных.MYSQL_RANDOM_ROOT_PASSWORD
— установите эту переменную, чтобы MySQL автоматически генерировал новый пароль для пользователяroot
. Это заменяет переменнуюMYSQL_ROOT_PASSWORD
. Сгенерированный пароль будет передан в стандартный поток вывода при первом запуске. По этой причине следует соблюдать осторожность при использовании этой переменной в средах CI — пароль может быть виден всем, у кого есть доступ к журналам заданий!
Исходные файлы первого запуска
У вас часто будут таблицы и данные, которые вы хотите добавить в базу данных, как только она будет создана. Образы MySQL настроены на поиск файлов .sh
, .sql
и .sql.gz
в /docker-entrypoint контейнера. -initdb.d
каталог.
Все найденные файлы будут выполняться последовательно. Порядок всегда будет в алфавитном порядке. Вы можете использовать префиксы имен файлов (например, 1-seed_tables.sql
/2-seed_data.sql
), чтобы операции выполнялись в заданном порядке.
Этот механизм позволяет легко заполнить ваш новый экземпляр базы данных начальными данными. Вы можете написать свой собственный Dockerfile, используя MySQL в качестве базового образа, и добавить исходные файлы в /docker-entrypoint-initdb.d
. В качестве альтернативы привяжите каталог монтирования на вашем хосте к каталогу контейнера.
MySQL будет игнорировать файлы инициализации, если в каталоге данных нет базы данных. Очистка содержимого вашего каталога данных вызовет новую инициализацию при перезапуске контейнера.
Настройка параметров сервера
Файлы конфигурации сервера MySQL будут загружены из /etc/mysql/conf.d
. Добавьте свои собственные файлы конфигурации в этот каталог, используя переопределение Dockerfile или привязку, чтобы настроить параметры сервера. Вы можете получить список доступных опций из руководства по MySQL Server.
Использование файла опций упрощает просмотр и редактирование вашей конфигурации в будущем. Вы регистрируете свой файл в системе контроля версий вместе с вашим проектом. Тем не менее, флаги командной строки также доступны для одноразовых настроек и экспериментов.
docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=secret -d mysql:latest --general-log=on
Этот вариант docker run
запустит MySQL с включенным общим журналом запросов. Двоичный файл mysql
является точкой входа изображения, поэтому флаги, переданные в docker run
после того, как имя изображения будет перенаправлено в mysql
.
Заключение
Запуск MySQL в Docker намного быстрее и проще, чем установка MySQL Server «на голое железо». Вы можете запускать несколько экземпляров MySQL без риска конфликта.
Официальные образы Docker поставляются с полезными параметрами конфигурации и встроенной поддержкой сидов базы данных при первом запуске. Это позволяет быстро приступить к делу, независимо от того, начинаете ли вы с нуля или используете существующую схему.