这是一个 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
存入容器。