Docker Compose 是一个用于定义和运行多个 Docker 容器的工具,而 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境。本文将介绍如何使用 Docker Compose 启动一个 Node.js 应用,并提供相应的代码示例。

什么是 Docker Compose?

Docker Compose 是 Docker 官方提供的一个工具,用于定义和运行由多个容器组成的应用。通过一个 YAML 文件来配置应用的服务、网络、存储等等,然后使用一个命令即可启动、停止和管理这些服务。

Docker Compose 的主要特点包括:

  • 定义和管理多个容器:通过一个 YAML 文件定义多个容器,可以指定每个容器的镜像、端口映射、环境变量等配置。
  • 简化应用的部署和管理:只需要一个命令即可启动、停止和管理整个应用,无需手动配置和管理每个容器。
  • 自动化容器的网络和存储:Docker Compose 可以自动创建和管理容器之间的网络连接和数据卷。

Docker Compose 示例

下面是一个使用 Docker Compose 启动一个简单的 Node.js 应用的示例:

version: '3'
services:
  app:
    build: .
    ports:
      - '8080:8080'
    environment:
      - NODE_ENV=production

在这个示例中,我们定义了一个名为 app 的服务,使用了当前目录下的 Dockerfile 构建镜像。该服务将会将容器内部的 8080 端口映射到宿主机的 8080 端口,同时设置了一个名为 NODE_ENV 的环境变量为 production

要启动这个应用,只需在终端中进入包含该 YAML 文件的目录,然后运行以下命令:

$ docker-compose up -d

这个命令会启动并后台运行所有定义的服务。你可以使用 -d 参数将服务以守护进程的方式运行。

示例项目

为了更好地理解如何使用 Docker Compose 启动一个 Node.js 应用,我们创建了一个简单的示例项目。项目的目录结构如下:

├── app
│   ├── index.js
│   ├── package.json
│   └── Dockerfile
└── docker-compose.yml

app 目录中,我们创建了一个简单的 Node.js 应用,其中 index.js 是应用的入口文件,package.json 是应用的依赖配置文件,Dockerfile 是用于构建应用镜像的文件。

下面是 index.js 的代码示例:

const http = require('http');

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello, world!');
});

const port = process.env.PORT || 8080;

server.listen(port, () => {
  console.log(`Server listening on port ${port}`);
});

这个简单的应用创建了一个 HTTP 服务器,监听指定的端口(从环境变量 PORT 中获取或默认为 8080),并在访问时返回一个简单的文本响应。

接下来,我们需要编写 Dockerfile 来构建应用镜像:

FROM node:14

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 8080

CMD [ "node", "index.js" ]

这个 Dockerfile 使用了官方的 Node.js 镜像作为基础镜像,将工作目录切换到 /app,然后复制 package*.json 文件到工作目录,并运行 npm install 安装依赖。接着,将整个应用目录复制到工作目录,并将容器内部的 8080 端口暴露出去。最后,使用 CMD 指令运行应用的入口文件。

最后,我们需要编写 docker-compose.yml 文件来定义应用的服务:

version: '3'
services:
  app:
    build: ./app
    ports:
      - '8080:8080'