Docker容器端口映射规则调整方案

简介: 创建宿主机与容器的端口映射,可以在docker run创建并运行容器的时候,通过-p指定端口映射规则。但是,我们也经常遇到创建容器时缺少部分端口映射,或者设置错了需要修改的情况。docker start运行容器后,并没有提供一个选项或设置可以修改指定的端口映射规则。那么这种情况我们该怎么处理呢?

1.概述

 Docker提供三种用户自定义(user-defined)的网络驱动:bridge,overlay和macvlan。通常,我们使用的是Docker默认的网络模式Bridge模式,bridge模式可以将各个容器的端口设为对立的,这样外部宿主机或者容器需要通过该容器所在ip+该容器的端口进行访问,并且本宿主机可以访问本宿主机中的容器。
 创建宿主机与容器的端口映射,需要在docker run创建并运行容器的时候,通过-p指定端口映射规则。但是,我们也经常遇到创建容器时忘记设置端口映射,或者设置错了需要修改的情况。docker start运行容器后,并没有提供一个选项或设置可以修改指定的端口映射规则。那么这种情况我们该怎么处理呢?本文将以Mac for DockerDesktop为例进行说明。

2.解决方案

2.1.重建容器

 这种方法比较简单直接,即删除原有的缺少端口映射的容器,重新创建一个指定端口映射规则的容器。
 由于此方案需要重建容器,所以仅适用于创建镜像后还没开始配置或容器配置简单、配置成本较小的情况。

2.2.修改配置文件

 通过修改配置文件hostconfig.json和config.v2.json,可以实现docker容器端口映射规则的修改,具体操作步骤如下。

  • 1.确定容器ID
docker container inspect $ContainerName |grep Id
或者
docker inspect $ContainerName |grep Id 

示例:
image.png

  • 2.停止容器
docker stop $ContainerName

示例:
image.png

  • 3.停止docker服务
     以Mac for Docker Desktop为例,示例如下:

image.png

  • 4.进入docker容器配置文件所在目录
cd ~/Library/Containers/com.docker.docker/Data/vms/0/
  • 5.进入Docker内部Linux
     容器配置文件所在目录中有一个tty文件,通过这个文件可以登录docker内部的Linux。
screen tty 
遇到空白命令行,直接回车即可。 
  • 6.进入容器对应文件夹
cd /var/lib/docker/containers/
cd $ContainerId

示例:
image.png

 如上图所示,容器对应目录内包含config.v2.json和hostconfig.json两个配置文件,下一步分别对两个文件进行修改即可(务必都进行修改)。

  • 7.编辑修改config.v2.json

    • a.执行如下命令查看config.v2.json
cat /var/lib/docker/containers/{容器id}/config.v2.json

image.png

  • b.本地进行json格式化,虽然config.v2.json是json文件,但没有格式化,所以在本地对齐进行格式化,方便参数修改。
  • c.编辑ExposedPorts和Ports参数,参考之前内容或如下格式添加端口映射。
    image.png

image.png

  • d.添加完成后,将文件内容压缩成一行并覆盖写入config.v2.json即可。
  • 8.编辑修改hostconfig.json
     操作步骤同上,需要修改的参数为PortBindings,添加内容示例如下,端口配置之间用英文字符逗号隔开。

image.png

  • 9.退出docker的虚拟Linux
     这一步很关键,如果没有正常退出,配置文件将无法覆盖旧文件,修改无法生效。

    • a.按Ctrl+A+D,退出screen命令。
    • b.使用screen -ls命令,查看当前会话。
      image.png
    • c.使用kill命令,杀死当前会话。
    • d.退出会话
screen -wipe 
There is a screen on: 
    41557.ttys004.YandeMacBook-Pro  (Removed) 
1 socket wiped out. 
No Sockets found in /var/folders/d0/y2ythxgd2p54y1p46bv90wpm0000gn/T/.screen. 
  • 10.重启docker
     重新启动Mac for DockerDesktop,并启动容器。
docker start $ContainerName

2.3.构建自定义镜像

 通过docker commit将原有容器及容器中的文件、配置信息commit为新的自定义镜像,然后再通过这个自定义镜像创建容器。在docker run创建并运行容器的时候,通过-p指定所需的端口映射规则,具体操作如下。

  • 1.停止原有docker容器。
docker stop $ContainerName
  • 2.提交原有docker容器为自定义镜像。
docker commit [OPTIONS] $container [REPOSITORY[:TAG]]
OPTIONS说明:
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。

