我有一台安装了 docker 的 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 服务器。
如何在不开放宿主机3306端口的情况下访问mysql服务器容器?
可以提供帮助的更多信息:
启动容器的 ansible 任务:
- 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
如果您需要更多信息,请随时询问我。
此致
答案1
最后,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
答案2
我认为真正的答案是--service-ports
在启动容器时使用该选项docker-compose
:
docker-compose run --service-ports db
答案3
容器内的 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
更换主机使用您的主机的 IP 地址。
在主机中运行:
mysql --host=hostip -u root -p