如何用docker-compose up将Docker容器端口映射到localhost端口
Docker Compose 实现容器端口映射到宿主机的配置方法
之前配置失效的原因
- 配置
network_mode: host时,容器直接共享宿主机网络栈,Docker Compose默认创建的内部桥接网络会失效,服务之间无法通过服务名(比如你配置中的db)做域名解析,因此Spring应用无法连接同配置下的数据库容器,该模式本身不适用于多服务需要内部互访的场景。 - 单独配置
expose参数仅会将端口暴露给同一Docker网络内的其他容器,不会建立宿主机到容器的端口映射,因此本地无法直接访问对应端口。 - 你当前提供的配置文件存在YAML缩进错误,
build节点下的context和dockerfile字段缩进层级不对,导致Compose无法正确加载服务配置,这也是你写了ports规则却没生效的核心原因。另外你配置的SERVER_PORT= 8010等号后多余的空格也可能导致应用端口读取异常。
正确配置方案
不需要使用host网络模式,也不需要额外配置expose,直接通过ports字段即可完成端口映射,修正错误后的完整配置如下:
version: '3.9' services: db: container_name: mysql-db image: mysql:5.7 restart: always environment: - MYSQL_ROOT_PASSWORD=root - MYSQL_USER=my_user - MYSQL_PASSWORD=my_pass - MYSQL_DATABASE=my_db ports: - "3307:3306" volumes: - mysql:/var/lib/mysql healthcheck: test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ] timeout: 20s retries: 10 app-backend: container_name: my-app image: app restart: on-failure environment: - _JAVA_OPTIONS=-Xmx512m -Xms256m - SERVER_PORT=8010 - SPRING_PROFILES_ACTIVE=prod - SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/my_db?useLegacyDatetimeCode=false&serverTimezone=UTC links: - db ports: # 格式为 "宿主机端口:容器内监听端口",如果要本地8080访问就改成 "8080:8010" - "8010:8010" build: context: . dockerfile: "Dockerfile" depends_on: db: condition: service_healthy volumes: mysql:
配置说明&操作注意事项
ports字段的映射规则为"宿主机监听端口:容器内部应用监听端口",比如你希望本地通过localhost:8080访问应用,只需要把app-backend服务下的ports配置改成"8080:8010"即可。- 保持默认的桥接网络模式即可,同一Compose栈下的服务可以直接通过服务名(比如数据库地址填
db:3306)互访,不需要额外配置网络。 - 修改配置后先执行
docker-compose down清理之前创建的旧容器,再执行docker-compose up -d --build重新构建启动服务,避免旧容器的配置缓存导致规则不生效。 - 启动后可以执行
docker ps查看端口映射状态,如果PORTS列出现0.0.0.0:8010->8010/tcp(或你自定义的宿主机端口)的记录,就说明映射规则已经生效。 - 如果端口映射存在但仍无法访问,进入容器检查Spring应用是否正常监听
0.0.0.0:8010,如果应用仅绑定容器内的127.0.0.1地址,端口映射会失效,Spring Boot默认监听0.0.0.0地址,一般不需要额外调整。
内容的提问来源于stack exchange,提问作者Piotror
相关产品推荐
相关产品推荐

