Docker更改端口绑定

时间:2014-07-10 13:25:04

标签: port docker

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

  

sudo docker run -p 80:80 -i -t< old-image-id>

在我的制作环境中,我想立即从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的提交映像并将此映像作为另一个新容器运行。< / p>

4 个答案:

答案 0 :(得分: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 (删除)命令清理未使用的旧容器:
docker rm old_container new_container

答案 1 :(得分:0)

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

1)附加&amp;分离容器(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 <old-image-id>

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

docker exec -d <old_container> mkdir foo

上面的命令将在正在运行的容器的主文件夹上创建foo目录。我想你可以把你的手动更改作为脚本代替'mkdir foo'(我从未尝试过)

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

答案 2 :(得分:0)

我为change PORT of Running Container创建了myboot2docker的工具。

Ex:两(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 --

答案 3 :(得分:0)

运行new_container图像并进行所需更改后,使用package.json将新容器另存为新图像。然后使用-p标志运行此新映像以映射端口。