有这么一个设想,我在 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 方案或是类似的思路
1
freakxx 2019-03-19 16:52:53 +08:00
感觉 app 和 nginx 混在一起了。
你可以大概这么写: 先把 各自的 app 容器都写出来,然后将 sock 文件或者 端口号暴露给 nginx 容器。 然后再写个 nginx 容器,定义好路径,一一指向你要指向的 api 就可以。 |
2
dreamerfable 2019-03-19 16:55:04 +08:00
你貌似需要的是一个 Api Gateway
|
3
daijinming OP @freakxx 还是你条理清晰,就是这个意思
|
4
daijinming OP @dreamerfable 还不到这么复杂,就是将几个 api 统一下出口,这样对外就简单很多,以后我在增加 api 容器就更加方便,热插拔了
|
5
noahzh 2019-03-19 17:05:57 +08:00
直接设置在一个 docker network 就可以了.
|
6
zhoulouzi 2019-03-19 17:08:19 +08:00
这简直是最基本的使用。。。 有什么好问的呢
|
7
Kilerd 2019-03-19 17:30:26 +08:00 1
这跟 docker-compose 什么关系啊,无非就是 nginx 的基本使用而已啊。
location /api { ....upstream http://api1/ } 把这种配置写到 nginx 配置文件,然后启动 nginx api1 api2 api3 就好了啊。 location /${service_name} { ....upstream http://${service_name}/ } 可以用这种通匹配的方法。 |
8
daijinming OP @Kilerd 其实我不太理解 docker 内部的寻址问题,比如 http://api1/,还是用 IP ,这个应用在 docker 内部都行??
|
9
HangoX 2019-03-19 17:41:18 +08:00
你只要把 nginx 和其他容器设置在同一个网络上就能直接通过容器名作为域名进行访问了,比如有个容器名为 jweb 可以直接通过 http://jweb 访问到这个地方。java 会自动被解析为对应的容器在网络里面的 ip。但是 nginx 上配置有个神奇的问题我没法解决,就是配置代理的时候如果你配置 proxy 为 http://jweb, 启动 nginx 的时候 jweb 还没启动,nginx 会直接挂掉,一定要先启动 jweb 再启动 nginx
|
11
CivAx 2019-03-19 17:43:33 +08:00 1
你这是问的 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 容器对应的地址}:${端口} } |
12
Kilerd 2019-03-19 17:44:39 +08:00
@daijinming #8 docker 内部有一个 DNS 服务,如果是一个 compose 的话,(实际上是一个 network, 启动 compose 会自动把所有服务放进一个新起的 network 里面),可以用 service 的名字来访问这个服务。
@HangoX #10 nginx 不会挂,访问不可达的服务时,会报 503 错误 |
13
zhoulouzi 2019-03-19 17:45:29 +08:00 1
version1 写 link
version2 直接用容器名,前提在一个 network 下面 |
15
w7938940 2019-03-19 17:53:49 +08:00
现在就用的 nginx consul registrator 搞的服务发现机制
|
16
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 |
17
liuyibao 2019-03-19 17:56:18 +08:00
这不是最基本的使用么。。。
|
18
ai277014717 2019-03-19 18:17:11 +08:00
后端互相访问问题不大。前端时浏览器直接用 http://api/xx 时 dns 解析不了 api 的 ip。我是吧端口暴露到 localhost 然后通过 localhost 访问。发布的话就换成 ip 直连
|