前段时间做了个node全栈项目,服务端技术栈是 nginx + koa + postgresql。其中在centos上搭建环境和部署都挺费周折,部署测试服务器,接着上线的时候又部署生产环境服务器。这中间就有很多既无聊又费精力,吃力不讨好的"体力活"。所以就开始思考怎么自动化这部分搭建部署的工作,也就引出了Docker

什么是Docker

Docker 是比虚拟机还要轻量级的虚拟化技术,它虚拟化的实体就叫做容器。容器本身就是一个隔离了作用域的sandbox,同时它只包含了基础库和本身承载的服务,非常精简。容器运行起来后就只是宿主机中的一个进程而已,占用的资源是非常小的,这就为操作系统上运行容器集群创造了条件,可操作性和灵活性极佳。

镜像和容器又是什么关系呢?可以把镜像看成是类(class),容器看成对象(object),容器是由镜像实例化产生出来的,当然一个镜像可以生成多个容器。

客户端Docker

如果不在服务器,我们在客户端要怎么使用 Docker呢?在 WindowsOSX 上可以使用 Docker Desktop,再加上 Kitematic,这两个都是桌面管理工具,常规的操作方面非常便利。Docker DesktopKitematic 只是可视化了部分操作,命令行还是必备的,因为很多操作也能命令行才行。

Docker基本操作

镜像名称

关于镜像标签,比如nginx:1.19.0-alpine,1.19.0是 nginx 的版本号,alpine是os的代号。

Jessie: debian 8

Stretch: debian 9

Buster: debian 10

Alpine: Alpine,推荐使用,因为体积非常小

Alpine 是体积最小的一个版本,有些甚至是其他版本的四分之一。这意味着构建镜像更快,运行效率更高,因为加载的组件更加少,无形中也意味着漏洞更少更安全。

拉取镜像

docker pull nginx:1.19.0-alpine

启动容器

--name web:指定容器名称为web

-p 8080:80: 容器nginx监听端口为80,映射到本地端口8080

-v xxxx:xxxx:这里是用本地配置文件映射到容器nginx配置文件

-d:后台运行

nginx:1.19.0-alpine:使用的镜像

docker run --name web -p 8080:80 -v /usr/etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx:1.19.0-alpine

其他操作

docker images #显示镜像
docker rmi xxx #删除镜像
docker ps #显示运行的容器
docker rm xxx #删除容器

Dockerfile

构建镜像比较方便的是使用Dockerfile,它就是镜像的配置文件,只要有Dockerfile,随时可以构建镜像。如下就是构建一个非常简单的nginx镜像,from就是构建时使用的基础镜像:

FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf

Docker-compose

当我们的项目不仅只有单个容器,而是需要运行多个容器,而且容器之间还需要互相通信的时候,就需要更强大的管理工具了。比如k8s,但我们目前的小项目使用官方自带的Docker-compose已经足矣。

首先需要docker-compose.yml配置文件,比如下面就是两个容器的模板,image表示使用的镜像,ports则表示端口映射,volumes则是需要映射的数据卷:

version: "3"

services:
webapp:
image: web
ports:
- "8080:80"
volumes:
- "/data"
redis:
image: "redis:alpine"

接着可以使用以下命令行进行操作:

docker-compose build [options] [SERVICE...] #构建(重新构建)项目中的服务容器
docker-compose up -d # 运行 compose 项目,后台执行

docker-compose up 是个非常强大的命令,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。链接的服务都将会被自动启动,除非已经处于运行状态。可以说,大部分时候都可以直接通过该命令来启动一个项目。

构建nginx-node-postgres项目

有了上面的基础,接着就可以构建我们自己的项目了,首先是node服务的dockerfile,主要做了如下步骤

  1. 创建容器工作目录
  2. 复制相关配置文件到容器
  3. 在容器安装npm
  4. 运行pm2启动容器
FROM node:14.5.0-alpine3.12
# 工作目录
WORKDIR /usr/src/app
# 复制配置文件
COPY package*.json ./
COPY process.yml ./
RUN npm set registry https://registry.npm.taobao.org/ \
&& npm install pm2 -g \
&& npm install
# 使用pm2管理
CMD ["pm2-runtime", "process.yml", "--only", "app", "--env", "production"]
EXPOSE 3010

接着配置 docker-compose.yml

  1. db配置的是数据库postgres,其中数据卷 volumes 映射了数据库目录和初始化脚步
  2. app配置的是node服务,其中的build是映射上面dockerfile所在的目录;depends_on表示依赖的容器、启动先后,这里先启动db再启动nodelinks表示将db的名称映射到app容器
  3. nginx容器depend_on于app容器,同时配置转发node的服务
version: '3'

services:
db:
image: postgres:12.3-alpine
container_name: postgres
environment:
- TZ=Asia/Shanghai
- POSTGRES_PASSWORD=xxxx
volumes:
- ./postgres/data:/var/lib/postgresql/data
- ./postgres/init:/docker-entrypoint-initdb.d
ports:
- 5432:5432
restart: always #始终重启,生产环境中推荐配置为 always
expose:
- 5432 app:
image: koa-pg
container_name: koa
volumes:
- ./dist:/usr/src/app/dist
- ./logs:/usr/src/app/logs
build: ./
environment:
- TZ=Asia/Shanghai
restart: always
depends_on:
- db
links:
- db
expose:
- 3010 nginx:
image: nginx:1.19.0-alpine
container_name: nginx
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
ports:
- 8080:80
environment:
- TZ=Asia/Shanghai
restart: always
depends_on:
- app
links: # host名代替ip配置nginx的转发
- app
expose:
- 8080

