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

Spring Boot+MySQL Docker Compose端口暴露失败:连接被拒

Spring Boot + MySQL + Docker部署端口访问问题排查与解决

问题场景

使用Spring Boot + MySQL + Docker部署,配置文件如下:

docker-compose.yml

version: "3.8"

services:
  myappws_mono_db:
    image: mysql:8.0.32
    restart: unless-stopped
    environment:
      - MYSQL_ROOT_PASSWORD=$MAIN_DB_ROOT_PASSWORD
      - MYSQL_DATABASE=$MAIN_DB_DATABASE
      - MYSQL_CHARSET=utf8mb4
      - MYSQL_COLLATION=utf8mb4_0900_ai_ci
      - MYSQL_ENGINE=InnoDB
    ports:
      - $MAIN_DB_PORT:$MAIN_DB_DOCKER_PORT
    volumes:
      - db:/var/lib/mysql
  myappws:
    depends_on:
      - myappws_mono_db
    build: .
    restart: on-failure
    environment:
      - SERVER_PORT=$SERVER_PORT
      - MAIN_DB_HOST=myappws_mono_db
      - MAIN_DB_PORT=$MAIN_DB_DOCKER_PORT
      - MAIN_DB_DATABASE=$MAIN_DB_DATABASE
      - MAIN_DB_USERNAME=$MAIN_DB_USERNAME
      - MAIN_DB_PASSWORD=$MAIN_DB_PASSWORD
    ports:
      - $SERVER_PORT:$WS_DOCKER_PORT
volumes:
  db:

.env文件

MAIN_DB_HOST=127.0.0.1
MAIN_DB_PORT=3307
MAIN_DB_DOCKER_PORT=3306
MAIN_DB_USERNAME=root
MAIN_DB_PASSWORD=123456
MAIN_DB_ROOT_PASSWORD=123456
MAIN_DB_DATABASE=myapp_db_local
SERVER_PORT=9200
WS_DOCKER_PORT=9201

Dockerfile

FROM eclipse-temurin:11
MAINTAINER myapp.io

RUN mkdir /opt/app

COPY app/build/libs/myapp-ws.jar myapp-ws.jar

ENTRYPOINT ["java","-jar","myapp-ws.jar"]

执行部署命令./gradlew clean bootJar && docker-compose --env-file .env up -d后,容器均正常启动,但主机访问API出现异常:

  • 访问主机端口9201:连接拒绝
curl -ik -H "Accept: application/json" -H "Content-Type: application/json" -d '{"name":"ACME, Inc.", "website":"http://example.com"}' -X POST 'http://127.0.0.1:9201/ap1/v1/vendors/'
curl: (7) Failed to connect to 127.0.0.1 port 9201: Connection refused
  • 访问主机端口9200:空回复
curl -ik -H "Accept: application/json" -H "Content-Type: application/json" -d '{"name":"ACME, Inc.", "website":"http://example.com"}' -X POST 'http://127.0.0.1:9200/ap1/v1/vendors/'
curl: (52) Empty reply from server

问题根源与解决步骤

1. 端口映射与容器内服务端口不匹配

docker-compose中ports: - $SERVER_PORT:$WS_DOCKER_PORT表示将主机的SERVER_PORT(9200)映射到容器的WS_DOCKER_PORT(9201),但同时通过环境变量给Spring Boot设置了SERVER_PORT=9200,导致容器内服务实际监听9200端口,而映射的是容器的9201端口,两者不匹配。

解决方法二选一:

  • 修改.env文件,让SERVER_PORT与WS_DOCKER_PORT一致:
    SERVER_PORT=9201
    WS_DOCKER_PORT=9201
    
  • 或者修改docker-compose.yml中的ports配置,让主机端口直接映射到容器内的服务端口:
    ports:
      - $SERVER_PORT:$SERVER_PORT
    

2. Spring Boot应用监听地址限制

Spring Boot默认可能只监听localhost,导致容器内服务无法被主机访问。需要确保应用监听0.0.0.0(允许所有IP访问)。

解决方法二选一:

  • 在Spring Boot的配置文件(application.properties/application.yml)中添加:
    server.address=0.0.0.0
    
  • 或者修改Dockerfile的启动命令,添加启动参数:
    ENTRYPOINT ["java","-jar","myapp-ws.jar","--server.address=0.0.0.0"]
    

3. 验证容器内服务状态

修改配置后,重新部署并进入Spring Boot容器,验证内部是否能正常访问服务:

# 查看容器名称
docker ps
# 进入容器
docker exec -it <myappws容器名称> bash
# 在容器内访问服务(端口为容器内的SERVER_PORT)
curl http://localhost:9200/ap1/v1/vendors/

如果容器内访问正常,说明服务本身没问题,再测试主机访问。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 03:37:06