如何从远程机器连接到Docker部署的MySQL容器
没问题,你完全不需要在IP2的Ubuntu宿主机上安装任何MySQL相关包(不管是mysql-server还是mysql-client),就能直接从IP1连接到IP2上运行的MySQL容器。下面是你需要确认和配置的几个关键点:
1. 配置容器内的MySQL监听所有地址
你猜的没错,必须让容器里的MySQL服务监听所有网络地址,才能接收来自宿主机外的连接。有两种简单的配置方式:
方式一:启动容器时通过命令行参数指定
如果是用systemd管理容器,修改你的systemd服务文件,在docker run命令末尾加上--bind-address=0.0.0.0参数,示例如下:
docker run -d --name mysql-container -p 3306:3306 -v ~/mysqldatabase:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=your-secure-password mysql:latest --bind-address=0.0.0.0
方式二:挂载自定义配置文件到容器
如果你偏好使用配置文件管理参数,可以在IP2宿主机创建一个自定义配置文件(比如~/mysql-config/mysqld.cnf),内容添加:
[mysqld] bind-address = 0.0.0.0
然后修改systemd的启动命令,把这个配置文件挂载到容器的MySQL配置目录(不同镜像路径可能略有差异,比如官方MySQL镜像的配置路径是/etc/mysql/mysql.conf.d/mysqld.cnf):
docker run -d --name mysql-container -p 3306:3306 -v ~/mysqldatabase:/var/lib/mysql -v ~/mysql-config/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -e MYSQL_ROOT_PASSWORD=your-secure-password mysql:latest
修改完systemd服务文件后,记得重新加载配置并重启服务:
sudo systemctl daemon-reload sudo systemctl restart your-mysql-container-service-name
2. 确认端口映射与防火墙状态正常
从你提供的netstat输出来看:
sudo netstat -tunlp | grep 3306 tcp6 0 0 :::3306 :::* LISTEN 24717/docker-proxy
这说明docker-proxy已经在监听宿主机的3306端口(:::3306表示同时监听IPv4和IPv6的所有地址),并且会把流量转发到容器内部的3306端口,端口映射和防火墙规则都是正常的,这部分不需要额外调整。
3. 授权MySQL用户允许远程连接
光配置监听地址还不够,你需要确保MySQL中的用户(比如root)允许从IP1或者任意地址连接。通过SSH登录IP2,进入容器内部执行SQL命令:
docker exec -it mysql-container mysql -u root -p
输入密码后,执行授权语句(这里以允许root从任意地址连接为例,记得替换成你的实际密码):
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your-secure-password' WITH GRANT OPTION; FLUSH PRIVILEGES;
如果只想限制IP1连接,把语句中的'%'替换成IP1的具体IP地址即可。
4. 从IP1测试连接
在IP1的机器上,安装mysql-client(比如Ubuntu系统执行sudo apt install mysql-client),然后执行连接命令:
mysql -h IP2 -P 3306 -u root -p
输入密码后如果能成功进入MySQL命令行,就说明远程连接已经配置完成了。
内容的提问来源于stack exchange,提问作者makkasi

