远程调试阿里云上的NodeJS Docker应用

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本文演示了如何在云端编译构建Docker镜像,并且远程调试运行在阿里云容器服务上的NodeJS应用的过程。

logo

云端调试

代码部署到了云上以后,如果想进行远程调试就不想本地调试那么方便了。一旦出现问题,大家会通过读日志文件的方式猜测修改。阿里云容器服务提供了集中日志输出的能力,省却了开发人员自己登录到每台机器上去读日志的痛苦。如果代码在本地运行得很好,在云上却不对,通过日志方式能够发现大部分错误。

但是,但是,总有那么一些时候,读日志不能解决所有问题,开发人员还是需要登录到云上远程调试代码。

我们今天就进行一个这样的尝试,远程调试NodeJS代码。基本思路是通过支持远程调试的IDE连接到云端进行调试。IDE使用的是微软开源的Visual Studio Code。

为了让这个过程更有些挑战,我们在本地环境不安装NodeJS和Docker,所有的编译运行和调试都在云端进行,是不是有点意思?

安装Visual Studio Code

Visual Studio Code是一个跨平台的代码编辑器,还有调试能力,安装也很简便。下载Visual Studio Code。在Mac OSX上,解开压缩包后把应用拷贝到系统Application目录下。

为了能在命令窗口直接启动Visual Studio Code,可以把code安装到PATH里。具体操作是点击Shift+Cmd+P,弹出命令菜单后输入shell,选择安装。

vsc_setting

创建代码目录,并启动Code

mkdir livedebug
cd livedebug
code .

创建NodeJS程序

首先是app.js

'use strict';

const express = require('express');

// Constants
const PORT = 8080;

// App
const app = express();
app.get('/', function (req, res) {
    res.send('Hello world\n');
});

app.listen(PORT);
console.log('Running on http://localhost:' + PORT);

这个程序的功能非常简单,就是相应8080端口的HTTP请求返回固定内容。

为应用新建packge.json:

{
  "name": "livedebug_nodejs",
  "version": "1.0.0",
  "main": "app.js",
  "scripts": {
    "start": "node app.js"
  },
  "dependencies": {
    "express": "^4.13.3"
  }
}

创建Docker镜像需要的Dockerfile内容如下:

FROM node:5.11.0-slim

# Create app directory
RUN mkdir -p /app
WORKDIR /app

# Install app dependencies
COPY package.json /app
RUN npm install

# Bundle app source
COPY . /app

EXPOSE 8080
CMD [ "npm", "start" ]

启动NodeJS进行调试所用的docker-compose.yml内容如下:

version: "2"
services:
  web:
    image: registry.cn-hangzhou.aliyuncs.com/***/livedebug-nodejs:latest
    command: node --debug=5858 app.js
    ports:
      - "8080:8080"
      - "5858:5858"

这里值得注意的是,我们在command命令执行node debugger侦听在5858端口,这一步仅用于远程调试,调试完成后要把这句话去掉,按照镜像里指定的命令执行。

在主机上对外暴露8080端口,用于Web访问,暴露5858端口,用于远程调试。这两个端口在生产环境时一定不要打开。如果需要从外面访问Web,可以使用阿里云容器服务的简单路由功能,这里就不再详述了。

创建代码仓库及镜像仓库

我们准备用阿里云Code的自动构建Docker镜像的能力,所以不在本地安装Docker和NodeJS了。

如果你不想使用阿里云Code或者还需要在本地执行Docker,请自行在开发机上安装Docker和NodeJS。用Docker编译Dockerfile生成镜像并推送到镜像仓库。

首先进入阿里云Code创建一个git代码仓库:

code_repo

项目名称就叫livedebug。然后进入镜像仓库管理界面创建新的镜像仓库,并将它和新建的代码仓库关联起来,并选择代码变更时自动构建镜像,构建master分支。

docker_repo

镜像仓库创建完成后,选择“立即构建”镜像。如果感觉构建速度慢,可以更改,勾选海外机器构建

Docker镜像构建完成后进入镜像版本页面,可以看到新构建成功的镜像,取名为livedebug-nodejs

docker_image

在云上运行NodeJS应用

进入阿里云容器服务控制台,选择一个已有集群,使用编排模版创建应用:

create_app

把docker-compose.yml的内容复制到编辑器里,点击创建并部署,创建应用。

进入容器信息页面,可以看到8080和5858两个端口对应的IP地址。

app_info

访问8080端口,可以看到著名的"hello world":

app_page

该IP地址上的5858端口就是我们用来进行远程调试的访问端点,我们需要把它配置进Visual Studo Code中。

用VSCode调试云上的NodeJS

回到Visual Studio Code中,进入调试页面,点击齿轮编辑远程调试信息:

vscode

launch.json替换为如下内容,注意一定要把address替换成上面拿到的IP地址。

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "AttachCloud",
            "type": "node",
            "request": "attach",
            "port": 5858,
            "address": "***IP地址***",
            "restart": true,
            "sourceMaps": false,
            "outDir": null,
            "localRoot": "${workspaceRoot}",
            "remoteRoot": "/app"
        }
    ]
}

保存配置后启动调试,在app.js中设置断点,刷新8080访问页面,就可以在VSCode中中断调试程序了,是不是很简单?

breakpoint

