Подключение к локальной базе MySQL из контейнера Docker
Система на win 10. На ней установлен MySQL сервер. Через докер создан контейнер. На нем будет запускаться всякий Python код, получать данные и отправлять их из среды контейнера на локальный MySQL сервер. Как такое подключение организовать? Сейчас при выполнении кода в контейнере получаю ошибку:([Errno 111] Connection refused) Подключение происходит через библиотеки sqlalchemy и pymysql — Python код — create_engine(‘mysql+pymysql://
Отслеживать
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.
- Запуск стека приложений.

Использование нескольких контейнеров позволяет выделить контейнеры для специализированных задач. Каждый контейнер должен качественно выполнять одно действие.
Ниже приведены некоторые причины, по которым может быть целесообразно использовать многоконтейнерные приложения.
- Отдельные контейнеры позволяют управлять интерфейсами 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, можно создать файл для определения служб. С помощью одной команды можно выполнить запуск или завершить работу.
Вы можете определить стек приложений в файле и разместить его в корне репозитория проекта в системе управления версиями. В этом случае другие пользователи смогут участвовать в разработке вашего проекта. Им потребуется лишь клонировать репозиторий.
- В корне проекта приложения создайте файл с именем docker-compose.yml .
- Написание файла 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 , попробуйте поработать с ним.
- Убедитесь, что никакие другие копии приложения и базы данных не запущены. В расширении Docker щелкните правой кнопкой мыши любой выполняющийся контейнер и выберите команду Удалить. Или в командной строке используйте команду docker rm , как в предыдущих примерах.
- В Обозревателе 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
Тебе надо установить либо одну сущность либо две. Что проще? При этом во втором случае ты ставишь еще и условный черный ящик, через который придется коммуницировать с первой сущностью.