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

Docker部署Spring Boot应用:宿主机数据库连接与端口暴露问题

解决Spring Boot容器同时访问端口与连接宿主机MariaDB的问题

问题根源

  • 使用--network=host时,容器直接共享宿主机的网络命名空间,此时-p 8002:8080端口映射参数会被Docker忽略,导致外部无法通过8002端口访问应用。
  • 不使用host网络时,容器内的127.0.0.1指向容器自身的回环地址,而非宿主机,因此无法连接到宿主机上的MariaDB。

可行解决方案

方案1:修改数据库连接地址 + 配置MariaDB允许远程访问(推荐)

这个方案不需要使用host网络,既能保留端口映射,又能让容器连接宿主机数据库:

  1. 获取宿主机内网IP
    在Ubuntu终端执行:

    ip addr show
    

    找到类似inet 192.168.x.x/24的内网IP地址(比如192.168.1.105)。

  2. 修改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
    
  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;
      

方案2:使用host网络 + 端口转发

如果坚持使用--network=host,可以通过端口转发让外部访问8002端口:

  1. 启动容器(保留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端口。

  2. 配置iptables端口转发
    执行以下命令将8002端口的流量转发到8080:

    sudo iptables -t nat -A PREROUTING -p tcp --dport 8002 -j REDIRECT --to-port 8080
    

    (如果需要重启后依然生效,可以安装iptables-persistent保存规则)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 12:09:55