Подключиться к mysql в контейнере докера с хоста

(Вероятно, это глупый вопрос из-за моих ограниченных знаний с администрацией 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'.

Ответ 1

Если ваш хост Docker MySQL работает правильно, вы можете подключиться к нему с локальной машины, но вы должны указать хост, порт и протокол следующим образом:

mysql -h localhost -P 3306 --protocol=tcp -u root

Измените 3306 на номер порта, который вы отправили из контейнера Docker (в вашем случае это будет 12345).

Поскольку вы используете MySQL внутри контейнера Docker, сокет недоступен, и вам нужно подключиться через TCP. Значение "--protocol" в команде mysql изменит это.

Ответ 2

Если вы используете "127.0.0.1" вместо localhost, mysql будет использовать tcp-метод, и вы должны иметь возможность подключать контейнер с помощью

mysql -h 127.0.0.1 -P 3306 -u root

Ответ 3

Простым методом является разделение сокета mysql unix на хост-машину. Затем подключитесь через сокет

Шаги:

  • Создать общую папку для хост-машины, например: mkdir /host
  • Запустите контейнер докеров с возможностью монтирования тома docker run -it -v /host:/shared <mysql image>.
  • Затем измените конфигурационный файл mysql /etc/my.cnf и измените запись сокета в файле на socket=/shared/mysql.sock
  • Перезапустить службу MySQL service mysql restart в docker
  • Наконец, подключитесь к серверу MySQL с хоста через сокет mysql -u root --socket=/host/mysql.sock. Если пароль использует опцию -p

Ответ 4

Я рекомендую проверить сборку докеров. Вот как это будет работать:

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

version: '2'

services:

  mysql:
    image: mariadb:10.1.19
    ports:
      - 8083:3306
    volumes:
      - ./mysql:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: wp

Затем запустите:

$docker-compose up

Примечания:

Теперь вы можете получить доступ к консоли mysql:

$mysql -P 8083 --protocol = tcp -u root -p

Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.5.5-10.1.19-MariaDB-1~jessie mariadb.org binary distribution

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Примечания:

  • Вы можете передать флаг -d для запуска контейнера mysql/mariadb в режиме отдельно/в фоновом режиме.

  • Пароль - это "wp", который определен в файле docker-compose.yml.

  • Тот же совет, что и maniekq, но полный пример с компоновкой docker.

Ответ 5

если вы используете докер под докер-машиной?

выполнить, чтобы получить ip:

docker-machine ip <machine>

возвращает ip для машины и пытается подключиться к mysql:

mysql -h<docker-machine-ip>

Ответ 6

Я делаю это, запустив временный контейнер докеров для моего сервера, поэтому мне не нужно беспокоиться о том, что установлено на моем хосте. Во-первых, я определяю, что мне нужно (которое вы должны изменить для своих целей):

export MYSQL_SERVER_CONTAINER=mysql-db
export MYSQL_ROOT_PASSWORD=pswd 
export DB_DOCKER_NETWORK=db-net
export MYSQL_PORT=6604

Я всегда создаю новую сеть докеров, для которой нужны любые другие контейнеры:

docker network create --driver bridge $DB_DOCKER_NETWORK

Запустите сервер базы данных mySQL:

docker run --detach --name=$MYSQL_SERVER_CONTAINER --net=$DB_DOCKER_NETWORK --env="MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD" -p ${MYSQL_PORT}:3306 mysql

Захват IP-адреса нового контейнера сервера

export DBIP="$(docker inspect ${MYSQL_SERVER_CONTAINER} | grep -i 'ipaddress' | grep -oE '((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])')"

Откройте интерфейс командной строки для сервера:

docker run -it -v ${HOST_DATA}:/data --net=$DB_DOCKER_NETWORK --link ${MYSQL_SERVER_CONTAINER}:mysql --rm mysql sh -c "exec mysql -h${DBIP} -uroot -p"

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

Ответ 7

изменить "localhost" на ваш реальный con ip addr потому что он для mysql_connect()