EC2上已部署运行的Docker容器无法访问问题排查请求
问题:EC2实例上Docker部署的NodeJS应用无法访问
我用Docker构建了一个简单的NodeJS应用,本地运行完全正常。已在EC2实例上安装Docker和Docker-Compose并部署容器,但通过实例公网IPv4(13.48.193.158)或公网IPv4 DNS(ec2-13-48-193-158.eu-north-1.compute.amazonaws.com)都无法访问该Web应用。
相关信息
项目配置
- 测试项目:Simple-test-NodeJSApp-with-docker
- Dockerfile内容:
FROM node:10-alpine RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app WORKDIR /home/node/app COPY package*.json ./ USER node RUN npm install COPY --chown=node:node . . EXPOSE 8080 CMD [ "node", "app.js" ]
环境版本
- Docker:26.1.4, build 5650f9b
- npm:10.8.1
- Node:v12.22.9
- Docker Compose:v2.27.1-desktop.1
- Express:10.8.1
- EC2实例系统:ubuntu-noble-24.04-amd64-server-20240423
已确认状态
- EC2入站规则:已配置允许8080端口TCP流量从任意IP访问
- 容器日志:显示应用正常启动,监听8080端口
- 额外截图:显示容器运行状态正常
排查与解决步骤
1. 确认容器端口映射是否正确
Docker的EXPOSE仅为声明端口,不会自动映射到主机。必须通过-p参数(或docker-compose的ports字段)将容器8080端口映射到EC2实例的8080端口:
- 命令行启动示例:
docker run -p 8080:8080 <你的镜像ID/名称> - docker-compose.yml需添加端口映射:
services: app: build: . ports: - "8080:8080"
执行docker ps检查容器状态,确认PORTS列显示0.0.0.0:8080->8080/tcp或:::8080->8080/tcp。
2. 验证EC2本地访问是否正常
在EC2实例终端执行curl localhost:8080或curl 127.0.0.1:8080:
- 若能返回应用内容,说明容器和端口映射正常,问题出在外部网络链路;
- 若无法访问,说明容器内部或端口映射存在问题,需回到第一步确认配置。
3. 检查EC2实例防火墙(ufw)
Ubuntu 24.04默认启用ufw防火墙,执行以下命令确认8080端口是否开放:
sudo ufw status
若未开放8080端口,执行:
sudo ufw allow 8080/tcp sudo ufw reload
4. 确认NodeJS应用绑定地址
很多NodeJS应用默认仅绑定127.0.0.1,导致仅能在容器内部访问。检查app.js中的监听代码:
// 正确写法:绑定到所有网卡(允许外部访问) app.listen(8080, '0.0.0.0', () => { console.log('App listening on port 8080'); }); // 错误写法:仅绑定本地回环(仅容器内部可访问) app.listen(8080, () => { ... });
若为错误写法,修改后重新构建镜像并部署。
5. 排查VPC网络配置
- 确认EC2实例所在VPC的路由表已配置指向Internet Gateway的路由;
- 确认VPC网络ACL允许入站和出站的8080端口TCP流量。
内容的提问来源于stack exchange,提问作者Mostafa Nabil
相关产品推荐
相关产品推荐

