docker-compose with node&pm2&nginx 使用

3,136 阅读4分钟

前言

我也只是一个初学者, 这篇文章同时作为笔记记录一下学习过程.

在理解docker-compose之前, 首先我们要知道docker是什么, 引言自知乎:

Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。

docker就是类似的理念。现在都流行云计算了,云计算就好比大货轮。docker就是集装箱。

1.不同的应用程序可能会有不同的应用环境,比如.net开发的网站和php开发的网站依赖的软件就不一样,如果把他们依赖的软件都安装在一个服务器上就要调试很久,而且很麻烦,还会造成一些冲突。比如IIS和Apache访问端口冲突。这个时候你就要隔离.net开发的网站和php开发的网站。常规来讲,我们可以在服务器上创建不同的虚拟机在不同的虚拟机上放置不同的应用,但是虚拟机开销比较高。docker可以实现虚拟机隔离应用环境的功能,并且开销比虚拟机小,小就意味着省钱了。

2.你开发软件的时候用的是Ubuntu,但是运维管理的都是centos,运维在把你的软件从开发环境转移到生产环境的时候就会遇到一些Ubuntu转centos的问题,比如:有个特殊版本的数据库,只有Ubuntu支持,centos不支持,在转移的过程当中运维就得想办法解决这样的问题。这时候要是有docker你就可以把开发环境直接封装转移给运维,运维直接部署你给他的docker就可以了。而且部署速度快。

3.在服务器负载方面,如果你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker部署的话,这些内存就会利用起来。

继以上所说, compose 就如同它的字面意思"组合",它就好像是一个大箱子,可以把几个不相关的集装箱(docker容器)给组合起来,变成一个整体。

使用

  1. 安装docker并配置加速器DaoCloud(不详述, 如有需要请点击前往官网)
  2. 新建文件夹并初始化工程

    mkdir test && cd test && npm init

  3. 以koa为例测试, 安装koa

    npm i koa -S

  4. 新建nginx文件夹并向其中添加并编辑nginx.conf

    user nginx;worker_processes 1;
    events {  worker_connections 512;}
    http {  log_format main  '$remote_addr - $remote_user[$time_local] "$http_user_agent" "$http_x_forwarded_for" "$upstream_addr"';  access_log /etc/nginx/access.log main;
      # 设置server集群,负载均衡关键指令  upstream test_server {    server app:3000;  }
      server {    listen 80;    server_name localhost;    location / {      proxy_pass http://test_server;    }  }}

  5. 项目根目录添加并编辑app.js

    const Koa = require('koa')
    const app = new Koa()
    app.use(ctx => {  ctx.body = 'Hello World'})
    app.listen(3000)console.log('app started at http://localhost:3000/')

  6. 项目根目录添加并编辑pm2配置文件process.json

    {  "apps": [    {      "name": "app-name",      "script": "app.js",      "instances": 4,      "env": {        "production": true      }    }  ]}

  7. 项目根目录添加并编辑配置文件docker-compose.yaml

    version: "2"
    services:
      nginx:
        restart: always
        image: nginx
        volumes:
          #~/Documents/docker/test/nginx为本机目录, /etc/nginx为容器目录, port同理
          - ~/Documents/docker/test/nginx:/etc/nginx 
        ports:
          - 80:80
        links:
          #建立连接,web容器就无需暴露端口出去
          - app
      app:
        #指定container的名称, 后续方便使用命令进入到容器内以及与nginx.conf相对应
        container_name: app
        #构建容器
        build: .
        volumes:
          - ~/Documents/docker/test:/usr/src/app
        ports:
          - "3000:3000"
    

  8. 项目跟目录添加并编辑Dockerfile

    FROM node:9WORKDIR usr/src/appADD . /usr/src/appRUN npm config set registry https://registry.npm.taobao.org/ && \    npm i -g pm2 --no-optionalEXPOSE 3000
    #pm2在docker中使用命令为pm2-dockerCMD ["pm2-docker", "start", "--json", "process.json"]

  9. 启动

    // 构建并启动
    // 加"-d"为后台启动
    docker-compose up
    // 强制重新构建并启
    docker-compose up --force-recreate --build

启动成功:


浏览器访问http://localhost:3000/


如果有什么不正确的地方还希望指正, 谢谢!!!