使用docker-compse部署Node.js
Tags: node, javascript
Published: 2022-10-22 08:48:45

# 前言

> 阅读本文默认你已熟悉docker

## 什么是docker-compose？

Docker Compose 是 Docker 官方编排（Orchestration）项目之一，负责快速的部署分布式应用，它是由 `python` 编写。

`docker-compose` 定位是定义和运行多个 Docker 容器的应用。

`docker-compose` 有两个重点

### 1、docker-compose 命令行工具

docker 提供了一个命令行工具 `docker-compose` 帮助完成镜像的编排， 要使用 `docker-compose` ， 需要先编写一个 `docker-compose.yml` 文件。

### 2、docker-compose.yml 配置文件

> YAML 是一个可读性高，用来表达数据序列的格式。YAML参考了其他多种语言，包括：C语言、Python、Perl，并从XML、电子邮件的数据格式（RFC 2822）中获得灵感。

**定义你容器的编排参数, 后面使用里我们会看到文件示例**

  


## 为什么不用 docker run？

docker run运行一个要一堆的参数，如 `--network`, `--volume`, `-p` 等等.

如果有多个容器组合成一个项目，比如一个 webserver nodejs，数据库，缓存等等容器，我们就需要一个个的定义网络等参数，然后一个个启动, 属实很麻烦。

有了 `compose` 我们只需要一个简单的 `docker-compose up` ，它就会自动帮我们构建镜像，配置网络等功能。

**更快速编排我们的应用。**

# 安装

阅读此节你已经安装了docker环境

## 一键安装

### 命令

```
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.11.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
```

### 测试安装是否成功

```
docker-compose  -v
```

有输出那就安装成功了

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d30fc90b9c284e368b08d1c428c40b30~tplv-k3u1fbpfcp-zoom-1.image)

# 基本使用

准备一个Dockerfile, 例如

```
FROM registry.cn-hangzhou.aliyuncs.com/zhangbo007/node:14.18.0-alpine
# 设置镜像作者
LABEL MAINTAINER="zhangbo"

# 设置工作目录
WORKDIR /app

# 清除npm缓存文件
RUN npm cache clean --force && npm cache verify

# 设置环境变量
ENV NODE_ENV prd

# 设置yuan
RUN npm config set registry https://registry.npm.taobao.org

# 复制文件
COPY . .

# 安装依赖
RUN npm install

# 暴露端口
EXPOSE 8000

CMD [ "npm", "run", "prod" ]
```

## 配置文件

docker-compose.yml

```
version: "3.9" #版本
services: # 下面可配置多个
  node: # 服务名字 自已定义
    container_name: pu-node-server-1 # 容器名称(可不定义)
    restart: always # 自动重启配置
    environment:  # 环境变量 类似 -e
      - EGG_SERVER_ENV=daily
    image: registry.cn-hangzhou.aliyuncs.com/zhangbo007/pu-pdf-node-server:33333 #镜像
    ports: # 端口号映射
      - "7001:8001"
     volumes: # 定义数据卷，类似 -v
      # - db_data:/var/lib/mysql
      networks: # 可选，需要创建的网络，类似 docker network create
```

更多配置项详见

https://docs.docker.com/compose/compose-file/

## 常用命令

后台启动 `docker-compose up -d`

指定配置文件启动 `docker-compose -f docker-compose.yml up -d`

查看启动的服务 `docker-compose ps`

查看日志 `docker-compose logs xx`

  


# 运行多个容器(待补充)

例如，如果您需要 node、Nginx 和 redis以容器同时运行，则您必须发出三个单独的*docker run*命令

与*docker run*相比，*docker-compose*允许在单个 YAML 文件中配置多个容器。当*docker-compose up*命令运行时，它将启动*docker-compose.yaml*文件中引用的每个容器。

 


**待补充**

# 配合ci/cd使用

以部署node.js为例子

## 1、阿里云流水线

### 逻辑梳理

#### a 准备好一个Dokcerfile

#### b 写一个docker-compose.yml的配置文件丢到服务器。

#### c 在流水线的环境里

##### 1、步骤一 构建镜像 **用commit哈希作为版本号, 而后**上传到仓库

-   **commit哈希阿里云flow的变量是** ${CI_COMMIT_ID}。
-   -     最开始我使用的时间为版本号, 后来发现这样每次都生成一个新的，仓库很冗余, 用 commit sha 便可以解决这个问题。

<!---->

-   ##### 2、步骤二 在服务器执行部署脚本
-   -   切换到docker-compose文件目录
    -     `cd /home/docker`
    -   停掉正在运行的容器
    -     `docker-compose down -v`
    -   用脚本修改docker-compose.yml 里镜像的版本号
    -   执行命令后台启动
    -      `docker-compose up -d`

  


### 流水线配置

配置2个阶段

#### docker构建

标签输 ${CI_COMMIT_ID}。

镜像仓库ACR需要自己去创建好。

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e222edaa29c64f3c84918b77b8de42c9~tplv-k3u1fbpfcp-zoom-1.image)

#### Docker部署

##### 部署脚本

```
#!/bin/bash
# 切换到docker-compose.yml目录
cd /home/docker
# 停止
docker-compose down -v
# 替换版本号
sed -i  "s/`cat docker-compose.yml |grep image|awk -F ":" '{print $3}'`/${CI_COMMIT_ID}/g" docker-compose.yml
# 后台启动
docker-compose up -d
```

流水线选好主机, 把脚本填写在部署配置里

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2d889e54b2b845809a39fba4c67774e2~tplv-k3u1fbpfcp-zoom-1.image)

保存运行一下

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5d56228eeea3426ea622b0709d499476~tplv-k3u1fbpfcp-zoom-1.image)

### 测试

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/bf0d4215341744b88dc025978e36dfde~tplv-k3u1fbpfcp-zoom-1.image)

> 成功部署！

  


# 参考文章

https://www.theserverside.com/blog/Coffee-Talk-Java-News-Stories-and-Opinions/Docker-run-vs-docker-compose-Whats-the-difference