1

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

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

这是我想要实现的目标的视觉表示。

问题图

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

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

4

1 回答 1

3

怎么样:

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 或 -peg 覆盖每个实例的项目名称来拥有多个实例:

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

希望有帮助。

于 2019-01-16T17:46:34.547 回答