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

