Docker部署Spring Boot应用:宿主机数据库连接与端口暴露问题
解决Spring Boot容器同时访问端口与连接宿主机MariaDB的问题
问题根源
- 使用
--network=host时,容器直接共享宿主机的网络命名空间,此时-p 8002:8080端口映射参数会被Docker忽略,导致外部无法通过8002端口访问应用。 - 不使用
host网络时,容器内的127.0.0.1指向容器自身的回环地址,而非宿主机,因此无法连接到宿主机上的MariaDB。
可行解决方案
方案1:修改数据库连接地址 + 配置MariaDB允许远程访问(推荐)
这个方案不需要使用host网络,既能保留端口映射,又能让容器连接宿主机数据库:
获取宿主机内网IP
在Ubuntu终端执行:ip addr show找到类似
inet 192.168.x.x/24的内网IP地址(比如192.168.1.105)。修改Spring Boot的数据库连接地址
启动容器时,将DB_URL替换为宿主机的内网IP:docker run \ -e "DB_URL=jdbc:mariadb://192.168.1.105:3306/app" \ -e "DB_USERNAME=***" \ -e "DB_PASSWORD=***" \ -it \ -p 8002:8080 \ repository/app:0.0.3配置MariaDB允许远程连接
- 编辑MariaDB的配置文件(通常位于
/etc/mysql/mariadb.conf.d/50-server.cnf),将bind-address的值改为0.0.0.0(允许所有IP访问):bind-address = 0.0.0.0 - 重启MariaDB服务:
sudo systemctl restart mariadb - 给数据库用户授权远程访问权限(替换
***为实际用户名和密码):GRANT ALL PRIVILEGES ON app.* TO '***'@'%' IDENTIFIED BY '***'; FLUSH PRIVILEGES;
- 编辑MariaDB的配置文件(通常位于
方案2:使用host网络 + 端口转发
如果坚持使用--network=host,可以通过端口转发让外部访问8002端口:
启动容器(保留host网络)
docker run \ -e "DB_URL=jdbc:mariadb://127.0.0.1:3306/app" \ -e "DB_USERNAME=***" \ -e "DB_PASSWORD=***" \ -it \ --network=host \ repository/app:0.0.3此时应用会直接使用宿主机的8080端口。
配置iptables端口转发
执行以下命令将8002端口的流量转发到8080:sudo iptables -t nat -A PREROUTING -p tcp --dport 8002 -j REDIRECT --to-port 8080(如果需要重启后依然生效,可以安装
iptables-persistent保存规则)
内容的提问来源于stack exchange,提问作者Bademeister
相关产品推荐
相关产品推荐

