Перейти к основному содержимому

Ошибка Docker: «Не удается подключиться к локальному серверу MySQL через сокет»

· 4 мин. чтения

1. Обзор

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

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

Теперь давайте углубимся в суть этого.

2. Развертывание контейнера MySQL

Во-первых, давайте рассмотрим шаги, связанные с развертыванием контейнера MySQL. По сути, MySQL следует архитектурной модели клиент-сервер. Здесь сервер представляет собой образ контейнера с базами данных, тогда как клиент используется для доступа к базе данных на хост-компьютере.

Мы разделили рабочий процесс развертывания на три части.

2.1. Развертывание сервера MySQL

Теперь давайте перенесем экземпляр сервера MySQL в Docker. Мы можем просто создать контейнер на основе образа MySQL, полученного из Docker Hub. Есть два момента, которые мы должны учитывать при выборе версии образа для получения из Docker Hub :

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

Давайте вытащим официальный образ MySQL из Docker Hub с помощью команды docker pull :

$ docker pull mysql:latest
latest: Pulling from library/mysql
f003217c5aae: Pull complete

… output truncated …

70f46ebb971a: Pull complete
db6ea71d471d: Waiting
c2920c795b25: Downloading [=================================================> ] 105.6MB/107.8MB
26c3bdf75ff5: Download complete

Обычно изображения представляют собой отдельные слои, тесно связанные в упорядоченной форме, как описано в файле манифеста . Наша команда docker pull получит слои образов из хранилища BLOB-объектов и автоматически создаст образ с помощью файла манифеста :


… output truncated …

4607fa685ac6: Pull complete
Digest: sha256:1c75ba7716c6f73fc106dacedfdcf13f934ea8c161c8b3b3e4618bcd5fbcf195
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest

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

Без лишних слов давайте запустим контейнер. Команда docker run обычно создает слой контейнера с возможностью записи поверх слоев образа . Нам нужно указать имя контейнера с помощью аргумента -name и использовать образ MySQL с последним тегом. Далее мы установим пароль сервера MySQL через переменную окружения MYSQL_ROOT_PASSWORD. В нашем случае пароль установлен «foreach».

Наконец, параметр -d помогает нам запустить контейнер как демон. Вывод выдает еще один хеш-код для будущего управления контейнерами:

$ docker run --name bael-mysql-demo -e MYSQL_ROOT_PASSWORD=foreach -d mysql:latest
fedf880ce2b690f9205c7a37f32d75f669fdb1da2505e485e44cadd0b912bd35

Мы можем увидеть все запущенные контейнеры на хосте с помощью команды ps :

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fedf880ce2b6 mysql:latest "docker-entrypoint.s…" 17 seconds ago Up 16 seconds 3306/tcp, 33060/tcp bael-mysql-demo

2.2. Установка клиента MySQL

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

$ sudo apt install mysql-client -y
Reading package lists... Done
Building dependency tree
Reading state information... Done
mysql-client is already the newest version (5.7.37-0ubuntu0.18.04.1).

… output truncated …

Теперь давайте включим извлечение пути установки и версии клиента MySQL:

$ which mysql
/usr/bin/mysql
$ mysql --version
mysql Ver 14.14 Distrib 5.7.37, for Linux (x86_64) using EditLine wrapper

2.3. Установить связь

Далее авторизуемся на сервере с помощью установленного клиента. Традиционно мы используем команду MySQL с именем пользователя и паролем для входа на сервер. Однако в случае контейнерных решений это не сработает :

$ mysql -u root -p
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

Мы закончим с ошибками сокета, как показано выше. Здесь важно понимать, что сервер MySQL — это контейнер, а не просто установленный на хост-компьютере. Как подчеркивалось в предыдущем разделе, контейнеры — это облегченные серверы со своими собственными вычислительными ресурсами, сетью и хранилищем.

Команда inspect помогает выделить IP-адрес экземпляру сервера MySQL:

$ docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' bael-mysql-demo
172.17.0.2

Давайте укажем указанный выше IP-адрес в опции хоста клиента с номером порта по умолчанию и типом протокола TCP:

$ mysql -h 172.17.0.2 -P 3306 --protocol=tcp -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.

… output truncated …

mysql>
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)

mysql> exit
Bye

Поздравляем, мы успешно вошли на сервер MySQL!

3. Заключение

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