【问题标题】:Docker Change Port BindingDocker 更改端口绑定
【发布时间】:2014-08-31 21:36:03
【问题描述】:

我正在使用exposed 端口80 运行一个容器(我们称之为old_container),并使用-p 标志将该端口绑定到端口80 上的主机接口。

sudo docker run -p 80:80 -i -t

在我的生产环境中,我现在想从old_container 切换到new_container。所以我想关闭old_container 并启动new_container

首先我必须在new_container 中进行一些手动更改。所以我在没有 -p 标志的情况下运行它,因为在我完成这些更改之前我无法将它绑定到端口 80。

sudo docker run -i -t < new-image-id >
#now I m doing my manual changes

完成更改后,我会退出 new_container。我现在的计划是停止old_container 并将new_container 绑定到端口80。但是[start][1] 命令不提供端口绑定的可能性。

所以来回答我的问题:我希望为已停止的容器设置端口绑定,最好不要创建new_container 的提交映像并将此映像作为另一个新容器运行的解决方法。

【问题讨论】:

  • 你可能想看看this question
  • 不喜欢这个答案 :) 保留问题。将来可能会有办法做到这一点

标签: port docker


【解决方案1】:
  1. 对新容器进行更改,然后停止旧容器和新容器。
docker stop old_container new_container
  1. 通过 commit 命令从容器的更改中创建新映像,如下所示:
docker commit new_container new_container_01
  1. 运行新提交的图像:
docker run -p 80:80 -i -t new_container_01
  1. 使用 rm (remove) 命令清理旧的、未使用的容器:
docker rm old_container new_container

【讨论】:

    【解决方案2】:

    运行 new_container 映像并进行所需更改后,使用 docker commit 将新容器保存为新映像。然后使用 -p 标志运行这个新镜像来映射端口。

    【讨论】:

      【解决方案3】:

      我确实为change PORT of Running Containermyboot2docker 创建了一个工具。

      例如:两(2)个容器:

      • docker run -p 11521:1521 --name=xe1 container1
      • docker run -p 21521:1521 --name=xe3 container3

      我使用此命令为 container1 创建另一个端口映射

      p-map xe1 15210:1521
      

      然后我将我的 Spring Java 应用程序连接到 localhost:15210

      要切换到 container3,只需输入此命令

      p-map xe3 15210:1521 
      

      下面是详细的操作命令。

      ~ $ p-map
      Change port of running container
      Command: p-map <container_name> <host_port:guest_port>
      
      DNAT     tcp  --  0.0.0.0/0       0.0.0.0/0       tcp dpt:21521 to:172.17.0.1:1521
      DNAT     tcp  --  0.0.0.0/0       0.0.0.0/0       tcp dpt:11521 to:172.17.0.2:1521
      
      ~ $ p-map xe1 15210:1521
      Change port of running container
      
      sudo iptables -t nat -A DOCKER -p tcp --dport 15210 -j DNAT --to-destination 172.17.0.1:1521
      
      DNAT     tcp  --  0.0.0.0/0       0.0.0.0/0       tcp dpt:21521 to:172.17.0.1:1521
      DNAT     tcp  --  0.0.0.0/0       0.0.0.0/0       tcp dpt:11521 to:172.17.0.2:1521
      DNAT     tcp  --  0.0.0.0/0       0.0.0.0/0       tcp dpt:15210 to:172.17.0.1:1521 --
      
      ~ $ p-map xe2 15210:1521
      Change port of running container
      Error: No such image or container: xe2
      
      DNAT     tcp  --  0.0.0.0/0       0.0.0.0/0       tcp dpt:21521 to:172.17.0.1:1521
      DNAT     tcp  --  0.0.0.0/0       0.0.0.0/0       tcp dpt:11521 to:172.17.0.2:1521
      DNAT     tcp  --  0.0.0.0/0       0.0.0.0/0       tcp dpt:15210 to:172.17.0.1:1521 --
      
      ~ $ p-map xe3 15210:1521
      Change port of running container
      
      sudo iptables -t nat -D DOCKER -p tcp --dport 15210 -j DNAT --to-destination 172.17.0.1:1521
      sudo iptables -t nat -A DOCKER -p tcp --dport 15210 -j DNAT --to-destination 172.17.0.2:1521
      
      DNAT     tcp  --  0.0.0.0/0       0.0.0.0/0       tcp dpt:21521 to:172.17.0.1:1521
      DNAT     tcp  --  0.0.0.0/0       0.0.0.0/0       tcp dpt:11521 to:172.17.0.2:1521
      DNAT     tcp  --  0.0.0.0/0       0.0.0.0/0       tcp dpt:15210 to:172.17.0.2:1521 --
      

      【讨论】:

        【解决方案4】:

        您的用例听起来不错,在 PROD 上看到 docker 非常有趣。您要进行的手动更改是什么?虽然,我认为您的问题的解决方案可能是

        1) 附加和分离容器 (How do I attach to a running Docker container later?)

        docker attach container_name ctrl p ctrl q

        2) 运行 docker exec 命令

        docker run -it -p 80:80 --name=old_container &lt;old-image-id&gt;

        上述命令将创建一个名为“old_container”的容器

        docker exec -d &lt;old_container&gt; mkdir foo

        上述命令将在运行容器的主文件夹上创建 foo 目录。我想您可以将您的手动更改作为脚本包含在“mkdir foo”的位置(我从未尝试过)

        P.S:docker exec 仅适用于 docker 1.3 版本

        【讨论】:

          猜你喜欢
          • 2020-04-12
          • 1970-01-01
          • 1970-01-01
          • 2018-10-22
          • 1970-01-01
          • 1970-01-01
          • 2022-11-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多