(Вероятно, это глупый вопрос из-за моих ограниченных знаний в области администрирования Docker или mysql, но, поскольку я потратил на эту проблему целый вечер, осмелюсь задать его.)
В двух словах
Я хочу запустить mysql в контейнере докеров и подключиться к нему с моего хоста. На данный момент лучшее, что я достиг:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
Подробнее
Я использую следующее Dockerfile
:
FROM ubuntu:14.04.3
RUN apt-get update && apt-get install -y mysql-server
# Ensure we won't bind to localhost only
RUN grep -v bind-address /etc/mysql/my.cnf > temp.txt \
&& mv temp.txt /etc/mysql/my.cnf
# It doesn't seem needed since I'll use -p, but it can't hurt
EXPOSE 3306
CMD /etc/init.d/mysql start && tail -F /var/log/mysql.log
В каталоге, где находится этот файл, я могу успешно создать образ и запустить его с помощью:
> docker build -t my-image .
> docker run -d -p 12345:3306 my-image
Когда я прикрепляю к изображению, кажется, что он работает нормально:
# from the host
> docker exec -it <my_image_name> bash
#inside of the container now
$ mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
[...]
Однако я не добился большого успеха от хозяина:
> mysql -P 12345 -uroot
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
Еще больше деталей
- Я видел, что есть вопрос, похожий на мой . Однако это не то же самое (и на него все равно нет ответов)
- Я видел, что есть изображения, посвященные mysql , но я не добился большего успеха с ними
- Это
grep -v
может показаться странным. По общему признанию, может быть более чистый способ сделать это. Но когда я прикрепляю свое изображение, я вижу, что оно действительно работает, как ожидалось (то есть: удаленоbind-address
). И я вижу в контейнере/var/log/mysql/error.log
:
Имя хоста сервера (адрес привязки): '0.0.0.0'; порт: 3306 - «0.0.0.0» преобразуется в «0.0.0.0»; Серверный сокет создан на IP: '0.0.0.0'.
mysql
docker
dockerfile
гтурри
источник
источник
Ответы:
Если ваш хост Docker MySQL работает правильно, вы можете подключиться к нему с локального компьютера, но вы должны указать хост, порт и протокол следующим образом:
Измените 3306 на номер порта, который вы перенаправили из контейнера Docker (в вашем случае это будет 12345).
Поскольку вы запускаете MySQL внутри контейнера Docker, сокет недоступен, и вам необходимо подключиться через TCP. Установка "--protocol" в команде mysql изменит это.
источник
--socket=/var/run/mysqld/mysqld.sock
2. Смонтировать этот файл вне контейнера Docker 3. Укажите путь к сокету в клиенте MySQL с помощью--socket=/host/mysql.sock
--protocol=tcp
наконец, установил соединение. Спасибо @maniekq как за хороший ответ, так и за ваше объяснение о сокетах в вашем комментарии!Если вы используете "127.0.0.1" вместо localhost, mysql будет использовать метод tcp, и вы сможете подключить контейнер с помощью:
источник
Я рекомендую проверить docker-compose. Вот как это будет работать:
Создайте файл с именем docker-compose.yml, который выглядит так:
Далее запускаем:
Ноты:
Теперь вы можете получить доступ к консоли mysql следующим образом:
Ноты:
Вы можете передать флаг -d для запуска контейнера mysql / mariadb в автономном / фоновом режиме.
Пароль - «wp», который определен в файле docker-compose.yml.
Тот же совет, что и maniekq, но полный пример с docker-compose.
источник
--protocol=tcp
исправил все для меня. Спасибо!Самый простой способ - поделиться сокетом mysql unix с хост-машиной. Затем подключите через розетку
Шаги:
mkdir /host
docker run -it -v /host:/shared <mysql image>
./etc/my.cnf
и измените запись сокета в файле наsocket=/shared/mysql.sock
service mysql restart
в докереmysql -u root --socket=/host/mysql.sock
. Если пароль использовать параметр -pисточник
если вы запускаете докер под докер-машиной?
выполнить, чтобы получить ip:
возвращает ip для машины и попробуйте подключить mysql:
источник
Я делаю это путем запуска временного контейнера докеров на моем сервере, поэтому мне не нужно беспокоиться о том, что установлено на моем хосте. Сначала я определяю, что мне нужно (что вам следует изменить для своих целей):
Я всегда создаю новую сеть докеров, которая понадобится любым другим контейнерам:
Запустите сервер базы данных mySQL:
Захватить IP-адрес нового контейнера сервера
Откройте интерфейс командной строки для сервера:
Этот последний контейнер удалится сам по себе, когда вы выйдете из интерфейса mySQL, в то время как сервер продолжит работу. Вы также можете совместно использовать том между сервером и хостом, чтобы упростить импорт данных или сценариев. Надеюсь это поможет!
источник
Не забудьте изменить пользователя, порт и хост, чтобы они соответствовали вашим настройкам. Флаг -p требуется, если пользователь вашей базы данных настроен с паролем.
источник
Для конвертации , вы можете создать
~/.my.cnf
файл на хосте:Затем в следующий раз просто запустите
mysql
клиент mysql, чтобы открыть соединение.источник
Мне удалось подключить свой sql server5.7, работающий на моем хосте, с помощью следующей команды: mysql -h 10.10.1.7 -P 3307 --protocol = tcp -u root -p, где указанный ip - это мой IP-адрес хоста, а 3307 - это порт переадресован в mysql docker. После ввода команды введите пароль для myql. это он. Теперь вы подключили контейнер mysql docker с вашего хост-компьютера.
источник
выполните следующую команду, чтобы запустить контейнер
запустите эту команду, чтобы получить mysql db на хост-машине
в вашем случае это
источник
--protocol=tcp
флаг, как описано в нескольких других комментариях / ответах. В моем случае это сбивало с толку, потому что у меня также был запущен локальный экземпляр mysql без докеров. По умолчанию, даже если порт указан, даже если порт неверен, команда mysql будет подключаться через файл сокета к локальному экземпляру.mysql -u root -P <EXPOSED_DOCKER_PORT_HERE> -h <YOUR_HOST_IP_ADDRESS_HERE> --protocol=tcp -p
. Флаг--protocol=tcp
является ключом к выполнению этой работы.В вашем терминале запустите:
docker exec -it container_name /bin/bash
Затем:mysql
источник
ХОРОШО. Я наконец решил эту проблему. Здесь следует мое решение, используемое в https://sqlflow.org/sqlflow .
Полное решение
Чтобы сделать демонстрацию автономной, я переместил весь необходимый код на https://github.com/wangkuiyi/mysql-server-in-docker .
Ключ к решению
Я не использую официальный образ на DockerHub.com https://hub.docker.com/r/mysql/mysql-server . Вместо этого я сделал свой собственный, установив MySQL на Ubuntu 18.04. Такой подход дает мне возможность запустить mysqld и привязать его к 0.0.0.0 (все IP-адреса) .
За подробностями обращайтесь к этим строкам в моем репозитории GitHub.
Чтобы проверить мое решение
apt-get
.Подключиться из другого контейнера на том же хосте
Мы можем запустить клиент MySQL даже из другого контейнера (на том же хосте).
Подключиться с другого хоста
На моем iMac я устанавливаю клиент MySQL с помощью Homebrew.
Затем я могу получить доступ к указанному выше хосту Ubuntu (192.168.1.22).
Подключение из контейнера, запущенного на другом хосте
Я даже могу запустить клиент MySQL в контейнере на iMac, чтобы подключиться к серверу MySQL в контейнере на моей рабочей станции Ubuntu.
Особый случай
В случае, если мы запускаем клиент и сервер MySQL в отдельных контейнерах, работающих на одном и том же хосте - это может произойти, когда мы настраиваем CI, нам не нужно создавать собственный образ Docker сервера MySQL. Вместо этого мы можем использовать
--net=container:mysql_server_container_name
при запуске клиентского контейнера.Для запуска сервера
Для запуска клиента
источник
docker run -e MYSQL_ROOT_PASSWORD = pass --name sql-db -p 3306: 3306 mysql
docker exec -it sql-db bash
mysql -u корень -p
источник
ERROR 1524 (HY000): Plugin 'unix_socket' is not loaded
измените "localhost" на ваш реальный
адрес con ip, потому что он на mysql_connect ()
источник