求一个 Docker-Compose 方案

2019-03-19 16:44:17 +08:00
 daijinming

有这么一个设想,我在 docker 中有三个容器用来提供后台服务,假设命名 api1、api2 和 api3, 这个时候在设置一个反向代理 就叫它 backend。api1\api2\api3 都不绑定端口,前端访问 api 都需要通过 反向代理 backend ,比如反向代理的地址:202.99.97.12:5000, 那么 api1 的地址就是 202.99.97.12:5000/api1,其他两个类似。不知道有没有可以参考的 docker-compose.yml 方案或是类似的思路

2378 次点击
所在节点    程序员
18 条回复
freakxx
2019-03-19 16:52:53 +08:00
感觉 app 和 nginx 混在一起了。

你可以大概这么写:

先把 各自的 app 容器都写出来,然后将 sock 文件或者 端口号暴露给 nginx 容器。

然后再写个 nginx 容器,定义好路径,一一指向你要指向的 api 就可以。
dreamerfable
2019-03-19 16:55:04 +08:00
你貌似需要的是一个 Api Gateway
daijinming
2019-03-19 17:00:46 +08:00
@freakxx 还是你条理清晰,就是这个意思
daijinming
2019-03-19 17:02:11 +08:00
@dreamerfable 还不到这么复杂,就是将几个 api 统一下出口,这样对外就简单很多,以后我在增加 api 容器就更加方便,热插拔了
noahzh
2019-03-19 17:05:57 +08:00
直接设置在一个 docker network 就可以了.
zhoulouzi
2019-03-19 17:08:19 +08:00
这简直是最基本的使用。。。 有什么好问的呢
Kilerd
2019-03-19 17:30:26 +08:00
这跟 docker-compose 什么关系啊,无非就是 nginx 的基本使用而已啊。

location /api {
....upstream http://api1/
}

把这种配置写到 nginx 配置文件,然后启动 nginx api1 api2 api3 就好了啊。


location /${service_name} {
....upstream http://${service_name}/
}
可以用这种通匹配的方法。
daijinming
2019-03-19 17:36:32 +08:00
@Kilerd 其实我不太理解 docker 内部的寻址问题,比如 http://api1/,还是用 IP ,这个应用在 docker 内部都行??
HangoX
2019-03-19 17:41:18 +08:00
你只要把 nginx 和其他容器设置在同一个网络上就能直接通过容器名作为域名进行访问了,比如有个容器名为 jweb 可以直接通过 http://jweb 访问到这个地方。java 会自动被解析为对应的容器在网络里面的 ip。但是 nginx 上配置有个神奇的问题我没法解决,就是配置代理的时候如果你配置 proxy 为 http://jweb, 启动 nginx 的时候 jweb 还没启动,nginx 会直接挂掉,一定要先启动 jweb 再启动 nginx
HangoX
2019-03-19 17:42:24 +08:00
@Kilerd 你这个配置如果对应的容器没有启动,nginx 会挂吗?认真想问,对 nginx 配置不是很懂
CivAx
2019-03-19 17:43:33 +08:00
你这是问的 Nginx 配置文件写法,不是问的 Docker 用法

listen 5000
servername 202.99.97.12

location /api1 {
proxy_set_header X-Real-IP $remote_addr
proxy_pass http://api1
}

upstream api1 {
server ${API1 容器对应的地址}:${端口}
}
Kilerd
2019-03-19 17:44:39 +08:00
@daijinming #8 docker 内部有一个 DNS 服务,如果是一个 compose 的话,(实际上是一个 network, 启动 compose 会自动把所有服务放进一个新起的 network 里面),可以用 service 的名字来访问这个服务。



@HangoX #10 nginx 不会挂,访问不可达的服务时,会报 503 错误
zhoulouzi
2019-03-19 17:45:29 +08:00
version1 写 link
version2 直接用容器名,前提在一个 network 下面
Kilerd
2019-03-19 17:45:48 +08:00
@CivAx #11 好像你这个更加靠谱,我已经不记得 upstream 和 proxy_pass 该用哪个了。
w7938940
2019-03-19 17:53:49 +08:00
现在就用的 nginx consul registrator 搞的服务发现机制
rockyou12
2019-03-19 17:54:16 +08:00
容器内互访,在一个 docke-compose 里的默认就是一个 network 内,直接用{容器名}:{端口}相互访问就行了。

要通过一个 api gateway 对外暴露,除了 nginx 也可以考虑用 traefik。traefik 对 docker 的支持比较好,能通过 label 自动配置并发现容器 https://docs.traefik.io/configuration/backends/docker/#using-docker-compose
liuyibao
2019-03-19 17:56:18 +08:00
这不是最基本的使用么。。。
ai277014717
2019-03-19 18:17:11 +08:00
后端互相访问问题不大。前端时浏览器直接用 http://api/xx 时 dns 解析不了 api 的 ip。我是吧端口暴露到 localhost 然后通过 localhost 访问。发布的话就换成 ip 直连

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/546245

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX