<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: zhangbowy</title>
    <description>The latest articles on DEV Community by zhangbowy (@zhangbo).</description>
    <link>https://dev.to/zhangbo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F951902%2F545b456f-3ada-49c6-8801-26f6d531c9c4.jpeg</url>
      <title>DEV Community: zhangbowy</title>
      <link>https://dev.to/zhangbo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zhangbo"/>
    <language>en</language>
    <item>
      <title>使用docker-compse部署Node.js</title>
      <dc:creator>zhangbowy</dc:creator>
      <pubDate>Sat, 22 Oct 2022 08:48:45 +0000</pubDate>
      <link>https://dev.to/zhangbo/shi-yong-docker-compsebu-shu-nodejs-34lg</link>
      <guid>https://dev.to/zhangbo/shi-yong-docker-compsebu-shu-nodejs-34lg</guid>
      <description>&lt;h1&gt;
  
  
  前言
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;阅读本文默认你已熟悉docker&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  什么是docker-compose？
&lt;/h2&gt;

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

&lt;p&gt;&lt;code&gt;docker-compose&lt;/code&gt; 定位是定义和运行多个 Docker 容器的应用。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker-compose&lt;/code&gt; 有两个重点&lt;/p&gt;

&lt;h3&gt;
  
  
  1、docker-compose 命令行工具
&lt;/h3&gt;

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

&lt;h3&gt;
  
  
  2、docker-compose.yml 配置文件
&lt;/h3&gt;

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

&lt;p&gt;&lt;strong&gt;定义你容器的编排参数, 后面使用里我们会看到文件示例&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  为什么不用 docker run？
&lt;/h2&gt;

&lt;p&gt;docker run运行一个要一堆的参数，如 &lt;code&gt;--network&lt;/code&gt;, &lt;code&gt;--volume&lt;/code&gt;, &lt;code&gt;-p&lt;/code&gt; 等等.&lt;/p&gt;

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

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

&lt;p&gt;&lt;strong&gt;更快速编排我们的应用。&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  安装
&lt;/h1&gt;

&lt;p&gt;阅读此节你已经安装了docker环境&lt;/p&gt;

&lt;h2&gt;
  
  
  一键安装
&lt;/h2&gt;

&lt;h3&gt;
  
  
  命令
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -L https://get.daocloud.io/docker/compose/releases/download/v2.11.2/docker-compose-`uname -s`-`uname -m` &amp;gt; /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  测试安装是否成功
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker-compose  -v
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;有输出那就安装成功了&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZC_LzlJo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d30fc90b9c284e368b08d1c428c40b30%257Etplv-k3u1fbpfcp-zoom-1.image" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZC_LzlJo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d30fc90b9c284e368b08d1c428c40b30%257Etplv-k3u1fbpfcp-zoom-1.image" alt="" width="269" height="59"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  基本使用
&lt;/h1&gt;

&lt;p&gt;准备一个Dockerfile, 例如&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM registry.cn-hangzhou.aliyuncs.com/zhangbo007/node:14.18.0-alpine
# 设置镜像作者
LABEL MAINTAINER="zhangbo"

# 设置工作目录
WORKDIR /app

# 清除npm缓存文件
RUN npm cache clean --force &amp;amp;&amp;amp; 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" ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  配置文件
&lt;/h2&gt;

&lt;p&gt;docker-compose.yml&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;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
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;更多配置项详见&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.docker.com/compose/compose-file/"&gt;https://docs.docker.com/compose/compose-file/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  常用命令
&lt;/h2&gt;

&lt;p&gt;后台启动 &lt;code&gt;docker-compose up -d&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;指定配置文件启动 &lt;code&gt;docker-compose -f docker-compose.yml up -d&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;查看启动的服务 &lt;code&gt;docker-compose ps&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;查看日志 &lt;code&gt;docker-compose logs xx&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  运行多个容器(待补充)
&lt;/h1&gt;

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

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

&lt;p&gt;&lt;strong&gt;待补充&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  配合ci/cd使用
&lt;/h1&gt;

&lt;p&gt;以部署node.js为例子&lt;/p&gt;

&lt;h2&gt;
  
  
  1、阿里云流水线
&lt;/h2&gt;

&lt;h3&gt;
  
  
  逻辑梳理
&lt;/h3&gt;

&lt;h4&gt;
  
  
  a 准备好一个Dokcerfile
&lt;/h4&gt;

&lt;h4&gt;
  
  
  b 写一个docker-compose.yml的配置文件丢到服务器。
&lt;/h4&gt;

&lt;h4&gt;
  
  
  c 在流水线的环境里
&lt;/h4&gt;

&lt;h5&gt;
  
  
  1、步骤一 构建镜像 &lt;strong&gt;用commit哈希作为版本号, 而后&lt;/strong&gt;上传到仓库
&lt;/h5&gt;

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

&lt;ul&gt;
&lt;li&gt;  ##### 2、步骤二 在服务器执行部署脚本&lt;/li&gt;
&lt;li&gt;  -   切换到docker-compose文件目录

&lt;ul&gt;
&lt;li&gt;    &lt;code&gt;cd /home/docker&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  停掉正在运行的容器&lt;/li&gt;
&lt;li&gt;    &lt;code&gt;docker-compose down -v&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  用脚本修改docker-compose.yml 里镜像的版本号&lt;/li&gt;
&lt;li&gt;  执行命令后台启动&lt;/li&gt;
&lt;li&gt;     &lt;code&gt;docker-compose up -d&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  流水线配置
&lt;/h3&gt;

&lt;p&gt;配置2个阶段&lt;/p&gt;

&lt;h4&gt;
  
  
  docker构建
&lt;/h4&gt;

&lt;p&gt;标签输 ${CI_COMMIT_ID}。&lt;/p&gt;

&lt;p&gt;镜像仓库ACR需要自己去创建好。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NbK-J_VD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e222edaa29c64f3c84918b77b8de42c9%257Etplv-k3u1fbpfcp-zoom-1.image" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NbK-J_VD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e222edaa29c64f3c84918b77b8de42c9%257Etplv-k3u1fbpfcp-zoom-1.image" alt="" width="880" height="708"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Docker部署
&lt;/h4&gt;

&lt;h5&gt;
  
  
  部署脚本
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/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
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;流水线选好主机, 把脚本填写在部署配置里&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GTCCAA----/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2d889e54b2b845809a39fba4c67774e2%257Etplv-k3u1fbpfcp-zoom-1.image" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GTCCAA----/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2d889e54b2b845809a39fba4c67774e2%257Etplv-k3u1fbpfcp-zoom-1.image" alt="" width="880" height="907"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;保存运行一下&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2WCI8pdb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5d56228eeea3426ea622b0709d499476%257Etplv-k3u1fbpfcp-zoom-1.image" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2WCI8pdb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5d56228eeea3426ea622b0709d499476%257Etplv-k3u1fbpfcp-zoom-1.image" alt="" width="880" height="252"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  测试
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--v6CZG3ad--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/bf0d4215341744b88dc025978e36dfde%257Etplv-k3u1fbpfcp-zoom-1.image" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--v6CZG3ad--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/bf0d4215341744b88dc025978e36dfde%257Etplv-k3u1fbpfcp-zoom-1.image" alt="" width="880" height="85"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;成功部署！&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  参考文章
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://www.theserverside.com/blog/Coffee-Talk-Java-News-Stories-and-Opinions/Docker-run-vs-docker-compose-Whats-the-difference"&gt;https://www.theserverside.com/blog/Coffee-Talk-Java-News-Stories-and-Opinions/Docker-run-vs-docker-compose-Whats-the-difference&lt;/a&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
