docker 封装 alinode


docker

alinode

alinode 是 Node.js 性能平台 的前身,向 node 应用提供 性能监控、安全提醒、故障排查、性能优化 等服务的整体性解决方案。

之前是收费的,貌似今年年初的时候完全免费,我也第一时间接入了使用,目前为止感觉不错。

由于项目 docker 部署了,所以需要自己折腾一套稳定,可控的 docker 镜像。
可能你会说官网不是有么,在阿里云容器镜像服务中。
docker pull registry.cn-hangzhou.aliyuncs.com/aliyun-node/alinode 即可。

但我测试后发现,他是个黑盒,没有 dockerfile,更新也不及时,官网文档非常简陋,而且镜像其大无比,目前最新版镜像有 737MB。

所以最终我打算自己封装一套。

封装镜像

查看官网版本后,发现他是基于 debian:8 封装的。
那就好办了,为了稳定性,我也使用 debian:8 但我用的是 debian:8-slim,这个版本删除一些通常在容器内不需要的额外文件,如手册页和文档等。

如果你不放心,那使用 debian:8 即可。
目前版本 debian:8 是 127MB,debian:8-slim 是 79.2MB。

然后通过 tnvm 安装 alindoe,然后安装 yarn(如果你需要的话),最后安装 pm2 @alicloud/agenthub 然后做一些初始化脚本。

完整 Dockerfile 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
FROM debian:8-slim

# 只维护一套 shell 环境
RUN rm /bin/sh && ln -s /bin/bash /bin/sh

# 安装 wget 以及 ssl 支持
RUN echo -e "\
deb http://mirrors.aliyun.com/debian/ jessie main non-free contrib\n\
deb http://mirrors.aliyun.com/debian/ jessie-proposed-updates main non-free contrib\n\
deb-src http://mirrors.aliyun.com/debian/ jessie main non-free contrib\n\
deb-src http://mirrors.aliyun.com/debian/ jessie-proposed-updates main non-free contrib\n\
" > /etc/apt/sources.list \
&& apt-get update \
&& apt-get install -y --no-install-recommends ca-certificates wget \
&& rm -rf /var/lib/apt/lists/*;

ENV HOME /root

# Install alinode v3.11.7 (node v8.11.4)
ENV ALINODE_VERSION 3.11.7
ENV TNVM_DIR /root/.tnvm

# 下载 tnvm
RUN wget -O- https://raw.githubusercontent.com/aliyun-node/tnvm/master/install.sh | bash

# 安装 指定版本 alinode,安装 yarn pm2 agenthub
RUN source $HOME/.bashrc \
&& tnvm install "alinode-v$ALINODE_VERSION" \
&& tnvm use "alinode-v$ALINODE_VERSION" \
&& npm set registry https://registry.npm.taobao.org \
&& npm i -g yarn \
&& yarn global add pm2 @alicloud/agenthub

# 添加 node 到环境变量
ENV NODE_PATH $TNVM_DIR/versions/alinode/v$ALINODE_VERSION/lib/node_modules
ENV PATH $TNVM_DIR/versions/alinode/v$ALINODE_VERSION/bin:$PATH

# 工作目录
ENV APP_DIR /app
WORKDIR /app

# alinode 默认配置
COPY default.config.js $HOME
COPY docker-entrypoint.sh /usr/local/bin/

# 初始化脚本
ENTRYPOINT ["docker-entrypoint.sh"]

# 初始化环境变量
ENV NODE_LOG_DIR /tmp
ENV ENABLE_NODE_LOG YES
ENV ALINODE_CONFIG alinode.config.json
ENV NODE_ENV production

# 默认启动命令
CMD ["pm2-runtime", "start", "ecosystem.config.js"]

这些不是我凭空写的,是参照了老的 alinode 镜像 dockerfile 改造的。
https://github.com/aliyun-node/alinode-docker

这份配置非常老,一年前更新,然后就没人管了。
所以我基于这份配置,结合最新镜像环境,自己重新搭了一个。

目前测试还算稳定,功能都正常,我会持续跟踪测试,有问题会更新博客的。

完整配置查看 GitHub https://github.com/toomeefed/docker-alinode

自己封装的意义

我很不喜欢没有 dockerfile 的镜像,那基本就是个黑盒,很多东西都不可控。
自己封装,不仅知道具体流程,还能自定义环境,也更有利于版本控制,多环境控制等。

不过刚开始使用 docker 资历尚浅,可能有很多不足,不过流程理清楚,各位自己封装也简单。

小结

其实只是做了个默认配置和自动启动 agenthub 的处理,方便我们像使用普通 node 镜像一样使用 alinode。
而且我在封装时简单读了下 agenthub 源码,发现如果仅使用监控,而不用性能数据抓取功能的话,完全可以不用 alinode,他能兼容 nodejs。