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

求个多个 docker 组暴露端口的优雅解答

  •  
  •   shenqi ·
    shenqihui · 2022-08-29 17:41:04 +08:00 · 1713 次点击
    这是一个创建于 812 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在情况:
    开发期间,使用 docker-compose 管理 docker 容器,目前存在多个 docker-compose 组,都暴露 80 端口,都是使用 ports 方式来绑定到宿主机。


    现在做法是:
    将每个 docker-compose 暴露的 80 都改成一个唯一值,使得宿主机不冲突。在宿主机有一个 nginx ,然后每个进行域名的转发。
    然后开发和测试都通过绑定 host 方式,使用域名进行功能的开发和测试。

    现在的限制:
    现在同时开发、测试的功能,已经超过了 3 个测试宿主机的数量了。然后现在假如第四个功能同时开发,那就不够环境了。


    想要:
    不增加宿主机和不修改域名,增加测试环境。满足第四第五第六第七的功能的同时测试开发。
    相互开发中的分支不相互污染。
    (数据库好办,只要复制一个库配置过去就行的)

    现在的想法:
    想法一:将 docker-compose 使用 macvlan 形式直接设定容器的网络和宿主机的网段同一个,但是第二组 docker-compose 容器就使用不了这个 c 段了。(此路径感觉走不通了,或者哪里细节需要注意的大佬们指导下)
    想法二:宿主机启动 vagrant ,自动使用 c 端,然后每个里面再跑 docker (目前在这个没试过)
    想法三:请求大佬们指导下。
    第 1 条附言  ·  2022-08-29 18:29:09 +08:00

    补充: 目前三台物理机测试环境,192.168.2.10,192.168.2.11,192.168.2.12 (所以现在受限于三个测试环境)
    假如目前两个项目分别域名是 www.proja.com www.projb.com (跟生产一样的域名) 然后两个项目的 docker 组暴露 81,82

    现在是宿主机的 nginx 类似

    
    server {
      listen 80
      server_name www.proja.com
      location / {
        proxy_pass http://127.0.0.1:81
      }
    }
    
    server {
      listen 80
      server_name www.projb.com
      location / {
        proxy_pass http://127.0.0.1:82
      }
    }
    

    测试的时候就绑定host

    192.168.2.10 www.proja.com
    192.168.2.10 www.projb.com
    

    来进行功能测试。
    (为了不增加测试人员跟开发人员的反复扯皮、问这问那,尽量测试人员那边少配置,配置host对于他们来说都感觉复杂度高一样。。。。。。。特别是产品验收的时候,产品压根不跟你配置host就想验收)

    现在就是想能多几个环境能直接绑定host就能测试。

    第 2 条附言  ·  2022-08-30 16:50:18 +08:00

    经过研究,macvlan 和 ipvlan 都行,让宿主机直接充当交换机,
    然后原帖子里面的想法一里面的用不了这个 c 段,后面经过一系列的搜索,可以提前创建好 network,然后采用 external:true 就可以直接使用同一个 c 段网络。
    如图: (如果图片打不开,可访问 gist 查看下。 图床用了微博,没referer可能会ban)

    pic

    16 条回复    2022-09-08 10:47:55 +08:00
    libook
        1
    libook  
       2022-08-29 17:47:32 +08:00   ❤️ 1
    你有多个服务,基本就只能用反向代理还根据 HTTP 请求特征来分流,比如域名、路径等。

    你多个服务一定都必须用 80 端口吗?每个服务都单独用一个唯一端口就好了吧,比如从 9000 开始往后排,前端调用后端的地址做成统一配置文件可配的,每次部署的时候根据所用的测试服务的地址和端口号配置一下就好了。
    herozzm
        2
    herozzm  
       2022-08-29 17:49:09 +08:00   ❤️ 1
    docker 不接管宿主机的端口管理权限,用 iptables 将 80 端口转发给 nginx ,然后 nginx 来设置域名转发即可
    XiLingHost
        3
    XiLingHost  
       2022-08-29 17:54:56 +08:00   ❤️ 1
    试试 traefik ,用 docker provider 来提供配置,这样就不需要把容器的端口暴露出来了,只需要在 label 里配置好服务和路由就行了

    https://doc.traefik.io/traefik/providers/docker/
    momocraft
        4
    momocraft  
       2022-08-29 17:56:42 +08:00   ❤️ 1
    没看出为什么只能有 3 个环境 这限制哪来的
    shenqi
        5
    shenqi  
    OP
       2022-08-29 18:01:52 +08:00
    @momocraft 物理宿主机三台,每台一个 ip
    lovelylain
        6
    lovelylain  
       2022-08-29 18:15:17 +08:00 via Android   ❤️ 1
    whistle 正向代理改请求咯
    bwangel
        7
    bwangel  
       2022-08-29 18:37:59 +08:00   ❤️ 1
    你开发是在宿主机上进行的吗?如果是的话可以试试这样的方法,一台宿主机就够了

    修改 /etc/hosts ,绑定 N 个开发用的域名到 127.0.0.1

    这样 nginx 就能配置无限多个域名,根据 host route 到不同的 docker 端口上了。
    momocraft
        8
    momocraft  
       2022-08-29 18:51:27 +08:00   ❤️ 2
    一个 ip 可以 host 无数个域名

    把私有 ip 绑到域名上 就不用让客户端机器改 hosts 了
    butanediol2d
        9
    butanediol2d  
       2022-08-29 19:06:54 +08:00 via iPhone   ❤️ 2
    推荐一个 nip.io
    它可以把 *.a.b.c.d.nip.io 解析为 a.b.c.d
    LindsayZhou
        10
    LindsayZhou  
       2022-08-29 23:04:07 +08:00   ❤️ 1
    我记得 docker 端口映射可以指定绑定的 ip 吧,物理网卡上多加几个 ip 就行了,直接加还是用桥接应该都可以。
    不过加多个同网段的 ip 说不定会有坑,路由问题上的,这个不太确定。
    imycc
        11
    imycc  
       2022-08-29 23:32:29 +08:00   ❤️ 1
    emm ,端口不暴露到宿主机,只暴露到容器内部的网络上,就不用考虑冲突的问题。查出来几个 web 入口的容器 ip 地址,配置在 nginx 上。这样麻烦的地方在于重启机器跟环境之后 ip 可能会变,得重新配一下,要不入口会乱掉。
    shenqi
        12
    shenqi  
    OP
       2022-08-30 10:05:06 +08:00
    @LindsayZhou 这个方案算是目前最接近我的想法的,还在尝试中。但是我猜想的做法不是物理上加多网卡,而是想办法将单个物理网卡设置多个虚拟成实际可访问 ip 的网卡。
    mk0114
        13
    mk0114  
       2022-09-07 23:19:33 +08:00
    @butanediol2d 可惜没有办法在内网搞到证书不然就完美了
    butanediol2d
        14
    butanediol2d  
       2022-09-08 00:44:12 +08:00 via iPhone
    @mk0114 用自签证书呗
    mk0114
        15
    mk0114  
       2022-09-08 08:38:44 +08:00
    @butanediol2d 可是你还得让测试和产品再安装证书,让他们改个 hosts 文件都难。
    mk0114
        16
    mk0114  
       2022-09-08 10:47:55 +08:00
    去阿里几块钱弄个域名,然后泛域名解析到你局域网内的 ip ,通过泛域名前缀来反向代理 docker 内的服务就行了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5880 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 01:37 · PVG 09:37 · LAX 17:37 · JFK 20:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.