我不确定我是否误解了这里的某些内容,但似乎只能通过从映像创建新容器来设置端口映射。是否有办法将端口映射分配到现有的Docker容器?
当前回答
我们可以使用方便的工具,如SSH来轻松完成这一任务。
我使用ubuntu主机和基于docker镜像的ubuntu。
在docker内部安装了openssh-client。 外部docker(主机)安装了openssh-server服务器。
当需要绘制一个新端口时,
在docker中运行以下命令
ssh -R8888:localhost:8888 <username>@172.17.0.1
其中“172.17.0.1”为docker接口的IP (你可以通过跑步得到这个 Ifconfig docker0 | grep "inet addr" | cut -f2 -d":" | cut -f1 -d" " on the host)。
在这里,我有本地8888端口映射回主机8888。您可以根据需要更改端口。
如果您还需要一个端口,您可以终止ssh,并使用新端口向其添加多一行-R。
我已经用netcat测试过了。
其他回答
如果你运行docker run <NAME>,它将生成一个新映像,这很可能不是你想要的。
如果你想改变当前的图像,请执行以下操作:
Docker ps a
获取目标容器的id,然后转到:
cd /var/lib/docker/containers/<conainerID><and then some:)>
停止容器:
docker stop <NAME>
更改文件
vi config.v2.json
"Config": {
....
"ExposedPorts": {
"80/tcp": {},
"8888/tcp": {}
},
....
},
"NetworkSettings": {
....
"Ports": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "80"
}
],
然后更改文件
vi hostconfig.json
"PortBindings": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "80"
}
],
"8888/tcp": [
{
"HostIp": "",
"HostPort": "8888"
}
]
}
重新启动docker,它应该可以工作。
如果你不适应Docker深度配置,iptables将是你的朋友。
iptables -t nat -A DOCKER -p tcp --dport ${YOURPORT} -j DNAT --to-destination ${CONTAINERIP}:${YOURPORT}
iptables -t nat -A POSTROUTING -j MASQUERADE -p tcp --source ${CONTAINERIP} --destination ${CONTAINERIP} --dport ${YOURPORT}
iptables -A DOCKER -j ACCEPT -p tcp --destination ${CONTAINERIP} --dport ${YOURPORT}
这只是一个技巧,不是推荐的方法。这适用于我的场景,因为我无法停止容器。
我对这个问题也很感兴趣。
正如@Thasmo提到的,端口转发只能通过docker run(和docker create)命令指定。 其他命令,docker start没有-p选项,docker port只显示当前转发。
要添加端口转发,我总是遵循以下步骤,
停止运行容器 Docker停止test01 提交容器 Docker提交test01 test02 注意:上面的test02是我从test01容器构建的一个新映像。 从已提交的映像重新运行 Docker运行-p 8080:8080 -td test02
其中第一个8080是本地端口,第二个8080是集装箱端口。
集装箱岸吊法
如果有人正在使用portainer,我发现这个解决方案是“Gui友好和安全的”
去Portainer的集装箱 停止容器 选择“复制/编辑” 添加所需的端口并进行部署。 当被问到是替换还是取消时,选择替换。 享受生活
我们可以使用方便的工具,如SSH来轻松完成这一任务。
我使用ubuntu主机和基于docker镜像的ubuntu。
在docker内部安装了openssh-client。 外部docker(主机)安装了openssh-server服务器。
当需要绘制一个新端口时,
在docker中运行以下命令
ssh -R8888:localhost:8888 <username>@172.17.0.1
其中“172.17.0.1”为docker接口的IP (你可以通过跑步得到这个 Ifconfig docker0 | grep "inet addr" | cut -f2 -d":" | cut -f1 -d" " on the host)。
在这里,我有本地8888端口映射回主机8888。您可以根据需要更改端口。
如果您还需要一个端口,您可以终止ssh,并使用新端口向其添加多一行-R。
我已经用netcat测试过了。
推荐文章
- 我如何找到哪个程序正在使用端口80在Windows?
- 试图连接到https://index.docker.io时,网络超时
- 为每个Docker图像查找图层和图层大小
- 如何避免在为Python项目构建Docker映像时重新安装包?
- 有效地测试Linux上的端口是否打开?
- 如何用docker-compose更新现有图像?
- 如何在构建docker期间设置环境变量
- 拉访问拒绝存储库不存在或可能需要docker登录
- 如何在ENTRYPOINT数组中使用Docker环境变量?
- Docker:容器不断地重新启动
- Mac/OS X上的/var/lib/docker在哪里
- 如何用docker-compose标记docker图像
- 从环境文件中读入环境变量
- 禁用特定RUN命令的缓存
- 从Docker容器获取环境变量