V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
daijinming
V2EX  ›  程序员

求一个 Docker-Compose 方案

  •  
  •   daijinming · 2019-03-19 16:44:17 +08:00 · 2563 次点击
    这是一个创建于 2101 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有这么一个设想,我在 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
    freakxx
        1
    freakxx  
       2019-03-19 16:52:53 +08:00
    感觉 app 和 nginx 混在一起了。

    你可以大概这么写:

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

    然后再写个 nginx 容器,定义好路径,一一指向你要指向的 api 就可以。
    dreamerfable
        2
    dreamerfable  
       2019-03-19 16:55:04 +08:00
    你貌似需要的是一个 Api Gateway
    daijinming
        3
    daijinming  
    OP
       2019-03-19 17:00:46 +08:00
    @freakxx 还是你条理清晰,就是这个意思
    daijinming
        4
    daijinming  
    OP
       2019-03-19 17:02:11 +08:00
    @dreamerfable 还不到这么复杂,就是将几个 api 统一下出口,这样对外就简单很多,以后我在增加 api 容器就更加方便,热插拔了
    noahzh
        5
    noahzh  
       2019-03-19 17:05:57 +08:00
    直接设置在一个 docker network 就可以了.
    zhoulouzi
        6
    zhoulouzi  
       2019-03-19 17:08:19 +08:00
    这简直是最基本的使用。。。 有什么好问的呢
    Kilerd
        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}/
    }
    可以用这种通匹配的方法。
    daijinming
        8
    daijinming  
    OP
       2019-03-19 17:36:32 +08:00
    @Kilerd 其实我不太理解 docker 内部的寻址问题,比如 http://api1/,还是用 IP ,这个应用在 docker 内部都行??
    HangoX
        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
    HangoX
        10
    HangoX  
       2019-03-19 17:42:24 +08:00
    @Kilerd 你这个配置如果对应的容器没有启动,nginx 会挂吗?认真想问,对 nginx 配置不是很懂
    CivAx
        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 容器对应的地址}:${端口}
    }
    Kilerd
        12
    Kilerd  
       2019-03-19 17:44:39 +08:00
    @daijinming #8 docker 内部有一个 DNS 服务,如果是一个 compose 的话,(实际上是一个 network, 启动 compose 会自动把所有服务放进一个新起的 network 里面),可以用 service 的名字来访问这个服务。



    @HangoX #10 nginx 不会挂,访问不可达的服务时,会报 503 错误
    zhoulouzi
        13
    zhoulouzi  
       2019-03-19 17:45:29 +08:00   ❤️ 1
    version1 写 link
    version2 直接用容器名,前提在一个 network 下面
    Kilerd
        14
    Kilerd  
       2019-03-19 17:45:48 +08:00
    @CivAx #11 好像你这个更加靠谱,我已经不记得 upstream 和 proxy_pass 该用哪个了。
    w7938940
        15
    w7938940  
       2019-03-19 17:53:49 +08:00
    现在就用的 nginx consul registrator 搞的服务发现机制
    rockyou12
        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
    liuyibao
        17
    liuyibao  
       2019-03-19 17:56:18 +08:00
    这不是最基本的使用么。。。
    ai277014717
        18
    ai277014717  
       2019-03-19 18:17:11 +08:00
    后端互相访问问题不大。前端时浏览器直接用 http://api/xx 时 dns 解析不了 api 的 ip。我是吧端口暴露到 localhost 然后通过 localhost 访问。发布的话就换成 ip 直连
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3748 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 05:07 · PVG 13:07 · LAX 21:07 · JFK 00:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.