如何在 Docker 中使用带有 network_mode 的副本?

问题描述 投票:0回答:1

我正在使用 gluetuninvidious,这使我可以通过任何我想要的方式代理 YouTube 流量。然而,当处理公共实例上的高请求数时,提高 Invidious 可用性的官方方法是使用副本。 Invidious 的 docker-compose 文件如下所示。

  invidious:
    build:
      context: .
      dockerfile: docker/Dockerfile
    deploy:
      replicas: 8
    restart: unless-stopped
    network_mode: "service:gluetun"
    #ports:
    #  - "127.0.0.1:3000:3000"

问题是,当副本启动时,它们都尝试绑定到同一端口上的gluetun网络。

invidious-invidious-4     |   from /usr/share/crystal/src/socket/addrinfo.cr:74:17 in 'initialize:reuse_port'
invidious-invidious-4     |   from /usr/share/crystal/src/socket/tcp_server.cr:36:3 in 'new:reuse_port'
invidious-invidious-4     |   from /usr/share/crystal/src/http/server.cr:213:18 in 'bind_tcp'
invidious-invidious-4     |   from lib/kemal/src/kemal.cr:52:7 in 'run'
invidious-invidious-4     |   from lib/kemal/src/kemal.cr:16:5 in 'run'
invidious-invidious-4     |   from lib/kemal/src/kemal.cr:15:3 in 'run'
invidious-invidious-4     |   from src/invidious.cr:238:1 in '__crystal_main'
invidious-invidious-4     |   from /usr/share/crystal/src/crystal/main.cr:115:5 in 'main_user_code'
invidious-invidious-4     |   from /usr/share/crystal/src/crystal/main.cr:101:7 in 'main'
invidious-invidious-4     |   from /usr/share/crystal/src/crystal/main.cr:127:3 in 'main'
invidious-invidious-4     |   from src/env/__libc_start_main.c:95:2 in 'libc_start_main_stage2'

有没有办法解决这个问题,让他们在使用glutun网络时玩得很好?不使用gluetun时不会发生这种情况,所以我假设network_mode是问题所在。


端口范围也不适用于网络模式,即

  invidious:
    build:
      context: .
      dockerfile: docker/Dockerfile
    deploy:
      mode: replicated
      replicas: 8
    restart: unless-stopped
    network_mode: "service:pia"
    ports:
      - "3000-3008:3000"
Error response from daemon: conflicting options: port publishing and the container type network mode
docker
1个回答
0
投票

有什么办法可以解决这个问题,让他们在使用glutun的网络时玩得很好吗?

只有一个进程可以绑定到特定命名空间中的给定端口。

我不会尝试将所有 invidious 容器连接到gluetun 的网络,而是让它们都在自己的网络命名空间中运行,然后运行一个循环代理,该代理既连接到gluetun 的网络又连接到invidious 所在的网络。已部署副本。所以请求流程如下所示:

+--> invidious0 | +--> invidious1 | request +--> gluetun +--> proxy +-----> invidious2 | +--> invidious3 | +--> invidious4
代理容器将连接到两个网络——VPN 网络和 invidious 网络。包含的gluetun只会连接到vpn网络,并且invidious副本只会连接到invidious网络。

traefik 这样的容器优化代理是此类事情的不错选择,但您也可以使用更传统的代理,例如 nginx。

© www.soinside.com 2019 - 2024. All rights reserved.