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实现方式曲折,在管理上会略显混乱。
相关文章
|
6月前
|
监控 Kubernetes 安全
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
蒋星熠Jaxonic,技术探索者,以代码为笔,在二进制星河中书写极客诗篇。专注Docker与容器化实践,分享从入门到企业级应用的深度经验,助力开发者乘风破浪,驶向云原生新世界。
706 51
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
|
6月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
722 6
|
6月前
|
监控 Linux 调度
【赵渝强老师】Docker容器的资源管理机制
本文介绍了Linux CGroup技术及其在Docker资源管理中的应用。通过实例演示了如何利用CGroup限制应用程序的CPU、内存和I/O带宽使用,实现系统资源的精细化控制,帮助理解Docker底层资源限制机制。
608 6
|
6月前
|
存储 关系型数据库 MySQL
MySQL Docker 容器化部署全指南
MySQL是一款开源关系型数据库,广泛用于Web及企业应用。Docker容器化部署可解决环境不一致、依赖冲突问题,实现高效、隔离、轻量的MySQL服务运行,支持数据持久化与快速迁移,适用于开发、测试及生产环境。
898 4
|
网络安全 Docker 容器
docker 端口映射错误解决方法
docker 端口映射错误解决方法
704 0
|
网络协议 Docker 容器
docker 端口映射错误解决方法
今天搞了半天shipyard,在网页上打开时无法显示容器和镜像,最后发现是docker端口映射错误,由于防火墙未关闭: 4月 12 18:51:29 localhost firewalld[757]: 2018-04-12 18:51:29 ERROR: COMMAND_FAILED: '/sbin/iptables -t nat -C POSTROUTING -p tcp -s 172.
2529 0
|
7月前
|
Kubernetes Devops Docker
Kubernetes 和 Docker Swarm:现代 DevOps 的理想容器编排工具
本指南深入解析 Kubernetes 与 Docker Swarm 两大主流容器编排工具,涵盖安装、架构、网络、监控等核心维度,助您根据团队能力与业务需求精准选型,把握云原生时代的技术主动权。
655 115