Node.js服务Docker容器化应用实践小结

2020-06-17 06:39:08易采站长站整理
” 以便在持续集成环境、Docker 容器内部能访问我们的私有 NPM 包,如何创建可参考https://docs.npmjs.com/creating-and-viewing-authentication-tokens

实现方法

我们在创建 Dockerfile 文件过程中就需要增加以下两条命令:


# 528das62-e03e-4dc2-ba67-********** 这个 Token 就为你创建的身份验证令牌 token
RUN echo "//registry.npmjs.org/:_authToken=528das62-e03e-4dc2-ba67-**********" > /root/.npmrc
RUN cat /root/.npmrc

Egg 框架 Docker 容器化

在 Egg 里面,如果是

egg-scripts start --daemon
去掉 –daemon直接 egg-scripts start 即可,否则 Docker 容器会无法启动。

看以下代码示例,修改下 package.json 即可,Dockerfile 文件同上面第一个Docker 化一个 Node.js 应用程序是一样的

package.json


{
"scripts": {
"start": "egg-scripts start" // 去掉 --daemon
}
}

也可参考 Egg Issues “docker容器不能run起来,请问有碰到的吗?”https://github.com/eggjs/egg/issues/1543

Docker 镜像体积与构建时间优化

如果一个镜像在不经过优化的情况下体积通常都是会很大的,以下也是在实践过程中做的几点优化。

RUN/COPY 分层

Dockerfile 中的每条指令都会创建一个镜像层,Dockerfile 指令或复制的项目文件在没有修改变动的情况下,每个镜像层是可以被复用和缓存的。

以下代码可在 mayjun/hello-docker:latest 镜像仓库找到,以下示例中,源码改变之后,不管 package.json 有没有改变的情况下都会重新安装 NPM 模块,这样显然是不好的,因此下面我们要改进


# ...

WORKDIR /usr/src/nodejs/hello-docker
COPY . /usr/src/nodejs/hello-docker

RUN npm install

# ...

改进之后的代码如下所示,我们让 package.json 提前,在 package.json 没有修改的情况下是不会重新安装 NPM 包的,也会减少部署的时间。


# ...

WORKDIR /usr/src/nodejs/

# add npm package
COPY package.json /usr/src/app/package.json
RUN cd /usr/src/app/
RUN npm i

# copy code
COPY . /usr/src/app/

# ...

Node.js Alpine 镜像优化

mayjun/hello-docker:1.0.0 这个镜像在 Docker 仓库也可搜索到,在未优化之前大约在 688MB


$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEmayjun/hello-docker 1.0.0 7217fb3e9daa 5 seconds ago 688MB

使用 Alpine 优化

Alpine 是一个很小的 Linux 发行版,想要大幅度减小镜像体积选择 Node.js 的 Alpine 版本也是最简单的,另外 -alpine 的时区默认不是国内的,需要 Dockerfile 配置时区。