- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Docker容器化部署尝试——多容器通信(node+mongoDB+nginx)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
原因是这样的 。
想要部署一个mocker平台,就在朋友的推荐下选择了 api-mocker 这个现成的项目 。
该项目分为服务端node、客户端vue、以及数据库mongodb 。
在尝试直接部署的时候发现需要装一大堆的环境,node、mongo、nginx啊,特别的麻烦,之前简单的使用过docker,就在想能不能用docker免环境直接部署呢?于是就有了这次的尝试 。
多容器通信 。
该项目分为3个部分,于是就要建立3个容器(node、mongo、nginx) 。
那容器之间怎么实现通信呢?
1
2
|
# 通过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镜像 。
1
|
$ docker pull mongo:latest
|
下面我们让这个镜像跑起来 。
1
2
3
|
$ docker images
repository tag image
id
created size
mongo latest 05b3651ee24e 2 weeks ago 382mb
|
--auth 指令开启了mongo的连接身份校验 开启校验 是由于 node 跨容器连接时 不设置身份校验 开启服务端无法连接上mongo数据库 。
``` nodejs.mongoerror: [egg-mongoose]authentication failed. ``` 。
查看容器 。
1
2
3
|
$ 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连接时使用的账号 。
1
2
3
4
5
6
|
$ 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容器别名,端口号以及登录账号密码 。
我们先修改node服务端的配置 。
文件配置 dockerfile/api-mocker/server/config/config.default.js 修改mongo连接配置,db为预先设定的mock-mongo容器的别名 。
1
2
3
|
mongoose: {
url:
'mongodb://admin:admin@db:27017/api-mock?authsource=admin'
},
|
现在我们编写一个dockerfile文件来构建镜像 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
# 指定基础镜像
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文件构建镜像 。
1
|
$ docker build -t=
"mock-server:1.0.0"
.
|
让我们查看一下镜像 。
1
2
3
4
|
$ 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镜像运行起来,并建立服务器与数据库的连接 。
。
。
让我们再看看现在正在运行的容器 。
1
2
3
4
|
$ 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容器的连接状态 。
1
2
|
$ docker
exec
-it mock-server
/bin/bash
$ curl db
|
现在我们的服务端和数据库已经建立起了连接,接下来我们要开始部署我们的客户端 。
构建nginx容器并与node容器建立连接 。
在建立nginx前,我们要先约定好,node容器别名,nginx转发的端口号以及客户端访问nginx域名及端口号 。
我们先拉取nginx镜像并建立容器 。
1
2
3
4
5
6
7
8
9
|
$ 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
|
现在我们在看看已经运行中的容器 。
1
2
3
4
5
|
$ 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的配置的方式有以下几种 。
我们当前操作环境是17版 15寸macbook pro,挂载需要特殊配置,因此我采用了第二种方式 。
配置文件修改 。
1
|
$ docker
cp
mock-nginx:
/etc/nginx/conf
.d
/default
.conf ~
/nginx/default
.conf
|
在nginx配置文件增加以下配置 。
1
2
3
4
5
6
7
8
9
10
11
|
server {
location
/mock-api/
{
# node 为指令服务端容器别名
proxy_pass http:
//node
:7001/;
}
location
/mock
{
autoindex on;
alias
/root/dist
;
}
}
|
覆盖容器内配置并重启nginx 。
1
2
3
4
5
6
|
$ 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
|
接下来就到了我们的最后激动人心的最后一步 。
修改我们前端项目请求的网络域名并打包上传 。
1
2
3
4
5
6
7
8
|
//
api-mocker
/client/config
//
module.exports > build > serverroot
module.exports = {
build: {
serverroot:
'127.0.0.1:90/mock-api'
}
}
|
将打包后的dist文件上传至nginx配置的/root/dist目录下 。
1
|
$ docker
cp
~
/sites/api-mocker/client/dist
mock-nginx:
/root
|
> 当然nginx的容器构建也可以编写一个dockfile文件来实现,这里我们就不详细说明了,挂载配置文件和日志至本地主机有兴趣的可以自己尝试一下复制代码 。
测试 。
所有惊心动魄的配置我们都已经完成,现在我们来测试一下 。
访问前端项目: http://127.0.0.1:90/mock 我们会看到,以下界面说明我们前端项目部署成功 。
我们尝试注册一个账号,看到成功提示,那就说明我们整个项目部署成功了 。
至此我们的部署就已经大功告成了,可以开心的mock接口写项目了,撒花~~~ 。
总结 。
第一次写文章、第一次这样部署都是艰难的,自己整理了一下思路,也希望能给大家带来一些帮助 。
最后附上自己整理的docker常用命令 以及该项目使用配置文件 。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://juejin.im/post/5c17492ef265da614e2bfc47 。
最后此篇关于Docker容器化部署尝试——多容器通信(node+mongoDB+nginx)的文章就讲到这里了,如果你想了解更多关于Docker容器化部署尝试——多容器通信(node+mongoDB+nginx)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
说真的,你怎么能在不发疯的情况下处理所有这些异常呢?我是不是读了太多关于异常处理的文章或什么?我尝试重构了几次,但每次似乎都以更糟糕的结果告终。也许我应该承认确实会发生异常(exception)情况,
背景 两者 try/rescue和 try/catch是 Elixir 中的错误处理技术。根据 corresponding chapter在介绍指南中。 Errors can be rescued u
每当我尝试在 Raspberry PI 上运行此 python 脚本时,我都会遇到问题: import socket import sys # Create a TCP/IP socket sock
我想知道一些关于 PHP 的 try , catch声明。 让我们考虑以下示例。 abstract class ExceptionA extends Exception {} class Except
我的 laravel v5.4 项目中有两个模型,user 和 admin。 在 config/auth.php 中,我向守卫和提供者添加了管理员,如下所示: 'guards' => [ 'w
try: r = requests.get(url, params={'s': thing}) except requests.ConnectionError, e: print e
我有以下代码。 但是,它并不能捕获所有错误,而我仍然会收到“throw er;//未处理的'错误'事件”。 为什么是这样? app.post('/api/properties/zip/:zip/bed
问题与细节 我正在使用自定义错误处理,遇到的错误之一是“路径中的非法字符”。我有一个自定义函数,旨在通过路径字符串查找此类非法字符,并在找到它们时引发自定义错误。但是我发现,取决于非法字符,Test-
This question already has answers here: How do I catch a numpy warning like it's an exception (not j
我正在使用其他人的代码,但我不熟悉try/catch,因此我举了一个类似的小例子。在第11行上,如果我写了error(''),似乎没有发现错误并增加了索引j。但是,编写error(' ')或error
我在我的一个程序中遇到了这个问题,在这种情况下,尝试/异常(exception)的错误使程序变得更好,以防用户意外输入了他们不应该输入的内容。它仍然给我错误,我为为什么感到困惑。如果对我的问题确实很重
我在尝试TRY ... CATCH块时遇到问题。有人可以解释为什么以下代码无法执行我的sp吗? DECLARE @Result int SET @Result = 0 BEGIN TRY SE
我有一个相当大的 powershell 脚本,其中包含许多(20 多个)执行各种操作的函数。 现在所有代码实际上都没有任何错误处理或重试功能。如果某个特定的任务/功能失败,它就会失败并继续。 我想改进
为什么我尝试时需要导入 inputmismatchException catch(InputMismatchException e){ System.out.println("
我对此感到困惑 - 我为辅助方法编写了一个 try/catch 。它的目的是捕获任何无效输入(任何不是“男性”或“女性”的内容(没有特定情况)。如果输入无效,它将通知用户,然后让他们重试。如果有效,则
我有时会发现自己处于如下场景。尽可能简单地陈述问题 “有时我会创建一段代码,Java 让我将其包含在 try/catch 语句中。我没有使用 catch,所以我将其留空。为什么这是错误的?” boo
我有点困惑为什么当我不使用 Try block 时会出现 Try block 错误。 我在代码块底部附近收到错误通知。如果我不使用 try/catch,有人可以向我解释为什么会发生这种情况吗? 它是否
我已经盯着我的电脑两个小时了,我不知道我做错了什么。谁能帮助我看到光明? package blackjack; import java.util.Random; import java.util.Sc
我想将方法保存在 Enum 中,但 Class.getDeclaredMethod 抛出 NoSuchMethodException,那么我该如何处理呢?我的代码: public enum Car
这个问题已经有答案了: Executing multi-line statements in the one-line command-line (18 个回答) 已关闭 3 年前。 如何使用try.
我是一名优秀的程序员,十分优秀!