image.png

  • 3.基于自定义镜像创建容器
docker run -it --name $new_containername -p 80:80 $imagename:tag

 到这里,添加指定端口映射的新容器就可以使用了。

3.总结

 综上,以上三种方式均可实现为运行中的容器调整端口映射规则,三种方式的优劣对比如下:

  • 优势

    • 通过删除原有容器并重建新容器的方式实现调整端口,操作简单、直接。
    • 修改配置文件的方式没有副作用,无需重新配置容器。
    • 通过构建自定义镜像、重建容器的的方式,操作简单且不会影响同一宿主机上的其他容器。
  • 劣势

    • 方案1重建容器后需要重新配置容器,比较麻烦。
    • 方案2修改配置文件后,需要重启整个docker服务,如果在同一个宿主机上运行着多个容器服务的话,会影响其他容器服务。
    • 方案3实现方式曲折,在管理上会略显混乱。
相关文章
|
8月前
|
域名解析 网络协议 API
【Azure Container App】配置容器应用的缩放规则 Managed Identity 连接中国区 Azure Service Bus 问题
本文介绍了在 Azure Container Apps 中配置基于自定义 Azure Service Bus 的自动缩放规则时,因未指定云环境导致的域名解析错误问题。解决方案是在扩展规则中添加 `cloud=AzureChinaCloud` 参数,以适配中国区 Azure 环境。内容涵盖问题描述、原因分析、解决方法及配置示例,适用于使用 KEDA 实现事件驱动自动缩放的场景。
182 1
|
9月前
|
存储 Kubernetes 监控
Docker与Kubernetes集成挑战及方案
面对这些挑战,并不存在一键解决方案。如同搭建灌溉系统需要考虑多种因素,集成Docker与Kubernetes也需要深思熟虑的规划、相当的技术知识和不断的调试。只有这样,才能建立起一个稳定、健康、高效的Docker-Kubernetes生态,让你的应用像花园中的植物一样繁荣生长。
383 63
|
存储 运维 Kubernetes
正式开源,Doris Operator 支持高效 Kubernetes 容器化部署方案
飞轮科技推出了 Doris 的 Kubernetes Operator 开源项目(简称:Doris Operator),并捐赠给 Apache 基金会。该工具集成了原生 Kubernetes 资源的复杂管理能力,并融合了 Doris 组件间的分布式协同、用户集群形态的按需定制等经验,为用户提供了一个更简洁、高效、易用的容器化部署方案。
697 16
正式开源,Doris Operator 支持高效 Kubernetes 容器化部署方案
|
12月前
|
运维 网络安全 文件存储
找不到类似 Docker Desktop 的 Web 管理界面?试试这些开源方案
Docker Desktop 是本地容器化开发的利器,但存在无法通过 Web 远程管理、跨平台体验不一致等问题。为此,推荐几款轻量级、可 Web 化管理的 Docker 工具:Portainer 功能全面,适合企业级运维;CasaOS 集成应用商店和 NAS 功能,适合家庭/个人开发环境;Websoft9 提供预集成环境,新手友好。这些工具能有效提升容器管理效率,满足不同场景需求。
861 3
|
Docker 容器
docker中端口映射
【10月更文挑战第7天】
1441 65
|
数据建模 应用服务中间件 nginx
docker替换宿主与容器的映射端口和文件路径
通过正确配置 Docker 的端口和文件路径映射,可以有效地管理容器化应用程序,确保其高效运行和数据持久性。在生产环境中,动态替换映射配置有助于灵活应对各种需求变化。以上方法和步骤提供了一种可靠且易于操作的方案,帮助您轻松管理 Docker 容器的端口和路径映射。
1098 3
|
存储 NoSQL 大数据
大数据-51 Redis 高可用方案CAP-AP 主从复制 一主一从 全量和增量同步 哨兵模式 docker-compose测试
大数据-51 Redis 高可用方案CAP-AP 主从复制 一主一从 全量和增量同步 哨兵模式 docker-compose测试
207 3
|
Kubernetes API Docker
跟着iLogtail学习容器运行时与K8s下日志采集方案
iLogtail 作为开源可观测数据采集器,对 Kubernetes 环境下日志采集有着非常好的支持,本文跟随 iLogtail 的脚步,了解容器运行时与 K8s 下日志数据采集原理。
1082 8
|
Docker 容器
一个docker容器暴露多个端口
一个docker容器暴露多个端口
277 3