Docker搭建部署Node项目

前段时间做了个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 !

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345