/ NodeJS

Docker 入门实践

1.1. Dockerfile文件编写

在项目中新建Dockerfile文件,写入如下内容:


FROM node:8.12.0-alpine
 
ENV NODE_ENV production
 
WORKDIR /usr/src/app
 
# 复制 package.json,如果依赖包不发生变化,当前npm模块会有镜像缓存
COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"]
 
# 安装 app 依赖
RUN npm install --production --silent --registry=https://registry.npm.taobao.org
 
COPY ./src ./src
 
EXPOSE 2368
 
CMD npm start

命令含义:

  • FROM 指定nodejs版本号,-alpine表示精简版本,可以减小Docker Image的体积
  • COPY 复制当前目录到 image 文件的指定目录
  • WORKDIR 指定工作路径
  • RUN 在指定工作目录,执行命令
  • EXPOSE 暴露容器端口,允许外部连接
  • CMD 容器启动后执行命令,与 RUN 命令区别,Dockerfile可以包含多个RUN命令,CMD只能有一个

1.2. Docker Image 构建

在Dockerfile 文件之后,使用 docker build 命令构建 image 文件:

docker build -t node-server ./

之后使用 docker image ls 就可以看到构建好的 image 文件了。

1.3. Dockerfile Container (容器)运行

docker run --rm -it -p 2368:2368 node-server

执行上述命令,即可启动容器,访问本地 127.0.0.1:2368 即可获取内容。

1.4. Docker Compose

实际应用场景中,我们可能还会 用到 nginx 做负载和静态资源转发,然后会为 nginx 再写一个Dockerfile。

当然将nginx和刚才的node server混合到一个Dockerfile也是可以的,但建议还是将 nginx node 还有数据库等等做拆分,然后使用docker compose来对Docker 容器进行整合。

使用 docker compose 时,主要是编写 docker-compose.yml 构建文件。

version: '2.1'
 
networks:
  server:
 
services:
  # node 服务配置
  node-server:
    build: ./node-server
    environment:
      NODE_ENV: production
    networks:
      - server
    ports:
      - "2368:2368"
 
  # nginx 服务配置
  nginx:
    build: ./nginx
    depends_on:
      - node-server
    networks:
      - server
    volumes:
      # Dockerfile中不支持这种挂载方式
      # 挂载www目录
      - ./nginx/www:/var/www/demo
      # 挂载nginx log目录
      - ./nginx/log:/var/log/nginx
    ports:
      - "80:80"

命令解释:

  • version 指定yml文件的版本号

  • services 指定服务

  • build 指定 dockerfile 所在目录

  • environment 指定环境变量

  • depends_on 指定依赖,解决容器先后启动的问题

  • networks 指定容器连接的网络

  • volumes 挂载机器目录,到容器中

  • ports 指定机器端口和容器端口绑定

之后在docker-compose.yml运行下列命令即可:

docker-compose stop     #停止容器  
docker-compose rm            #删除容器
docker-compose build         #重新建立
docker-compose up -d        #启动运行 加-d 表示后台运行

如果文件内容修改后,需重新 stop、rm、build,防止直接 up 启动时使用上次缓存。

最后附上 已经 写好的 pm2 + node + nginx 的一个示例

参考文档:

Docker技术入门与实战

Docker 入门教程