У меня есть сервер 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