我正在尝试创建一个 Docker 容器,它就像一个完整的虚拟机。我知道我可以使用 Dockerfile 中的 EXPOSE 指令来公开端口,并且可以使用带有 docker run
的 -p
标志来分配端口,但是一旦容器是实际运行时,是否有命令可以实时打开/映射其他端口?
例如,假设我有一个运行 sshd 的 Docker 容器。其他人使用容器 ssh 并安装 httpd。有没有办法把容器上的 80 端口暴露出来,映射到宿主机上的 8080 端口,这样人们就可以访问容器中运行的 web 服务器,而无需重启?
您无法通过 Docker 执行此操作,但您可以从主机访问容器的未公开端口。
如果你有一个容器在它的 8000 端口上运行,你可以运行
wget http://container_ip:8000
要获取容器的 IP 地址,请运行 2 个命令:
docker ps
docker inspect container_name | grep IPAddress
在内部,当您运行镜像时,Docker 会调用 iptables,因此可能对此有一些变化。
要在本地主机的 8001 端口上公开容器的 8000 端口:
iptables -t nat -A DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.19:8000
解决此问题的一种方法是使用所需的端口映射设置另一个容器,并比较 iptables-save 命令的输出(不过,我不得不删除其他一些强制流量通过 docker 代理的选项)。
注意:这是对 docker 的颠覆,所以应该意识到它可能会产生蓝烟。
或
另一种选择是查看(新?0.6.6 后?)-P 选项 - 它将使用随机主机端口,然后将它们连接起来。
或
在 0.6.5 中,您可以使用 LINKs 功能来创建一个与现有容器对话的新容器,并通过一些额外的中继到该容器的 -p 标志? (我还没有使用过链接。)
或
使用 docker 0.11?您可以使用 docker run --net host ..
将容器直接附加到主机的网络接口(interface)(即 net 没有命名空间),因此 all 您在其中打开的端口容器暴露在外。
我是一名优秀的程序员,十分优秀!