最后,再次提醒,调试完的应用一定要关闭,用正常运行状态启动。

小节

本文演示了如何在云端编译构建Docker镜像,并且远程调试NodeJS应用的过程。其他IDE和语言都有相应的远程调试方法,读者可以举一反三自行尝试。祝大家云上编程愉快!

相关实践学习
通过workbench远程登录ECS,快速搭建Docker环境
本教程指导用户体验通过workbench远程登录ECS,完成搭建Docker环境的快速搭建,并使用Docker部署一个Nginx服务。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
4天前
|
存储 安全 数据安全/隐私保护
【Docker 专栏】Docker 容器化应用的备份与恢复策略
【5月更文挑战第9天】本文探讨了Docker容器化应用的备份与恢复策略,强调了备份在数据保护、业务连续性和合规要求中的关键作用。内容涵盖备份的重要性、内容及方法,推荐了Docker自带工具和第三方工具如Portainer、Velero。制定了备份策略,包括频率、存储位置和保留期限,并详细阐述了恢复流程及注意事项。文章还提及案例分析和未来发展趋势,强调了随着技术发展,备份与恢复策略将持续演进,以应对数字化时代的挑战。
【Docker 专栏】Docker 容器化应用的备份与恢复策略
|
4天前
|
监控 Kubernetes Docker
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
【5月更文挑战第9天】本文探讨了Docker容器中应用的健康检查与自动恢复,强调其对应用稳定性和系统性能的重要性。健康检查包括进程、端口和应用特定检查,而自动恢复则涉及重启容器和重新部署。Docker原生及第三方工具(如Kubernetes)提供了相关功能。配置检查需考虑检查频率、应用特性和监控告警。案例分析展示了实际操作,未来发展趋势将趋向更智能和高效的检查恢复机制。
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
|
13天前
|
关系型数据库 MySQL Shell
4.Docker 应用部署
4.Docker 应用部署
|
1天前
|
存储 监控 JavaScript
使用Node.js构建实时聊天应用的技术指南
【5月更文挑战第12天】本文指导使用Node.js、Express.js和Socket.IO构建实时聊天应用。技术栈包括Node.js作为服务器环境、WebSocket协议、Express.js作为Web框架和Socket.IO处理实时通信。步骤包括项目初始化、安装依赖、搭建服务器、实现实时聊天功能、运行应用以及后续的完善和部署建议。通过这个指南,读者可以学习到创建简单实时聊天应用的基本流程。
|
3天前
|
弹性计算 负载均衡 容灾
应用阿里云弹性计算:打造高可用性云服务器ECS架构
阿里云弹性计算助力构建高可用云服务器ECS架构,通过实例分布、负载均衡、弹性IP、数据备份及多可用区部署,确保业务连续稳定。自动容错和迁移功能进一步增强容灾能力,提供全方位高可用保障。
15 0
|
4天前
|
弹性计算 API Python
阿里云百炼应用之流程编排
阿里云通义百炼平台流程编排使用教程。
|
4天前
|
存储 安全 数据库
【Docker 专栏】Docker 容器内应用的状态持久化
【5月更文挑战第9天】本文探讨了Docker容器中应用状态持久化的重要性,包括数据保护、应用可用性和历史记录保存。主要持久化方法有数据卷、绑定挂载和外部存储服务。数据卷是推荐手段,可通过`docker volume create`命令创建并挂载。绑定挂载需注意权限和路径一致性。利用外部存储如数据库和云服务可应对复杂需求。最佳实践包括规划存储策略、定期备份和测试验证。随着技术发展,未来将有更智能的持久化解决方案。
【Docker 专栏】Docker 容器内应用的状态持久化
|
4天前
|
机器学习/深度学习 人工智能 异构计算
【Docker 专栏】Docker 与 GPU 加速应用的结合
【5月更文挑战第9天】GPU加速技术在处理大规模数据和复杂计算时展现强大性能,尤其在AI和深度学习领域。Docker作为轻量级容器化工具,提供隔离、可移植和高效的环境。结合GPU加速,关键在于容器访问GPU设备和安装相应驱动。NVIDIA提供了支持工具,允许Docker利用GPU。应用场景包括人工智能、科学计算和视频处理。优势包括资源利用率提升和部署灵活性,但面临驱动兼容性、资源管理和监控调试的挑战。未来,随着技术发展,Docker与GPU加速在边缘计算中的应用将有广阔前景。
【Docker 专栏】Docker 与 GPU 加速应用的结合
|
5天前
|
Java Linux 数据安全/隐私保护
Docker自定义JDK镜像并拉取至阿里云镜像仓库全攻略
Docker自定义JDK镜像并拉取至阿里云镜像仓库全攻略
|
5天前
|
存储 Prometheus 监控
【Docker 专栏】Docker 容器内应用的调试与故障排除
【5月更文挑战第8天】本文探讨了Docker容器内应用的调试与故障排除,强调其重要性。方法包括:通过日志排查、进入容器检查、使用监控工具及检查容器配置。常见问题涉及应用启动失败、性能问题、网络连接和数据存储。案例分析展示了实战场景,注意事项提醒避免不必要的容器修改、备份数据和理解应用架构。掌握这些技能能确保Docker应用的稳定运行和性能优化。
【Docker 专栏】Docker 容器内应用的调试与故障排除