当我们需要将一个Node.js应用部署到生产环境时,Docker容器化是一个非常好的选择。其主要优点是使得应用部署变得非常容易,同时也方便了应用的扩展及做负载平衡。下面我们将介绍一下如何将一个Node.js应用Docker化,并对相关知识进行一些说明。
前置知识
在开始学习Docker容器化应用实践前,需要掌握以下知识:
- Docker基本术语和概念
- Node.js应用的开发和部署
- Linux系统的基本操作
如果对上面的知识还不太熟悉,建议先学习一下。
Docker的安装
在开始Docker容器化应用实践之前,需要先安装Docker。
MacOS
在MacOS上安装Docker比较简单,只需要访问Docker官网下载并安装。
Linux
在Linux系统上安装Docker比较麻烦,具体可以参考Docker官方文档,这里仅提供Ubuntu系统的安装方式:
- 首先,更新apt包列表
sudo apt-get update
- 安装Docker必要依赖
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
- 添加GPG秘钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
- 添加Docker源
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
- 安装Docker
sudo apt-get update
sudo apt-get install docker-ce
Windows
在Windows上安装Docker也比较简单,只需要访问Docker官网下载并安装。
Node.js应用的Docker化
本篇文章以一较为简单的Node.js应用为例。
Node.js应用目录结构:
├── app.js
├── package.json
└── public
├── index.html
└── style.css
Dockerfile
首先创建Dockerfile,将应用打包进镜像。Dockerfile内容如下:
# 设置基础镜像为Node.js(lts)环境, 版本为最新
FROM node:lts-alpine
# 将 当前 目录下的内容拷贝到 /usr/app/ 目录下
COPY . /usr/app/
# 切换工作目录到 /usr/app/
WORKDIR /usr/app/
# 安装 Node.js 应用依赖
RUN npm install --production
# 让容器监听 $PORT 环境变量 或者端口
# 这个变量由容器启动时通过 -e PORT=4000 传入
EXPOSE $PORT
# 当容器启动时运行应用
CMD ["npm", "start"]
Dockerfile解释:
- 第一行:指定将要基于哪个镜像进行镜像构建。
- 第二行:指定将制作的镜像挂载到
/usr/app/
目录下。 - 第三行:切换文件到
usr/app
目录下。 - 第四行:安装应用依赖项。(npm i --production)
- 第五行:设置暴露端口号$PORT(通常为80或8080)。
- 第六行:设置Docker容器在启动时所要执行的命令。
构建镜像
在构建镜像之前,首先需要确保当下目录中存在Dockerfile文件。下面介绍用构建镜像的命令:
$ docker build -t sn-cli-docker .
其中 -t sn-cli-docker
表示命名决定为 sn-cli-docker
,.
指当前目录。
构建镜像会根据Dockerfile文件的指示,将我们的Node.js应用打包到一个名为 sn-cli-docker
的容器镜像中。该构建命令可能会花费一些时间。
运行容器
构建的下一步,将是使用 docker run
命令运行容器。再次强调,容器是镜像的 实例 。
$ docker run -dit -p 3000:80 sn-cli-docker
运行容器后,可以通过 http://localhost:3000
访问应用。
下面解释一下使用的指令:
docker run
后面三个参数;-d
让容器在后台运行;-p
将容器内部的80端口映射到本地的3000端口。(即容器端口在3000)
两个具体案例
使用nodemon开发模式
从Dockerfile的内容可以看出,它首先执行了 npm install --production
来安装依赖库,然后运行了 npm start
命令来启动应用。这种方式通常用于生产环境应用。
当开发 Node.js 应用的时候,我们通常需要一个自动重启机制来做到开发环境下的即时调试,这时 nodemon 是一个非常好的选择。下面给出一个使用nodemon重启机制的示例:
在生产模式的Dockerfile中,将CMD那一行修改即可(添加nodemon),如下:
# 运行 nodemon
CMD ["npx", "nodemon", "app.js"]
示例Docker镜像构建语句:
$ docker build -t sn-cli-docker-nodemon .
启动命令:
$ docker run -it -v $(pwd):/usr/app -p 3000:3000 --name my-node-app sn-cli-docker-nodemon
命令解释:
-it
以交互式终端启动容器。-v
挂载主机文件系统。--name
指定名称,方便查找。
使用docker-compose多容器运行
通常情况下,我们的应用不能由单一的容器来管理。例如,在现实场景中,应该拆分微服务为一些可重用的组件,组件间的关系可能是复杂的。这时我们需要一个容器编排工具来解决这种问题。Docker本身提供了Docker Compose
这样的工具来做这个事情。
假设有以下两个服务:
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
开启命令:
$ docker-compose up
这样,docker-compose 将会启动两个容器:
- 包含 Flask 应用的 Web 容器
- 包含 Redis 容器
若希望在后台运行它们,只需将 docker-compose
命令改为 docker-compose up -d
即可。
总结
通过以上的内容,我们可以学会将一个 Node.js 应用Docker化。其中,我们需要掌握 Dockerfile 的基本语法和应用场景。对于较为复杂的应用场景,我们可以使用 Docker Compose 进行容器编排。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Node.js服务Docker容器化应用实践小结 - Python技术站