【问题标题】:Is there a docker daemon equivalent to kubectl port-forward?是否有相当于 kubectl port-forward 的 docker 守护进程?
【发布时间】:2022-06-11 23:31:11
【问题描述】:

假设您有一个很长的 docker-compose 文件,其中包含许多在 docker 网络中相互通信的容器。我们称其为“堆栈”。您想启动此堆栈 3 次,每次的配置略有不同。为此,您可能会说:

docker-compose -p pizza up
docker-compose -p pie up
docker-compose -p soda up

但是,如果您有任何端口暴露给主机,这将失败:

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    networks:
      - my_app_net

它会失败,因为主机只能在端口 80 上暴露一件事。

另一种方法是在不同的文件中定义该端口声明并使用不同的端口:

$ cat pizza.yml
services:
  nginx:
    ports:
      - "8001:80"
$ cat pie.yml
services:
  nginx:
    ports:
      - "8002:80"
$ cat soda.yml
services:
  nginx:
    ports:
      - "8003:80"
docker-compose -f docker-compose.yml -f pizza.yml -p pizza up
docker-compose -f docker-compose.yml -f pie.yml -p pie up
docker-compose -f docker-compose.yml -f soda.yml -p soda up

这是可行的,因为每个堆栈都将端口 80 发布到不同的端口。这很好,但这有点烦人,因为我们必须停止/启动堆栈才能执行此操作。

我们如何在不发布端口或停止/启动堆栈的情况下做到这一点?

如果这是一个 kubernetes 集群,我们可以使用 kubectl 通过端口转发来执行此操作,如下所示:

kubectl port-forward replicaset/nginx-75f59d57f4 8001:80

这种方式更适合我的情况,因为我们不想停止堆栈以查看其中发生了什么。我们可以启动端口转发,看看发生了什么然后离开。

是否有 docker 的等价物?

相关问题:

【问题讨论】:

  • ...but that's a little bit annoying because we have to stop/start the stack to do this. - 如果您的堆栈已经在运行,为什么您需要停止,这意味着您已经正确安排了端口并启动了堆栈?

标签: docker nginx docker-compose kubectl


【解决方案1】:

您可以在同一网络上启动另一个容器,该容器正在运行类似 socat 的东西来转发端口:

docker run --rm -it -p 8001:80 --net pizza_default \
  nicolaka/netshoot \
  socat TCP6-LISTEN:80,fork TCP:nginx:80

docker-publish 是一个更自动化的示例,它处理启动一个单独的网络、附加容器,并在目标容器退出时通过共享相同的 pid 命名空间自动停止转发器。

【讨论】:

    猜你喜欢
    • 2021-06-02
    • 2018-11-08
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    相关资源
    最近更新 更多