Docker技术疑问:无需docker run能否创建端口映射?
问题解答
1. 现有create/start/exec工作流能否添加端口映射?
不行。docker create是容器的初始化创建步骤,端口映射属于容器的核心网络配置,一旦容器创建完成(哪怕未启动),这些网络绑定规则就已经固化在容器配置中。docker start仅负责启动已创建的容器,docker exec只是进入容器执行命令,这两个命令都不具备修改端口映射的能力。
如果已经用docker create创建好容器,又不想采用修改hostconfig.json的方法,可选择以下两种替代方案:
- 基于原容器的镜像重新执行
docker create,添加-p 本地端口:22参数后启动新容器 - 在宿主机使用
socat工具做端口转发,无需修改容器配置:# 宿主机执行,将本地2222端口转发到目标容器的22端口(替换实际容器名) socat TCP-LISTEN:2222,fork TCP:容器名:22
2. docker create无法映射端口的技术难点?
其实docker create完全支持端口映射,只需在命令中添加-p参数即可,例如:
docker create -p 2222:22 镜像名
你可能存在认知偏差——docker run本质就是docker create + docker start的组合命令,因此docker create天然支持-p参数配置端口映射。
容器创建完成后无法再修改端口映射的技术原因在于:Docker的端口映射依赖宿主机的iptables规则和网桥配置,这些配置需要在容器创建时就完成初始化,因为容器的网络命名空间在创建阶段就已确定,后续修改需要重新调整iptables规则和网络栈,操作复杂度高且容易引发网络异常。
适配现有工作流的解决方案
如果想保留create/start/exec的流程,只需在docker create步骤添加端口映射参数即可:
- 创建容器时指定端口映射:
docker create -p 本地端口:22 [原有其他参数] 镜像名 - 启动容器:
docker start 容器名/容器ID - 后续可正常使用
docker exec进入容器,同时也能通过宿主机指定端口SSH连接容器。
内容的提问来源于stack exchange,提问作者Hau
相关产品推荐
相关产品推荐

