求一个 Docker-Compose 方案 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
请不要在回答技术问题时复制粘贴 AI 生成的内容
daijinming

求一个 Docker-Compose 方案

  •  
  •   daijinming Mar 19, 2019 3177 views
    This topic created in 2599 days ago, the information mentioned may be changed or developed.

    有这么一个设想,我在 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 replies    2019-03-19 18:17:11 +08:00
    metamask
        1
    metamask  
       Mar 19, 2019
    感觉 app 和 nginx 混在一起了。

    你可以大概这么写:

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

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

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

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


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



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

    要通过一个 api gateway 对外暴露,除了 nginx 也可以考虑用 traefik。traefik 对 docker 的支持比较好,能通过 label 自动配置并发现容器 https://docs.traefik.io/configuration/backends/docker/#using-docker-compose
    liuyibao
        17
    liuyibao  
       Mar 19, 2019
    这不是最基本的使用么。。。
    ai277014717
        18
    ai277014717  
       Mar 19, 2019
    后端互相访问问题不大。前端时浏览器直接用 http://api/xx 时 dns 解析不了 api 的 ip。我是吧端口暴露到 localhost 然后通过 localhost 访问。发布的话就换成 ip 直连
    About     Help     Advertise     Blog     API     FAQ     Solana     2927 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 48ms UTC 10:51 PVG 18:51 LAX 03:51 JFK 06:51
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86