配置完我们的项目之后,接着就是运行起来

docker-compose up

在我们的本地开发机是如此,部署到服务器也是如此,你想要部署几台服务器就部署几台,只要装了docker,都是一句命令行就能解决的事情。

要启动几个容器,修改下docker-compose.yml的配置,再次docker-compose up,so easy !

Docker搭建部署Node项目的更多相关文章

  1. docker自动化部署前端项目实战一

    docker自动化部署前端项目实战一 本文适用于个人项目,如博客.静态文档,不涉及后台数据交互,以部署文档为例. 思路 利用服务器node脚本,监听github仓库webhook push事件触发po ...

  2. 在阿里云创建子域名,配置nginx,使用pm2部署node项目到ubuntu服务器

    配置域名 在阿里云找到主域名 进入主域名之后,右上角添加解析,添加子域名, 记录类型选择cname,主机记录填写子域名的名称,记录值为主域名,至此阿里云已经配置好了. 检查nginx安装 首先检查服务 ...

  3. docker中部署django项目~~Dockfile方式和compose方式

    1.  背景:   本机win10上,后端django框架代码与前端vue框架代码联调通过. 2.  目的:   在centos7系统服务器上使用docker容器部署该项目. 3.  方案一:仅使用基 ...

  4. 基于 Express 搭建一个node项目 - 起步

    一,如何基于 Express 搭建一个node项目 什么是Express 借用官方的介绍,Express是一个基于Node.js平台的极简.灵活的web应用开发框架,它提供了一系列强大的特性,帮助你创 ...

  5. 在Linux服务器上部署node项目(git部署,forever持续运行,配置SSL证书)

    一.环境部署 1.下载安装包: wget https://nodejs.org/dist/v9.9.0/node-v9.9.0-linux-x64.tar.xz 2.解压并进入目录: xz -d no ...

  6. 记基于docker+gunicorn部署sanic项目遇到的很多很多坑

    前言: 最近有个项目需要上线,是python中sanic网络异步框架写的,并且要求使用docker+nginx来部署项目实现负载均衡,于是乎百度了sanic项目部署,基本上都是基于docker+gun ...

  7. 记录一次使用iisnode部署node项目遇到的坑!

    前言:最近因为项目原因,需要在IIS下部署node项目,在此之前,曾经部署过类似的项目,因此在这次部署还算比较顺利,只是在其中遇到了几个比较坑的问题,所以这次使用博客记录下来,如有园友遇到过类似问题, ...

  8. CentOS 7 部署 node 项目

    CentOS 7 部署 node 项目 安装 node 环境 方法一:使用 wget 的方式下载压缩包进行解压 淘宝node镜像地址,进入地址选择自己想要安装的版本 wget https://npm. ...

  9. 十一、Docker搭建部署SpringCloud微服务项目Demo

    环境介绍 技术选型:SpringCloud&SpringCloud Alibaba&Docker 微服务模块划分: 员工模块:ems-employees 部门模块:ems-depart ...

随机推荐

  1. LinkedList竟然比ArrayList慢了1000多倍?(动图+性能评测)

    数组和链表是程序中常用的两种数据结构,也是面试中常考的面试题之一.然而对于很多人来说,只是模糊的记得二者的区别,可能还记得不一定对,并且每次到了面试的时候,都得把这些的概念拿出来背一遍才行,未免有些麻 ...

  2. jmeter对数据库进行简单的压测

    1.点击测试计划,再点击“浏览”,把JDBC驱动添加进来: 注:JDBC驱动一般的位置在java的安装地址下,路径类似于:    \java\jre\lib\ext 文件为:mysql-connect ...

  3. Oracle SQL调优系列之SQL Monitor Report

    @ 目录 1.SQL Monitor简介 2.捕捉sql的前提 3.SQL Monitor 参数设置 4.SQL Monitor Report 4.1.SQL_ID获取 4.2.Text文本格式 4. ...

  4. Beta冲刺<1/10>

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺--第一天(05.19) 作业正文 如下 其他参考文献 ... B ...

  5. window 开机重启运行bat文件(运行java的jar包)

    1:直接打开电脑的目录:(记得勾选查看隐藏项目) C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp,在里面新建start.bat ...

  6. 新一代APM链路监控选型的一个总结重点是skywalking和pinpoint的对比

    链路监控选型的一个比较:1.cat框架:需要对业务代码有较强的侵入性,对代码的侵入性很大,集成成本较高,风险较大:2.zipkin框架:仅支持spring cloud,不支持dubbo,功能及其简单, ...

  7. 利用EasyMock生成数据库连接简单测试示例

    package demo.mock; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.Re ...

  8. SSM登录拦截验证

    /** * 登陆拦截器,用于后台管理系统拦截,判断用户是否登录 * @author ljy * @date 2015/8/19 */public class LoginForAdminIntercep ...

  9. 输入url后浏览器干了些什么(详解)

    输入url后浏览器干了些什么(详解) DNS(Domain Name System, 域名系统) 解析 DNS解析的过程就是寻找哪台机器上有你真正需要的资源过程.但你在浏览器张红输入一个地址时,例如: ...

  10. 【SpringBoot MQ 系列】RabbitListener 消费基本使用姿势介绍

    [MQ 系列]RabbitListener 消费基本使用姿势介绍 之前介绍了 rabbitmq 的消息发送姿势,既然有发送,当然就得有消费者,在 SpringBoot 环境下,消费可以说比较简单了,借 ...