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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 01:53:16