解决docker容器中连不上自建数据库

购买了服务器,没有使用docker部署mysql服务,自己在宿主机中部署了mysql服务,上篇讲解了如果使用工具外网进行连接,后发现docker容器中的后端服务连不上,故此篇用于记录如何解决的。


目前我解决的地方:

将配置文件的数据库中的地址IP   修改为了如下命令IP地址即可。

ip addr show docker0   //使用Docker网桥IP去进行连接

不要去使用阿里云中IP的如图:


宿主机MySQL服务连接Docker容器的解决方案

问题分析

当MySQL直接部署在宿主机(非Docker环境),而Docker容器内的服务无法连接时,通常存在以下核心问题:

  1. 网络隔离:Docker容器默认使用独立网络命名空间
  2. 绑定地址限制:MySQL默认仅监听127.0.0.1
  3. 防火墙规则:宿主机防火墙可能拦截容器流量
解决步骤
1. 修改MySQL绑定地址

编辑MySQL配置文件(通常位于/etc/mysql/mysql.conf.d/mysqld.cnf):

[mysqld]
bind-address = 0.0.0.0  # 允许所有IP访问

重启MySQL服务:

sudo systemctl restart mysql

2. 创建专用数据库用户

在MySQL中执行:

CREATE USER 'docker_user'@'%' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON *.* TO 'docker_user'@'%';
FLUSH PRIVILEGES;

3. 配置容器网络连接

在容器内连接时使用特殊主机名:

  • Linux/macOShost.docker.internal
  • Windowsgateway.docker.internal

示例连接字符串:

# Docker Compose配置示例
services:
  backend:
    environment:
      DB_HOST: "host.docker.internal"
      DB_PORT: 3306
      DB_USER: "docker_user"
      DB_PASS: "StrongPassword123!"

4. 开放宿主机防火墙

允许3306端口通行:

sudo ufw allow 3306/tcp  # Ubuntu
# 或
sudo firewall-cmd --permanent --add-port=3306/tcp  # CentOS
sudo firewall-cmd --reload

5. 验证网络连通性

在容器内执行测试:

docker exec -it backend_container bash
apt-get update && apt-get install -y telnet  # 如未安装
telnet host.docker.internal 3306

故障排查表
现象检查点解决命令
连接超时防火墙状态sudo ufw status
拒绝访问MySQL用户权限SELECT host, user FROM mysql.user;
无法解析主机Docker DNS配置docker run --add-host=host.docker.internal:host-gateway ...
协议错误MySQL版本兼容性ALTER USER 'docker_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
连接原理示意图
graph LR
A[Docker容器] -->|通过虚拟网桥| B[宿主网络]
B -->|访问 0.0.0.0:3306| C[MySQL进程]
C -->|验证 docker_user@% | D[数据库实例]

关键提示:生产环境建议添加IP白名单限制,可通过GRANT ... TO 'user'@'172.17.0.%'限制Docker网段访问,或使用--ip-range指定容器IP范围。

Docker 启动 Nacos 2.0.2 连不上数据库,可从以下方面解决: - **检查数据库配置**:Nacos 需准确的数据库连接信息,要保证 `application.properties` 配置文件里数据库的 URL、用户名和密码正确。例如,若使用 MySQL 数据库,配置应如下: ```properties spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://localhost:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user.0=root db.password.0=password ``` - **检查网络连通性**:要保证 Docker 容器能访问数据库所在主机和端口。可在容器内使用 `ping` 命令检查主机连通性,用 `telnet` 命令检查端口是否开放。例如,检查数据库主机 `192.168.1.100` 的 3306 端口: ```bash docker exec -it nacos ping 192.168.1.100 docker exec -it nacos telnet 192.168.1.100 3306 ``` - **检查数据库服务状态**:确保数据库服务正在运行,且允许远程连接。对于 MySQL 数据库,可通过以下命令启动服务: ```bash systemctl start mysql ``` - **检查数据库权限**:确保 Nacos 使用的数据库用户有足够权限访问和操作数据库。可使用以下 SQL 语句为用户授予权限: ```sql GRANT ALL PRIVILEGES ON nacos.* TO 'root'@'%' IDENTIFIED BY 'password'; FLUSH PRIVILEGES; ``` - **检查防火墙设置**:确保防火墙未阻止 Docker 容器数据库之间的通信。若使用 `firewalld`,可使用以下命令开放数据库端口: ```bash firewall-cmd --zone=public --add-port=3306/tcp --permanent firewall-cmd --reload ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值