Docker搭建部署Node项目的方法步骤_docker

来源:脚本之家  责任编辑:小易  
目录
什么是Docker
客户端Docker
Docker基本操作
镜像名称
拉取镜像
其他操作
Dockerfile
Docker-compose
构建nginx-node-postgres项目

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

什么是Docker

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

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

客户端Docker

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

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,主要做了如下步骤

创建容器工作目录 复制相关配置文件到容器 在容器安装npm包 运行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

db配置的是数据库postgres,其中数据卷 volumes 映射了数据库目录和初始化脚步 app配置的是node服务,其中的build是映射上面dockerfile所在的目录;depends_on表示依赖的容器、启动先后,这里先启动db再启动node;links表示将db的名称映射到app容器 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项目的方法步骤的文章就介绍到这了,更多相关Docker搭建部署Node 内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!

您可能感兴趣的文章:从零搭建docker+jenkins+node.js自动化部署环境的方法

  • 本文相关:
  • 理解docker(1):docker安装和基础用法详细介绍
  • 解决docker 容器设置中文语言包出现的问题
  • 解决docker pull镜像速度慢的问题的方法
  • 详解docker中使用systemctl启动服务报错的解决办法
  • 从零搭建docker私有仓库的步骤
  • 新手必看docker安装jenkins详细教程
  • 关于docker部署的jenkins跑git上的程序的问题
  • docker集群的创建与管理实例详解
  • docker+daocloud实现前端项目自动构建部署
  • 如何使用docker对容器资源进行限制
  • 生产环境,测试环境中,Docker 可以做什么
  • 开发者可以使用Docker做什么
  • 开发者可以使用Docker做什么?
  • Node.js Buffer模块功能及常用方法实例分析
  • 怎么把web应用程序搬到docker上
  • kafka是否适合在docker中使用?单机集群是否有意义
  • docker究竟是什么,为什么这么流行,它的优点和缺陷有哪些
  • 如何用Docker安装Eclipse Che和Codenvy
  • 如何访问docker容器的web
  • 基于 Docker 开发 NodeJS 应用
  • kubernetes 指定在哪个node启动镜像
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全dockerhyper-vvmwarevirtualboxxenserverkvmqemuopenvzxencloudstackopenstack云计算技术云其它首页服务器云和虚拟化docker从零搭建docker+jenkins+node.js自动化部署环境的方法理解docker(1):docker安装和基础用法详细介绍解决docker 容器设置中文语言包出现的问题解决docker pull镜像速度慢的问题的方法详解docker中使用systemctl启动服务报错的解决办法从零搭建docker私有仓库的步骤新手必看docker安装jenkins详细教程关于docker部署的jenkins跑git上的程序的问题docker集群的创建与管理实例详解docker+daocloud实现前端项目自动构建部署如何使用docker对容器资源进行限制docker获取镜像报错docker: errodocker 给运行中的容器设置端口映docker.service启动失败:unit ndocker 清理命令集锦浅谈docker-compose网络设置之neubuntu14.04+docker的安装及使用docker容器访问宿主机网络的方法docker容器如何优雅的终止详解详解如何使用docker部署一个web项ubuntu vps安装docker报错:canndocker volumn容器间共享数据的实现centos 7.2 下安装 docker 1.12.3 版的详docker镜像完全卸载的操作步骤如何运用docker配合python开发环境实例docker 网络工作原理详解详解ubuntu docker registry 搭建私有仓库docker 无法停止或删除容器服务问题的解决deepin apt命令安装最新版本的docker的方docker python api 安装配置的详解对docker中的overlay式网络详解
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved