如何开放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端口的传入连接。
- Linux:执行
步骤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

