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

Docker mysql как подключиться к базе данных

  • автор:

Подключение к локальной базе MySQL из контейнера Docker

Система на win 10. На ней установлен MySQL сервер. Через докер создан контейнер. На нем будет запускаться всякий Python код, получать данные и отправлять их из среды контейнера на локальный MySQL сервер. Как такое подключение организовать? Сейчас при выполнении кода в контейнере получаю ошибку:([Errno 111] Connection refused) Подключение происходит через библиотеки sqlalchemy и pymysql — Python код — create_engine(‘mysql+pymysql://:@:/’) Уже пытался создать новое соединение через MySQL Workbench указывая адрес контейнера — не помогло. В конфиг ~\ProgramData\MySQL\MySQL Server 8.0\my.ini добавлял bind-address=0.0.0.0 — не помогло.

Отслеживать
captainsadday
задан 6 апр 2021 в 10:08
captainsadday captainsadday
3 3 3 бронзовых знака

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Чтобы подлючиться из контейнера к базе, которая запущена на хосте, можно воспользоваться host.docker.internal (Docs), т.е. в вашем случает эту строку нужно вставить вместо ip .

Отслеживать
ответ дан 6 апр 2021 в 10:22
Exploding Kitten Exploding Kitten
5,462 2 2 золотых знака 18 18 серебряных знаков 24 24 бронзовых знака

  • python
  • mysql
  • docker
  • sqlalchemy
  • pymysql
    Важное на Мете
Связанные
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.8.3130

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

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 в докере?

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

Учебник. Создание многоконтейнерных приложений с помощью 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. Для этого вам необходимо: найти, откуда ее скачать, установить, настроить и запустить. Это не самый сложный процесс, но зачастую довольно трудозатратный и скучный. К счастью, есть способ намного проще.

В случае, если у вас установлен 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. Можете запускать что угодно, на что хватит системных ресурсов.

11K открытий
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

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

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

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