Как подключиться к mysql в docker
Перейти к содержимому

Как подключиться к mysql в docker

  • автор:

Использование 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

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

Учебник. Создание многоконтейнерных приложений с помощью MySQL и Docker Compose

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

  • Запустите MySQL.
  • Запуск приложения с помощью MySQL.
  • Создание файла Compose.
  • Запуск стека приложений.

Diagram shows two containers labeled Todo App and MySQL connected with a line.

Использование нескольких контейнеров позволяет выделить контейнеры для специализированных задач. Каждый контейнер должен качественно выполнять одно действие.

Ниже приведены некоторые причины, по которым может быть целесообразно использовать многоконтейнерные приложения.

  • Отдельные контейнеры позволяют управлять интерфейсами API и внешними элементами иначе, чем это делают базы данных.
  • Контейнеры позволяют изолировать и обновлять версии.
  • Хотя контейнер для базы данных можно использовать локально, может потребоваться прибегнуть к управляемой службе для базы данных в рабочей среде.
  • Для выполнения нескольких процессов требуется диспетчер процессов, что усложняет запуск и завершение работы контейнера.

Необходимые компоненты

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

Вам также понадобятся следующее.

    Docker Compose. Docker Compose входит в состав Docker Desktop для Windows или Mac. Выполните эту команду, чтобы проверить следующее:

docker-compose version 

Как и в предыдущих учебниках, большинство задач можно выполнить в представлении ОБОЗРЕВАТЕЛЬ или представлении DOCKER в VS Code. Выберите пункты Терминал>Новый терминал, чтобы открыть окно командной строки в VS Code. Кроме того, команды можно выполнять в окне Bash. Если не указано иное, в окне Bash или в терминале VS Code можно выполнять любую команду, помеченную как Bash.

Запустите MySQL.

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

Если два контейнера находятся в одной сети, они могут взаимодействовать друг с другом. В противном случае они не могут.

Существует два способа размещения контейнера в сети: назначить его при запуске или подключить существующий контейнер. В этом примере вы создадите сеть и подключите контейнер MySQL при запуске.

    Создайте сеть с помощью этой команды.

docker network create todo-app 
docker run -d --network todo-app --network-alias mysql -v todo-mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD= -e MYSQL_DATABASE=todos mysql:5.7 
docker exec -it mysql -p 
SHOW DATABASES; 

Вы должны увидеть следующие выходные данные.

+--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | todos | +--------------------+ 5 rows in set (0.00 sec) 

Запуск приложения с помощью MySQL

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

  • MYSQL_HOST — имя узла для сервера MySQL.
  • MYSQL_USER — имя пользователя, используемое для подключения.
  • MYSQL_PASSWORD — пароль, используемый для подключения.
  • MYSQL_DB — база данных, которая будет использоваться после подключения.

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

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

Эта процедура запускает приложение и подключает этот контейнер к вашему контейнеру MySQL.

    Используйте следующую команду docker run. Она указывает переменные среды, приведенные выше.

docker run -dp 3000:3000 -w /app -v $:/app --network todo-app -e MYSQL_HOST=mysql -e MYSQL_USER=root -e MYSQL_PASSWORD= -e MYSQL_DB=todos node:20-alpine sh -c "yarn install && yarn run dev" 
# Previous log messages omitted $ nodemon src/index.js [nodemon] 1.19.2 [nodemon] to restart at any time, enter `rs` [nodemon] watching dir(s): *.* [nodemon] starting `node src/index.js` Connected to mysql db at host mysql Listening on port 3000 
docker exec -ti mysql -p todos 

В оболочке MySQL выполните следующие команды.

use todos; select * from todo_items; 

Результат будет выглядеть так, как показано ниже.

+--------------------------------------+--------------------+-----------+ | id | name | completed | +--------------------------------------+--------------------+-----------+ | c906ff08-60e6-44e6-8f49-ed56a0853e85 | Do amazing things! | 0 | | 2912a79e-8486-4bc3-a4c5-460793a575ab | Be awesome! | 0 | +--------------------------------------+--------------------+-----------+ 

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

Создание файла Docker Compose

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

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

  1. В корне проекта приложения создайте файл с именем docker-compose.yml .
  2. Написание файла Compose начнем с определения версии схемы.

version: "3.7" 
version: "3.7" services: 

Совет В YML-файлах важен отступ. При редактировании в VS Code технология IntelliSense указывает на ошибки.

docker run -dp 3000:3000 -w /app -v $:/app --network todo-app -e MYSQL_HOST=mysql -e MYSQL_USER=root -e MYSQL_PASSWORD= -e MYSQL_DB=todos node:20-alpine sh -c "yarn install && yarn run dev" 

Определите запись службы и образ для контейнера.

version: "3.7" services: app: image: node:20-alpine 
version: "3.7" services: app: image: node:20-alpine command: sh -c "yarn install && yarn run dev" 
version: "3.7" services: app: image: node:20-alpine command: sh -c "yarn install && yarn run dev" ports: - 3000:3000 
version: "3.7" services: app: image: node:20-alpine command: sh -c "yarn install && yarn run dev" ports: - 3000:3000 working_dir: /app volumes: - ./:/app 
version: "3.7" services: app: image: node:20-alpine command: sh -c "yarn install && yarn run dev" ports: - 3000:3000 working_dir: /app volumes: - ./:/app environment: MYSQL_HOST: mysql MYSQL_USER: root MYSQL_PASSWORD: MYSQL_DB: todos 
docker run -d --network todo-app --network-alias mysql -v todo-mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD= -e MYSQL_DATABASE=todos mysql:5.7 

