- [参考文档](https://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html)
基于Docker微服务部署,能够极大的避免掉环境配置,启动慢,冗余步骤多等缺点。入门的基础知识可以参考上面的文档,详细看一下。
`直接进入主题`
整体构建思路:
1. 设置镜像的源(即此镜像在什么环境运行,前端为`NodeJS`),需要用到的命令有`FROM`。
2. 将所需要的代码给放到统一的文件目录下,剔除开发代码,只保留一个服务端和前端webpack打包后的文件。
- 基于此内容,还能实现远端安装npm包,远端打包。
- 因为目前部分开发项目,需要使用到私有NPM包,因此需要设置NPM的源。
- 需要在项目本身增加`.npmrc`文件,已用作下载NPM包的验证使用。
- 在远端进行相关操作,如操作文件,拷贝删除复制,运行相关sh命令等。
此上的`DockerFile`涉及到的几个含义如下:
- FROM :设置该镜像所继承的官方版本/运行基础环境。
- COPY :拷贝命令。
- WORKDIR :指该镜像的工作路径。
- ENV :设置项目的环境变量,可以理解为`NodeJs`里面的`process.env`
- ARG :`DockerFile`的变量参数。
- RUN :运行的sh命令
根据上述的描述和思路,再次仔细看一下平台H5的DockerFile文件。
```
FROM node:alpine
ARG LOCAL_PROJ_DIR=./cwp
ARG PROJ_NAME=cwp
ENV NODE_ENV preview
ENV SERVER devel-c
ENV SERVICE $PROJ_NAME
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
COPY $LOCAL_PROJ_DIR /cwp
RUN cd /cwp \
&& npm install --registry=http://nexus.devops.xxxxxxxxx.com/repository/anpm/\
&& npm run build \
&& rm -rf client node_modules test webpack
RUN cd /cwp/server \
&& npm install --production --registry=http://nexus.devops.xxxxxxxxx.com/repository/anpm/
WORKDIR /cwp/server
```
3. 打Docker镜像包
------------
以上皆为本地的准备工作,做好本地的准备工作后,将打好的Docker image在服务器上部署,并运行需要进行的操作步骤如下:
1. 根据部署服务器,,登录进需要部署的服务器。
2. 准备`docker-compose.yml`文件。针对此文件有几个需要备注描述一下。
- docker-name 该docker名称
- docker-image 该docker的image镜像源
- container_name 该容器名称
- ports 对外开放接口
- volumes 文件隐射关系,左对右
- environment docker运行参数变量
- command docker运行的cmd命令
- network docker运行的网络关系,此处不做详解,服务一般为`common-network`
3. 一般在服务端会用到的命令有以下几条。
- docker ps 当前服务运行的docker镜像列表
- grep 修饰符,过滤参数
- docker images docker服务所有的镜像
- docker exec -it xxx /bin/sh 进入到docker容器名称为xx的容器
- docker-compose down
- docker-compose up
- tail 打印输出某个文件,一般用于logs/info.log文件
- cat 展示某个文件
依旧,以平台H5的`docker-compose.yml`文件为例。
```
version: "2"
services:
xxx:
image: registry.cn-hangzhou.aliyuncs.com/xxxxxx/xxxx镜像版本号
restart: always
container_name: xxx
ports:
- "7710:7710"
environment:
- NPM_CONFIG_LOGLEVEL=info
- PORT=7710
- NODE_ENV=preview
- REDIS_HOST=xxx-redis
- REDIS_PORT=6379
- REDIS_DB=3
- REDIS_PASSWORD=admin123
- ES_PATH=http://xxxx.xxxx.xxxx.cn:8082/v2
command: ["npm", "run", "online"]
mem_limit: 209715200
networks:
default:
external:
name: test-network
```