这是一个 node.js 服务器:

|   package.json
|   server.js
\---public
        styles.css

其包含一个 server.js 作为服务器代码,package.json 标记需要的环境,以及一个 css 样式需要引用。

如果是本机环境运行的话,只需要运行 npm install,然后再执行 npm run 即可正常跑起来。

而要将其封装为一个 Docker 使得在任何地方都能运行的话,需要新建一个 dockerfile,内容如下:

# 基于哪个镜像来创建,这里是 node.js
FROM node
 
# 命令执行的路径,相当于提前 cd /app
WORKDIR /app
 
# 将当前 Dockerfile 所处文件夹的所有子文件夹和文件都放到容器内的 /app 中,虽然由于 WORKDIR 的设置这里可以使用 . 但是这样写更加清晰
COPY . /app
 
# RUN 是当镜像被创建后就要执行的命令,这里是安装其扩展
RUN npm install
 
# 起一个标记作用,并不会真的去暴露
EXPOSE 80
 
# CMD 是当镜像作为一个容器被运行时,会执行的命令,这里就是讲服务器启动起来
CMD ["node", "server.js"]

随后执行 docker build . 来构建该镜像,在之后通过该命令执行:

docker run -p 7749:80 <imageID>

会发现控制台阻塞,因为实际上在设置中的 CMD 一行并没有执行结束,在容器中还在运行,可以使用 -d 选项来将其运行在后台。

也可以直接使用 -t 参数来对创建的镜像命名

重新构建时的优化

由于docker的层级架构,重新构建时会使用上次构建的缓存,而当某一层修改后,后续层都需要重新构建,故可以把会多次修改的部分置后来加速构建速度。

npm install 是很耗时的一层,而其只有在更改 package.json 后才有需要重新执行,故将其放到 COPY 之前会优化构建效果,当然在执行 npm install 前需要先将 package.json 存入容器。