Определите новую службу и назовите ее mysql. Добавьте текст после определения app на том же уровне отступа.

version: "3.7" services: app: # The app service definition mysql: image: mysql:5.7 
version: "3.7" services: app: # The app service definition mysql: image: mysql:5.7 volumes: - todo-mysql-data:/var/lib/mysql volumes: todo-mysql-data: 
version: "3.7" services: app: # The app service definition mysql: image: mysql:5.7 volumes: - todo-mysql-data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: MYSQL_DATABASE: todos volumes: todo-mysql-data: 

На данный момент этапе полный файл docker-compose.yml выглядит следующим образом:

version: "3.7" services: app: image: node:20-alpine command: sh -c "yarn install && yarn run dev" ports: - 3000:3000 working_dir: /app volumes: - ./:/app environment: MYSQL_HOST: mysql MYSQL_USER: root MYSQL_PASSWORD: MYSQL_DB: todos mysql: image: mysql:5.7 volumes: - todo-mysql-data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: MYSQL_DATABASE: todos volumes: todo-mysql-data: 

Запуск стека приложений

Теперь, когда у вас есть файл docker-compose.yml , попробуйте поработать с ним.

  1. Убедитесь, что никакие другие копии приложения и базы данных не запущены. В расширении Docker щелкните правой кнопкой мыши любой выполняющийся контейнер и выберите команду Удалить. Или в командной строке используйте команду docker rm , как в предыдущих примерах.
  2. В Обозревателе VS Code щелкните правой кнопкой мыши файл docker-compose.yml и выберите Создать. Или в командной строке используйте эту команду Docker.

docker-compose up -d 

Параметр -d позволяет выполнять команду в фоновом режиме. Вы должны увидеть выходные данные, аналогичные приведенным ниже.

[+] Building 0.0s (0/0) [+] Running 2/2 ✔ Container app-app-1 Started 0.9s ✔ Container app-mysql-1 Running 
mysql_1 | 2019-10-03T03:07:16.083639Z 0 [Note] mysqld: ready for connections. mysql_1 | Version: '5.7.27' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL) app_1 | Connected to mysql db at host mysql app_1 | Listening on port 3000 

Когда вы завершите работу с этими контейнерами, их легко можно будет удалить.

  • В Обозревателе VS Code щелкните правой кнопкой мыши файл docker-compose.yml и выберите Удалить.
  • В командной строке выполните команду docker-compose down .

Контейнеры останавливаются. Сеть удаляется.

По умолчанию именованные тома в файле Compose не удаляются. Чтобы удалить тома, выполните команду docker-compose down --volumes .

Очистка ресурсов

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

Следующие шаги

Из этого учебника вы узнали о многоконтейнерных приложениях и Docker Compose. Docker Compose существенно упрощает определение и совместное использование приложений с несколькими службами.

Ниже приведены некоторые ресурсы, которые могут быть полезны:

Как развернуть и использовать Docker-контейнер с MySQL

Большое количество веб-приложений и сервисов зависят от баз данных. И скорее всего, ваш бизнес зависит от веб-приложений и сервисов. Если вы не хотите выделять отдельный сервер, чтобы разместить на нем базу данных, всегда можно воспользоваться контейнерами. И хотя для приложений enterprise-масштаба, это может быть не лучшей идей, но для инстансов небольшого или среднего размера это может хорошим решением. Особенно, если нет доступного железа, чтобы выделить его под сервер для баз данных.

Дабы облегчить вашу участь, я покажу процесс развертывания Docker-контейнера с MySQL, чтобы к нему можно было подключиться из другого контейнера или приложения. Допустим, у вас уже установлен Docker (инструкции по установке можно найти на сайте Docker). Я буду использовать Ubuntu 16.10 Server, но шаги будут одинаковы вне зависимости от ОС.

Пулим образ

Прежде всего, надо спулить правильный образ. Мне нужна последняя версия MySQL. Если нужна какая-то конкретная версия, то надо надо заменить тег latest, на нужную версию (5.5, 5.6, 5.7, 8.0). Вводим команду: docker pull mysql/mysql-server:latest

Разворачиваем контейнер

Поскольку у вас есть образ MySQL на машине, можно разворачивать контейнер. Делается это командой: docker run --name=mysql01 -d mysql/mysql-server:latest

В этом примере мы называем контейнер mysql01, вы можете назвать так, как вам хочется.

Теперь можно ввести docker ps , чтобы убедиться, что контейнер с MySQL запущен.

Пароль для MySQL

После установки MySQL на Linux вам будет предложено создать админский пароль базы данных. Но мы уже развернули docker-контейнер, в котором уже установлена и запущена БД. Но какой от нее смысл без пароля? К счастью, во время развертывания был установлен случайный пароль. Чтобы увидеть пароль, воспользуйтесь командой docker logs *имя_контейнера*

Логин на сервер MySQL

Теперь надо зайти на контейнеризованный сервер. Сделать это можно с помощью команды docker exec -it mysql01 mysql -uroot -p. Вас спросят пароль, используйте пароль полученный в предыдущем шаге. Уже на сервере можно поменять пароль командой: ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘newpassword’;

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

Заключение

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

MySQL в Docker — как подключиться?

Но вот войти локально, не получается:
$ mysql -h 127.0.0.1 -u root -p
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)
$ mysql -h localhost -u root -p
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

При попытке подключиться к MySQL через PDO:
(HY000/2002): Connection refused in

Как подключиться к MySQL в докере?

  • Вопрос задан более трёх лет назад
  • 6676 просмотров

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

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