You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器无法连接Ubuntu本地MariaDB的问题求助

解决Docker容器连接宿主机本地MariaDB的问题

核心原因

Docker容器默认处于独立网络命名空间,容器内的localhost指向自身而非宿主机。直接用宿主机内网IP连接失败,通常是以下问题导致:

  • MariaDB仅绑定127.0.0.1,拒绝外部(含容器)访问
  • 宿主机防火墙阻止容器访问MariaDB默认端口3306
  • Docker网络配置未正确路由到宿主机
  • MariaDB用户权限未开放给容器所在网段

具体解决步骤

1. 修改MariaDB绑定地址

编辑MariaDB配置文件(通常为/etc/mysql/mariadb.conf.d/50-server.cnf或/etc/my.cnf),找到bind-address项修改为:

bind-address = 0.0.0.0  # 允许所有IP访问,也可指定Docker子网(如172.17.0.0/16)

重启MariaDB服务:

sudo systemctl restart mariadb

2. 配置MariaDB用户权限

给数据库用户开放容器所在网段的访问权限:

GRANT ALL PRIVILEGES ON 你的数据库名.* TO '用户名'@'172.17.0.%' IDENTIFIED BY '密码';
FLUSH PRIVILEGES;

(172.17.0.%是Docker默认网桥网段,用自定义网络则替换为对应网段)

3. 调整宿主机防火墙规则

允许Docker子网访问3306端口:

sudo ufw allow from 172.17.0.0/16 to any port 3306

用iptables的话执行:

sudo iptables -A INPUT -s 172.17.0.0/16 -p tcp --dport 3306 -j ACCEPT

4. 优化Docker Compose配置

在Compose文件中直接指定宿主机内网IP(确保MariaDB已绑定该IP并开放权限),示例WordPress配置:

version: '3.8'
services:
  wordpress:
    image: wordpress:latest
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: 192.168.0.xxx:3306  # 替换为你的宿主机内网IP
      WORDPRESS_DB_USER: 数据库用户名
      WORDPRESS_DB_PASSWORD: 数据库密码
      WORDPRESS_DB_NAME: 数据库名
    restart: always

5. Linux上启用host.docker.internal(可选)

若偏好使用该统一名称,编辑Docker daemon配置/etc/docker/daemon.json:

{
  "extra_hosts": ["host.docker.internal:host-gateway"]
}

重启Docker服务:

sudo systemctl restart docker

之后可在Compose中用WORDPRESS_DB_HOST: host.docker.internal:3306连接。


验证方法

进入容器测试数据库连接:

docker exec -it 你的容器名 bash
apt update && apt install -y mariadb-client
mysql -h 192.168.0.xxx -u 用户名 -p

能成功登录则连接正常,再检查WordPress配置是否匹配。

内容的提问来源于stack exchange,提问作者RitZz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 08:25:21