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

如何开放Docker Compose中的app容器供外部客户端请求访问?

问题描述

我正在学习Docker,遇到如下问题:我编写了包含应用、数据库和pgAdmin的Docker Compose配置,执行docker-compose up命令后所有容器启动,可通过localhost:{PORT}进行访问。我希望开放其中app容器的访问权限,让外部客户端能够向我的应用发送请求。

我的docker-compose.yml配置如下:

version: '3.8'

services:
  app:
    image: 'docker-spring-boot-postgres:latest'
    build:
      context: .
    container_name: app
    ports:
      - "8080:8080"
    depends_on:
      - db
    environment:
      - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/database
      - SPRING_DATASOURCE_USERNAME=username
      - SPRING_DATASOURCE_PASSWORD=password
      - SPRING_JPA_HIBERNATE_DDL_AUTO=update

  db:
    image: 'postgres:16.4-alpine'
    ports:
      - "5432:5432"
    container_name: db
    environment:
      - POSTGRES_USER=username
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=database

  pgadmin:
    container_name: pgadmin
    image: 'dpage/pgadmin4:8.10'
    restart: always
    environment:
      PGADMIN_DEFAULT_EMAIL: email@admin.com
      PGADMIN_DEFAULT_PASSWORD: password
    ports:
      - "5050:80"

执行docker ps命令后得到以下输出:

CONTAINER ID   IMAGE                                COMMAND                  CREATED          STATUS          PORTS                           NAMES
6f9430a14763   docker-spring-boot-postgres:latest   "java -jar hearthgue…"   43 minutes ago   Up 21 seconds   0.0.0.0:8080->8080/tcp          app
0f03246b006e   postgres:16.4-alpine                 "docker-entrypoint.s…"   43 minutes ago   Up 22 seconds   0.0.0.0:5432->5432/tcp          db
fb8f2f4103fd   dpage/pgadmin4:8.10                  "/entrypoint.sh"         43 minutes ago   Up 22 seconds   443/tcp, 0.0.0.0:5050->80/tcp   pgadmin

目前所有容器仅能通过localhost访问,只有我本地可获取数据,我需要将app容器设为公开,让其他用户能连接服务器获取数据。

解决方案

从你的docker ps输出能看到,app容器的端口已经绑定到0.0.0.0:8080,这意味着容器已经监听了主机所有网络接口的8080端口,问题大概率出在主机的网络配置或防火墙设置上,按以下步骤排查:

  • 步骤1:确认主机对外的网络可达性
    外部客户端需要知道你的主机的对应IP:

    • 局域网场景:在主机上执行ip addr(Linux/macOS)或ipconfig(Windows)获取局域网IP,比如192.168.1.100,外部客户端尝试访问http://192.168.1.100:8080。
    • 互联网场景:通过curl ifconfig.me获取主机公网IP,同时在路由器后台配置端口转发,将公网的8080端口映射到主机的8080端口。
  • 步骤2:检查主机防火墙规则
    主机防火墙可能拦截了外部对8080端口的访问:

    • Linux:执行sudo ufw allow 8080/tcp(ufw防火墙)或firewall-cmd --add-port=8080/tcp --permanent && firewall-cmd --reload(firewalld防火墙)。
    • Windows:打开「Windows Defender防火墙」→「高级设置」→「入站规则」,新建规则允许8080端口的TCP连接。
    • macOS:打开「系统设置」→「网络」→「高级」→「防火墙」→「防火墙选项」,添加允许8080端口的传入连接。
  • 步骤3:验证容器内应用的监听地址
    确保你的Spring Boot应用不是仅监听localhost,需要监听0.0.0.0。可以在应用配置文件(如application.properties)中添加:

    server.address=0.0.0.0
    

    或者在启动命令中指定--server.address=0.0.0.0。如果应用只监听localhost,即使Docker端口映射正确,外部也无法访问。

  • 步骤4:(可选)调整Docker端口映射
    当前配置ports: - "8080:8080"已经正确,若需要用其他端口对外暴露,可修改为"外部端口:8080",比如"80:8080",这样外部可直接通过80端口访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:35:12