Назад | Перейти на главную страницу

Не удается получить доступ к контейнеру докеров mysql с хоста

У меня есть сервер Debian с докером 1.6.0 на нем с запущенным официальным контейнером mysql (https://registry.hub.docker.com/_/mysql/).

Я использую довольно простую конфигурацию брандмауэра, в которой все порты закрыты, кроме SSH, HTTP и NTP (http://pastebin.com/raw.php?i=dFUcJWxy).

Когда я пытаюсь подключиться к своей базе данных mysql:

mysql -u root -h 172.17.0.3 -p

Я получаю следующее сообщение об ошибке:

ERROR 2003 (HY000): Can't connect to MySQL server on '172.17.0.3' (110)

Порт 3306 на нем фильтруется:

nmap -p 3306 172.17.0.3

PORT     STATE    SERVICE
3306/tcp filtered mysql

... и когда я открываю порт 3306 на хосте, я могу получить доступ к серверу mysql.

Как получить доступ к контейнеру сервера mysql, не открывая порт 3306 хост-машины?

Дополнительная информация, которая может помочь:

Доступная задача для запуска контейнера:

- name: Mysql container
  docker:
    name: mysql
    image: mysql:5.7
    state: started
    volumes:
    - /var/container_data/mysql:/var/lib/mysql
    ports:
    - "127.0.0.1:3306:3306"
    env:
        MYSQL_ROOT_PASSWORD: my-root-password

docker inspect mysql -> pastebin.com/raw.php?i=uhXEhuXJ

iptables -L -> pastebin.com/raw.php?i=18fkgktF

ifconfig -> pastebin.com/raw.php?i=YJs2JnQx

Если вам нужна дополнительная информация, не стесняйтесь спрашивать меня.

С уважением

Внутри контейнера в файле mysqd.conf:

/etc/mysql/mysql.conf.d/mysqld.cnf 

прокомментируйте это:

bind-address           = 127.0.0.1

добавьте это ниже:

bind-address            = 0.0.0.0

А затем перезапустите службу mysql:

service mysql restart

Затем запустите контейнер:

docker run  -p hostip:3306:3306 -it <image> bash

Заменить hostip с IP-адресом вашего хоста.

На хосте запустите:

mysql --host=hostip -u root -p

Я думаю, что настоящий ответ - использовать --service-ports опция при запуске контейнера с помощью docker-compose:

docker-compose run --service-ports db

... согласно: https://stackoverflow.com/questions/32360687/connect-to-docker-mysql-container-from-localhost/32407507#32407507

Наконец, открыв порт 3306 на docker0 интерфейс решил мою проблему:

iptables -t filter -A INPUT -p tcp -i docker0 --dport 3306 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp -o docker0 --dport 3306 -j ACCEPT