DEV Community

Cover image for 使用docker-compse部署Node.js
zhangbowy
zhangbowy

Posted on

使用docker-compse部署Node.js

前言

阅读本文默认你已熟悉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
Enter fullscreen mode Exit fullscreen mode

测试安装是否成功

docker-compose  -v
Enter fullscreen mode Exit fullscreen mode

有输出那就安装成功了

基本使用

准备一个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" ]
Enter fullscreen mode Exit fullscreen mode

配置文件

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
Enter fullscreen mode Exit fullscreen mode

更多配置项详见

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需要自己去创建好。

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
Enter fullscreen mode Exit fullscreen mode

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

保存运行一下

测试

成功部署!

参考文章

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

Top comments (0)