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
相关产品推荐
相关产品推荐

