当前位置: 首页 > 后端技术 > Node.js

记录一次docker多容器通信滥用的生死部署路径(node+mongoDB+nginx)

时间:2023-04-03 20:39:22 Node.js

原因是想部署一个mocker平台,所以选择了朋友推荐的现成项目api-mocker。项目分为服务端node,客户端vue,数据库mongoDB。尝试直接部署的时候,发现需要安装的环境有很多,比如node、mongo、nginx,特别麻烦。之前简单的使用过docker,但是不知道是否可以不用环境直接使用docker部署呢?于是就有了这种多容器通信的尝试。项目分为3个部分,所以需要建立3个容器(node、mongo、nginx)。如何实现容器之间的通信?#通过链接命令建立连接$dockerrun--name-d-p:--link:--linkcontainerconnectioncommand::注意:别名在主动建立连接的容器中访问连接的容器。使用以下命令查看容器中的连接状态$curl接下来我们尝试部署实现过程1.搭建一个mongo容器2.搭建一个node容器并与mongo容器建立连接3.搭建一个nginx容器并与节点容器建立连接。要构建一个mongo容器,我们首先拉取mongo镜像$dockerpullmongo:latest$dockerimagesREPOSITORYTAGIMAGEIDCREATEDSIZEmongolatest05b3651ee24e2weeksago382MB让我们运行这个镜像$dockerrun--namemock-mongo-d-p27017:27017mongo:latest--auth#与本地建立文件共享,使用-v命令查看#-v/data/db:/data/db--auth命令启用mongo连接身份验证。启用验证是因为节点在跨容器连接时没有设置身份验证。服务器无法连接到mongo数据库nodejs.MongoError:[egg-mongoose]Authenticationfailed。查看容器$dockerps-aCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES0d440be90935mongo"docker-entrypoint.s..."14小时前Up14小时0.0.0.0:27017->27017/tcpmock-mongodue我们的mongo有开启认证,所以我们需要进入mongo容器配置节点连接使用的账号$dockerexec-itmock-mongo/bin/bash$mongoadmin#创建管理用户$db.createUser({user:"admin",pwd:"admin",roles:[{role:"admin",db:"admin"}]})#账号授权$db.auth('admin','admin')现在我们的mongo数据库运行起来了,然后我们将构建节点容器。构建节点容器并与mongo容器建立连接。在开始构建节点容器之前,我们首先要约定好mongo容器别名、端口号、登录账号密码。mongo容器别名:dbmongo端口号: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来构建镜像#指定基础镜像FROMnode:latest#MaintainerMAINTAINERqiushiyuan1994@qq.com#工作目录WORKDIR/www#将本地文件不解压复制到容器中COPYapi-mockernode-server/api-mockerEXPOSE7001WORKDIR/www/node-server/api-mocker/serverRUNnpminstallWORKDIR/www/node-server/api-mocker#容器构建完成后调用,容器启动时调用CMD["make","prod_server"]我们使用准备好的dockerfile构建镜像$dockerbuild-t="mock-server:1.0.0”。看一下镜像$dockerimagesREPOSITORYTAGIMAGEIDCREATEDSIZEmock-server1.0.0957ad2aa1f978分钟前674MBmongolatest05b3651ee24e2周前382MB现在到了关键的一步,我们将mock-server镜像运行并建立服务器和数据库之间的连接$dockerrun-d-i-t-p7001:7001--namemock-server1--linkmock-mongo:dbmock-server:1.0.0/bin/bash让我们再做一个查看正在运行的容器$dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMESee780b903c64mock-server:1.0.0"/bin/bash"大约一分钟前上升11秒0.0.0.0:7001->7001/tcpmock-server0d440be90935mongo"docker-entrypoint.s..."16小时前Up16小时0.0.0.0:27017->27017/tcpmock-mongo检测node容器与mongo容器的连接状态$dockerexec-itmock-server/bin/bash$curldb现在我们的服务客户端和数据库的连接已经建立。接下来,我们将部署我们的客户端来构建nginx容器并与节点容器建立连接。在建立nginx之前,首先要约定好节点容器别名,nginx转发的端口号,客户端访问nginx域名和端口号节点服务器别名:nodenode容器映射端口号:7001nginx域名:127.0.0.1nginx端口号:90我们先拉取nginx镜像,创建容器$dockerpullnginx:latest$dockerrun-p90:80--linkmock-node:nodenginx:latest--namemock-nginx#查看容器连接status$dockerexec-itmock-nginx/bin/bash$env#如果看到如下数据,则连接成功NODE_PORT_7001_TCP=tcp://172.17.0.3:7001NODE_PORT_7001_TCP_PORT=7001NODE_ENV_YARN_VERSION=1.9。4现在我们正在查看正在运行的容器$dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES09644025d148nginx"nginx-g'daemonof..."5hoursagoUp5hours0.0.0.0:90->80/tcpmock-nginxee780b903c64mock-server:1.0.0"/bin/bash"大约一分钟前Up11秒0.0.0.0:7001->7001/tcpmock-server0d440be90935mongo"docker-entrypoint.s..."24小时前Up24小时0.0.0.0:27017->27017/tcpmock-mongo由于前端独立部署,需要修改nginx的配置。有几种方法可以修改nginx的配置。创建容器时,使用-v命令将配置文件挂载到本地主机,本地修改后重启容器中的nginx,将配置文件复制到本地主机,修改后替换容器中对应的文件,然后重启容器中的nginx...我们目前的运行环境是17版本的15寸macbookpro,挂载需要特殊配置,所以我使用第二种方式配置文件修改容器中的配置文件路径/etc/nginx/conf.d/default.conf复制配置文件到本地$dockercpmock-nginx:/etc/nginx/conf.d/default.conf~/nginx/default.conf在nginx配置中添加如下配置文件服务器{位置n/mock-api/{#node是命令服务器容器别名proxy_passhttp://node:7001/;}location/mock{autoindexon;别名/root/dist;}}覆盖容器中的配置并重启nginx$dockercp~/nginx/default.confmock-nginx:/etc/nginx/conf.d/default.conf#进入容器$dockerexec-itmock-nginx/bin/bash#重启nginx,如果看到如下提示,表示重启成功$nginx-sreload2018/11/0317:23:14[notice]68#68:signalprocessstarted接下来就是我们最后激动人心的修改步骤我们前端项目请求的网络域名并打包上传//api-mocker/client/config//module.exports>build>serverRootmodule.exports={build:{serverRoot:'127.0.0.1:90/mock-api'}}上传打包好的dist文件到nginx配置的/根/dist目录下$dockercp~/Sites/api-mocker/client/distmock-nginx:/root当然是nginx的容器构建也可以通过写一个dockfile文件来实现。这里就不细说了,挂载配置文件和日志到本地主机,有兴趣的可以自己试试。我们已经完成了所有激动人心的配置。下面我们来测试一下前端项目的访问:http://127.0.0.1:90/mock会看到如下界面,就说明我们的前端项目部署成功了。我们尝试注册一个账号,看到成功的提示,就说明我们整个项目部署成功了。至此,我们的部署已经完成,可以愉快的mock界面编写项目了。洒~~~总结第一次写文章,第一次这样部署,比较难。整理了一下自己的思路,希望能给大家带来一些帮助。最后附上我整理的docker常用命令和项目使用的配置。如果觉得配置文件有用,可以star一下。现在还不算太早。晚安~