首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  程序员

求一个 Docker-Compose 方案

  •  
  •   daijinming · 30 天前 · 1119 次点击

    有这么一个设想,我在 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 方案或是类似的思路

    18 回复  |  直到 2019-03-19 18:17:11 +08:00
        1
    freakxx   30 天前
    感觉 app 和 nginx 混在一起了。

    你可以大概这么写:

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

    然后再写个 nginx 容器,定义好路径,一一指向你要指向的 api 就可以。
        2
    dreamerfable   30 天前
    你貌似需要的是一个 Api Gateway
        3
    daijinming   30 天前
    @freakxx 还是你条理清晰,就是这个意思
        4
    daijinming   30 天前
    @dreamerfable 还不到这么复杂,就是将几个 api 统一下出口,这样对外就简单很多,以后我在增加 api 容器就更加方便,热插拔了
        5
    noahzh   30 天前
    直接设置在一个 docker network 就可以了.
        6
    zhoulouzi   30 天前
    这简直是最基本的使用。。。 有什么好问的呢
        7
    Kilerd   30 天前   ♥ 1
    这跟 docker-compose 什么关系啊,无非就是 nginx 的基本使用而已啊。

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

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


    location /${service_name} {
    ....upstream http://${service_name}/
    }
    可以用这种通匹配的方法。
        8
    daijinming   30 天前
    @Kilerd 其实我不太理解 docker 内部的寻址问题,比如 http://api1/,还是用 IP ,这个应用在 docker 内部都行??
        9
    HangoX   30 天前
    你只要把 nginx 和其他容器设置在同一个网络上就能直接通过容器名作为域名进行访问了,比如有个容器名为 jweb 可以直接通过 http://jweb 访问到这个地方。java 会自动被解析为对应的容器在网络里面的 ip。但是 nginx 上配置有个神奇的问题我没法解决,就是配置代理的时候如果你配置 proxy 为 http://jweb, 启动 nginx 的时候 jweb 还没启动,nginx 会直接挂掉,一定要先启动 jweb 再启动 nginx
        10
    HangoX   30 天前
    @Kilerd 你这个配置如果对应的容器没有启动,nginx 会挂吗?认真想问,对 nginx 配置不是很懂
        11
    CivAx   30 天前   ♥ 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   30 天前
    @daijinming #8 docker 内部有一个 DNS 服务,如果是一个 compose 的话,(实际上是一个 network, 启动 compose 会自动把所有服务放进一个新起的 network 里面),可以用 service 的名字来访问这个服务。



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

    要通过一个 api gateway 对外暴露,除了 nginx 也可以考虑用 traefik。traefik 对 docker 的支持比较好,能通过 label 自动配置并发现容器 https://docs.traefik.io/configuration/backends/docker/#using-docker-compose
        17
    liuyibao   30 天前
    这不是最基本的使用么。。。
        18
    ai277014717   30 天前
    后端互相访问问题不大。前端时浏览器直接用 http://api/xx 时 dns 解析不了 api 的 ip。我是吧端口暴露到 localhost 然后通过 localhost 访问。发布的话就换成 ip 直连
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   837 人在线   最高记录 4385   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 17ms · UTC 20:34 · PVG 04:34 · LAX 13:34 · JFK 16:34
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1