Docker 和 Docker Compose 是目前最受欢迎的容器化技术,它们可以极大地简化应用程序的部署和管理。本文将介绍如何使用 Docker 和 Docker Compose 部署一个 Node.js 微服务。
准备工作
1. 安装 Docker 和 Docker Compose
确保你已经安装了 Docker 和 Docker Compose。你可以从 Docker 官网下载并安装它们。
2. 创建一个 Node.js 服务
创建一个简单的 Node.js 服务,可以使用 Express 框架。为了演示,我们创建一个服务,当请求时返回一个简单的“Hello, World!”消息。
创建一个名为 app.js 的文件,并在其中添加以下代码:
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello, World!');
});
app.listen(3000, () => {
console.log('Server is listening on port 3000');
});
保存文件并关闭编辑器。
3. 编写 Dockerfile
Dockerfile 是用来构建 Docker 镜像的文件。在这个例子中,我们使用 Dockerfile 来创建一个 Node.js 镜像。
创建一个名为 Dockerfile 的文件,并在其中添加以下代码:
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
这个 Dockerfile 的含义是:
FROM node:14:使用 Node.js 14 版本作为基础镜像。WORKDIR /app:设置工作目录为/app。COPY package*.json ./:复制package.json和package-lock.json文件到/app目录下。RUN npm install:安装 Node.js 依赖包。COPY . .:复制所有文件到/app目录下。EXPOSE 3000:设置容器监听的端口号为 3000。CMD ["npm", "start"]:在容器启动时执行npm start命令。
4. 构建 Docker 镜像
在项目根目录下运行以下命令来构建 Docker 镜像:
docker build -t my-node-app .
其中 -t 参数表示给镜像打一个标签。. 表示当前目录。
5. 运行 Docker 容器
使用以下命令来运行 Docker 容器:
docker run -p 3000:3000 my-node-app
其中 -p 参数将容器的 3000 端口映射到主机的 3000 端口。
现在,你可以在浏览器中访问 http://localhost:3000,应该能够看到 "Hello, World!" 的消息。
6. 使用 Docker Compose 部署微服务
在这个例子中,我们将使用 Docker Compose 来部署多个 Node.js 微服务。每个微服务将运行在一个单独的 Docker 容器中,并由 Docker Compose 统一管理。
创建一个名为 docker-compose.yml 的文件,并在其中添加以下代码:
version: "3"
services:
api:
build: .
ports:
- "3000:3000"
depends_on:
- db
environment:
- MONGODB_URI=mongodb://db:27017/mydatabase
db:
image: mongo:4.4
volumes:
- ./data:/data/db
上述 docker-compose.yml 中,我们定义了两个服务:api 和 db。其中 api 服务使用了当前目录的 Dockerfile 构建 Docker 镜像,并将本地的 3000 端口映射到容器内的 3000 端口,依赖于 db 服务,并设置了 MongoDB 数据库的连接地址。而 db 服务则使用了官方提供的 MongoDB 镜像,并将容器内的 /data/db 目录映射到本地的 ./data 目录。
7. 启动 Docker 容器
在项目根目录下执行以下命令启动 Docker 容器:
docker-compose up
等待 Docker 容器启动完成后,即可访问 http://localhost:3000,并使用微服务架构提供的 API 服务。
以上就是使用 Docker 和 Docker Compose 部署 Node.js 微服务的简单流程,希望能对您有所帮助。