【问题标题】:Instantiate multiple docker-compose pipelines with unique IP addresses实例化多个具有唯一 IP 地址的 docker-compose 管道
【发布时间】:2019-01-16 15:54:02
【问题描述】:

我正在尝试复制 docker-compose 管道。该管道编排了一堆容器,最后将其中一个容器上的port 80 映射到主机上的port 8000 以进行外部通信。

如何创建同一个 docker-compose 管道的多个实例,以便每个实例都有自己的 IP 地址,我可以在其他机器上使用该地址通过 port 8000 访问管道的相应实例?

这是我想要实现的目标的直观表示。

请注意,两个实例都使用相同 docker-compose.yml 并公开相同的端口。然而,区别在于它们被分配了唯一的 IP 地址。我可以指示 docker-compose 管道仅在特定网络上启动吗?或者总是在部署之前创建一个新网络,这样每个实例都会获得一个新的 IP 地址,并且不会发生抽象端口冲突。

另外,这是一个好方法吗?如果不是,那么以动态方式访问同一 docker-compose 管道的多个实例的最佳策略是什么,这样我就不必手动修改每个 docker-compose.yml 文件来映射未使用的端口?

【问题讨论】:

    标签: docker docker-compose docker-networking docker-network


    【解决方案1】:

    怎么样:

    cat <<EOF
    version: "3"
      services:
        web1:
          image: python:2.7-alpine
          command: ["python", "-m", "SimpleHTTPServer", "8080"]
        web2:
          image: python:2.7-alpine
          command: ["python", "-m", "SimpleHTTPServer", "8080"]
    EOF
    

    然后通过例如获取虚拟地址:

    docker ps | grep compose_ | cut -f1 -d' ' | while read s; do docker inspect $s | egrep "IPAddr.*[0-9]"; done
                    "IPAddress": "172.28.0.3",
                    "IPAddress": "172.28.0.2",
    

    然后确认两个地址在同一个端口上响应:

    $ curl -sv 172.28.0.2:8080
    ...
    * Connected to 172.28.0.3 (172.28.0.3) port 8080 (#0)
    ...
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
    ...
    
    $ curl -s 172.28.0.3:8080
    ...
    

    您可以使用自定义网络以特定方式隔离容器,但即使使用默认行为,您也可以创建此组合堆栈的多个实例,并且您将始终获得可以从客户端选择性访问的唯一虚拟地址。如果您想将外部客户端流量路由到特定后端,您可以在前面放置一个反向代理。

    您可以通过使用 $COMPOSE_PROJECT_NAME 或 -p 覆盖每个实例的项目名称来拥有多个实例。例如:

    docker-compose -p mytest1 up -d
    docker-compose -p mytest2 up -d
    

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-01
      • 2021-10-23
      • 1970-01-01
      相关资源
      最近更新 更多