как получить доступ к контейнеру docker mariadb извне?

#macos #docker #mariadb

#macos #docker #mariadb

Вопрос:

Я следовал официальному руководству по адресу: https://mariadb.com/kb/en/installing-and-using-mariadb-via-docker/Однако я не нашел ни одной записи с адресом привязки в моем файле my.cnf, это выглядит так:

 # The MariaDB configuration file
#
# The MariaDB/MySQL tools read configuration files in the following order:
# 0. "/etc/mysql/my.cnf" symlinks to this file, reason why all the rest is read.
# 1. "/etc/mysql/mariadb.cnf" (this file) to set global defaults,
# 2. "/etc/mysql/conf.d/*.cnf" to set global options.
# 3. "/etc/mysql/mariadb.conf.d/*.cnf" to set MariaDB-only options.
# 4. "~/.my.cnf" to set user-specific options.
#
# If the same option is defined multiple times, the last one will apply.
#
# One can use all long options that the program supports.
# Run program with --help to get a list of available options and with
# --print-defaults to see which it would actually understand and use.
#
# If you are new to MariaDB, check out https://mariadb.com/kb/en/basic-mariadb-articles/

#
# This group is read both by the client and the server
# use it for options that affect everything
#
[client-server]
# Port or socket location where to connect
# port = 3306
socket = /run/mysqld/mysqld.sock

# Import all .cnf files from configuration directory
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mariadb.conf.d/
  

когда я пытаюсь подключиться к нему извне, то есть с главного компьютера, я получаю следующее:

 Creating a session to 'root@172.17.0.2'
MySQL Error 2003 (HY000): Can't connect to MySQL server on '172.17.0.2' (60)
  

Что я должен сделать, чтобы иметь возможность подключаться к серверу извне? Он запускается, поскольку я могу подключиться изнутри контейнера docker.

Я использую macOS.

Ответ №1:

Вы не можете выполнить этот трюк mysql -h 172.17.0.2 -u root -p на Mac.

 There is no docker0 bridge on macOS🔗
Because of the way networking is implemented in Docker Desktop for Mac, you cannot see a docker0 interface on the host. This interface is actually within the virtual machine.

I cannot ping my containers
Docker Desktop for Mac can’t route traffic to containers.
  

Пожалуйста, ознакомьтесь с официальной документацией docker для Mac.

Я предлагаю вам предоставить порт контейнера хосту -p 127.0.0.1:3306:3306 , а затем подключиться к вашей базе данных как к локальному mysql -h 127.0.0.1 -p -uroot хосту.

 docker run --name mariadbtest 
 -p 127.0.0.1:3306:3306
 -e MYSQL_ROOT_PASSWORD=mypass 
 -d mariadb/server:10.3 
 --log-bin 
 --binlog-format=MIXED
  

Комментарии:

1. Я хотел бы впоследствии сопоставить IP-адрес контейнера mariadb под другим именем, поэтому, если я захочу выполнить сопоставление.

2. Если вам нужно получить доступ к контейнеру извне, вам необходимо сопоставить порт контейнера с портом хоста. Документация MariaDB предполагает, что вы используете «хак», который не работает на Mac, но работает в системах на базе Linux.

3. @Greg пожалуйста, ознакомьтесь с официальной документацией

4. на самом деле, это сработало, я использовал точные команды, и я могу получить доступ к серверу. У меня есть другой пользователь docker с приложением spring boot, которому необходимо получить доступ к mariadb на хосте «mariadb», надеюсь, это сработает, если я создам для них сеть.

Ответ №2:

В вашей конфигурации используется socket для соединений, как вы прокомментировали port :

 # port = 3306
socket = /run/mysqld/mysqld.sock
  

Итак, вы должны раскомментировать port выше (и удалить / прокомментировать socket конфигурацию). Это приведет к прослушиванию базы данных на порту 3306.

Для локального использования вам потребуется впоследствии сопоставить этот порт с localhost, например, запустить ваш контейнер с -p помощью, чтобы вы могли подключиться через localhost:3306 :

 docker -d -p 127.0.0.1:3306:3306 [..] example/mariadb
  

Комментарии:

1. по-прежнему никакой радости, точно такое же поведение. Я также попытался установить адрес привязки на 0.0.0.0, это тоже не помогло

2. @Simon -p 3306:3306 выставляет порт на всех интерфейсах. Это небезопасно

3. @AndreiKovrov Спасибо, что отметили это, изменили мой пример. Грег, ты проверил брандмауэр macOS и тому подобное? Работают ли другие порты / контейнеры (например, nginx)?