原因是这样的
想要部署一个 mocker 平台, 就在朋友的推荐下选择了 https://github.com/DXY-F2E/api-mocker 这个现成的项目
该项目分为服务端 node, 客户端 vue, 以及数据库 MongoDB
在尝试直接部署的时候发现需要装一大堆的环境, node,mongo,nginx 啊, 特别的麻烦, 之前简单的使用过 docker, 就在想能不能用 docker 免环境直接部署呢? 于是就有了这次的尝试
多容器通信
该项目分为 3 个部分, 于是就要建立 3 个容器 (node,mongo,nginx)
那容器之间怎么实现通信呢?
- # 通过 link 指令建立连接
- $ docker run --name <Name> -d -p <path1>:<path2> --link <containerName>:<alias> <containerName:tag/imageID>
- --link 容器连接指令
- <containerName> : <alias>
- < 被连接容器名称 > : < 容器访问别名 >
- 注: 别名在主动建立连接的容器中访问被连接容器使用
- 以下指令在容器检测连接状态
$ curl <alias>
接下来我们开始尝试部署
实现过程
1, 构建 mongo 容器
2, 构建 node 容器并与 mongo 容器建立连接
3, 构建 nginx 容器并与 node 容器建立连接
构建 mongo 容器
我们先拉取 mongo 镜像
$ docker pull mongo:latest
- $ docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- mongo latest 05b3651ee24e 2 weeks ago 382MB
下面我们让这个镜像跑起来
- $ docker run --name mock-mongo -d -p 27017:27017 mongo:latest --auth
- # 需要与本地建立文件共享, 则使用一下 - v 指令
- # -v /data/db:/data/db
--auth 指令开启了 mongo 的连接身份校验 开启校验 是由于 node 跨容器连接时 不设置身份校验 开启服务端无法连接上 mongo 数据库
- ```
- Node.JS.MongoError: [egg-mongoose]Authentication failed.
- ```
查看容器
- $ docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 0d440be90935 mongo "docker-entrypoint.s..." 14 hours ago Up 14 hours 0.0.0.0:27017->27017/tcp mock-mongo
由于我们 mongo 开启了身份验证, 所以我们要进入 mongo 容器配置一下 node 连接时使用的账号
- $ docker exec -it mock-mongo /bin/bash
- $ mongo admin
- # 创建 manager user
- $ db.createUser({
- user:"admin", pwd:"admin",roles:[{
- role:"admin",db:"admin"
- }]
- })
- # 账号授权
- $ db.auth('admin','admin')
现在我们的 mongo 数据库已经跑起来了, 接下来我们就要建立 node 容器了
构建 node 容器并与 mongo 容器建立连接
在开始构建 node 容器前我们要先约定好 mongo 容器别名, 端口号以及登录账号密码
mongo 容器别名: db
mongo 端口号: 27017
账号密码: admin:admin
我们先修改 node 服务端的配置
文件配置 dockerfile/API-mocker/server/config/config.default.JS 修改 mongo 连接配置, db 为预先设定的 mock-mongo 容器的别名
- mongoose: {
- url: 'mongodb://admin:admin@db:27017/api-mock?authSource=admin'
- },
现在我们编写一个 Dockerfile 文件来构建镜像
- # 指定基础镜像
- FROM node:latest
- # 维护者
- MAINTAINER qiushiyuan1994@qq.com
- # 工作目录
- WORKDIR /www
- # 将本地文件添拷贝到容器中, 不会解压
- COPY API-mocker node-server/API-mocker
- EXPOSE 7001
- WORKDIR /www/node-server/API-mocker/server
- RUN NPM install
- WORKDIR /www/node-server/API-mocker
- # 构建容器后调用, 在容器启动时才进行调用
- CMD ["make", "prod_server"]
我们使用编写好的 dockerfile 文件构建镜像
$ docker build -t="mock-server:1.0.0" .
让我们查看一下镜像
- $ docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- mock-server 1.0.0 957ad2aa1f97 8 minutes ago 674MB
- mongo latest 05b3651ee24e 2 weeks ago 382MB
现在就到了关键的一步, 我们将 mocker-server 镜像运行起来, 并建立服务器与数据库的连接
$ docker run -d -i -t -p 7001:7001 --name mock-server1 --link mock-mongo:db mock-server:1.0.0 /bin/bash
让我们再看看现在正在运行的容器
- $ docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- ee780b903c64 mock-server:1.0.0 "/bin/bash" About a minute ago Up 11 seconds 0.0.0.0:7001->7001/tcp mock-server
- 0d440be90935 mongo "docker-entrypoint.s..." 16 hours ago Up 16 hours 0.0.0.0:27017->27017/tcp mock-mongo
检测 node 容器和 mongo 容器的连接状态
- $ docker exec -it mock-server /bin/bash
- $ curl db
现在我们的服务端和数据库已经建立起了连接, 接下来我们要开始部署我们的客户端
构建 nginx 容器并与 node 容器建立连接
在建立 nginx 前, 我们要先约定好, node 容器别名, nginx 转发的端口号以及客户端访问 nginx 域名及端口号
node 服务器别名: node
node 容器映射的端口号: 7001
nginx 域名: 127.0.0.1
nginx 端口号: 90
我们先拉取 nginx 镜像并建立容器
- $ docker pull nginx:latest
- $ docker run -p 90:80 --link mock-node:node nginx:latest --name mock-nginx
- # 查看容器连接状态
- $ docker exec -it mock-nginx /bin/bash
- $ env
- # 看到以下数据则表示连接成功了
- NODE_PORT_7001_TCP=tcp://172.17.0.3:7001
- NODE_PORT_7001_TCP_PORT=7001
- NODE_ENV_YARN_VERSION=1.9.4
现在我们在看看已经运行中的容器
- $ docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 09644025d148 nginx "nginx -g'daemon of..." 5 hours ago Up 5 hours 0.0.0.0:90->80/tcp mock-nginx
- ee780b903c64 mock-server:1.0.0 "/bin/bash" About a minute ago Up 11 seconds 0.0.0.0:7001->7001/tcp mock-server
- 0d440be90935 mongo "docker-entrypoint.s..." 24 hours ago Up 24 hours 0.0.0.0:27017->27017/tcp mock-mongo
由于前端独立部署的原因, 我们需要修改 nginx 的配置, 修改 nginx 的配置的方式有以下几种
在建立容器是使用 - v 指令将配置文件挂载到本地主机, 在本地修改后在容器重启 nginx
将配置文件复制到本地主机, 修改后替换容器的对应文件, 然后再容器内重启 nginx
...
我们当前操作环境是 17 版 15 寸 MacBook pro, 挂载需要特殊配置, 因此我采用了第二种方式
配置文件修改
容器内配置文件路径 /etc/nginx/conf.d/default.conf
拷贝配置文件至本地
$ docker cp mock-nginx:/etc/nginx/conf.d/default.conf ~/nginx/default.conf
在 nginx 配置文件增加以下配置
- server {
- location /mock-API/ {
- # node 为指令服务端容器别名
- proxy_pass http://node:7001/;
- }
- location /mock {
- autoindex on;
- alias /root/dist;
- }
- }
覆盖容器内配置并重启 nginx
- $ docker cp ~/nginx/default.conf mock-nginx:/etc/nginx/conf.d/default.conf
- # 进入容器
- $ docker exec -it mock-nginx /bin/bash
- # 重启 nginx, 看到以下提示则表示重启成功
- $ nginx -s reload
- 2018/11/03 17:23:14 [notice] 68#68: signal process started
接下来就到了我们的最后激动人心的最后一步
修改我们前端项目请求的网络域名并打包上传
- // API-mocker/client/config
- // module.exports> build> serverRoot
- module.exports = {
- build: {
- serverRoot: '127.0.0.1:90/mock-api'
- }
- }
将打包后的 dist 文件上传至 nginx 配置的 / root/dist 目录下
$ docker cp ~/Sites/API-mocker/client/dist mock-nginx:/root
> 当然 nginx 的容器构建也可以编写一个 dockfile 文件来实现, 这里我们就不详细说明了, 挂载配置文件和日志至本地主机有兴趣的可以自己尝试一下
测试
所有惊心动魄的配置我们都已经完成, 现在我们来测试一下
访问前端项目: http://127.0.0.1:90/mock 我们会看到, 以下界面说明我们前端项目部署成功
我们尝试注册一个账号, 看到成功提示, 那就说明我们整个项目部署成功了
至此我们的部署就已经大功告成了, 可以开心的 mock 接口写项目了, 撒花~~~
总结
第一次写文章, 第一次这样部署都是艰难的, 自己整理了一下思路, 也希望能给大家带来一些帮助
最后附上自己整理的 docker 常用命令以及该项目使用配置文件
segmentfault 链接 https://segmentfault.com/a/1190000016896628
觉得有用的可以 star 下咯
来源: https://juejin.im/post/5c17492ef265da614e2bfc47