今天需要修改一个容器A的外部映射的端口,在宿主机上跑着许多容器,所以在解决这个问题的时候需要考虑两个硬性条件:

1、宿主机上docker的service服务本身不能重启,影响其他线上容器。

2、该容器A不能删除,因为有数据存在。

网上有不少的解决方案,但是在这种场景下适合的特别少,常用的有下面两种(不过对于我这次的场景来讲,只能使用方案二解决):

方案一:修改容器A配置文件,重启容器A

我们知道宿主机上默认存放所有容器的配置目录是在/var/lib/docker/containers/目录下,在该目录下有许多个容器ID的目录,每一个ID表示一个容器。因此要找到容器A的配置文件那么需要先查询出容器A的ID号即可。使用“docker ps | grep Container_Name”。得到容器A的ID号之后再去/var/lib/docker/containers/目录下使用tab键补全目录并进入即可,然后就可以看到容器A的配置文件。如下所示:

容器A的主要的配置文件是hostconfig.json这个文件,我们打开并编辑内容即可。里面的信息较多,我们只需要找到PortBindings这一行的信息,需要编辑:

"PortBindings":{"9200/tcp":[{"HostIp":"","HostPort":""}],"9300/tcp":[{"HostIp":"","HostPort":""}]}

文档中PortBings这一项中,其中“9200/tcp”是对应容器内部的9200端口。而“HostPort”:"9201"则对应的是映射到宿主机的端口9201。后面的9300端口也是统一如此。修改完端口之后,重启docker服务service即可。

缺点:此方法需要重启容器服务,因此会影响其他的docker容器,因此不建议使用。

方案二:使用docker commit新构镜像

docker commit把一个容器的文件改动和配置信息commit到一个新的镜像中,然后用这个新的镜像重启一个容器,这对之前的容器不会有影响。

主要是三步骤:

1、先stop容器A

2、commit容器A

  docker commit old_container  new_image:tag

3、使用前一步新生成的镜像重新启动一个容器。

  docker run --name container_name02 -p 9202:9200 new_image:tag

优点:可以解决问题,比较推荐

docker动态修改端口映射(考虑生产环境)的更多相关文章

  1. 如何修改运行中的docker容器的端口映射和挂载目录

    在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当docker start运行容器后并没有提供一个-p选项或设 ...

  2. 教你如何修改运行中的docker容器的端口映射

    在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当docker start运行容器后并没有提供一个-p选项或设 ...

  3. [转帖]教你如何修改运行中的docker容器的端口映射

    教你如何修改运行中的docker容器的端口映射   在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当dock ...

  4. 如何修改运行中的docker容器的端口映射

    在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当docker start运行容器后并没有提供一个-p选项或设 ...

  5. 修改docker容器的端口映射

    大家都知道docker run可以指定端口映射,但是容器一旦生成,就没有一个命令可以直接修改.通常间接的办法是,保存镜像,再创建一个新的容器,在创建时指定新的端口映射. 有没有办法不保存镜像而直接修改 ...

  6. Docker(33)- 如何修改 docker 容器的端口映射

    如果你还想从头学起 Docker,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1870863.html 问题背景 docker run ...

  7. 修改已经创建的docker容器的端口映射

    原始链接:https://stackoverflow.com/questions/19335444/how-do-i-assign-a-port-mapping-to-an-existing-dock ...

  8. 修改docker的port端口映射

    原以为修改docker的端口映射只是一条命令就可以搞定,结果发现没那么简单,记录一下以防忘记.1. 查看需要修改的容器,记住container iddocker ps -a2. 停止容器docker ...

  9. docker已运行容器添加或修改端口映射

    # 不推荐方法:将原来的容器提交成镜像,然后利用新的建立的镜像重新建立一个带有端口映射的容器# 推荐方法:## 查看id 就是 容器的 hash_of_the_container 数值 docker ...

随机推荐

  1. (原)使用ass字幕文件通过ffmpeg给视频添加字幕的一些研究

    使用ass字幕文件通过ffmpeg给视频添加字幕的一些研究 Author:lihaiping1603@aliyun.com Create:2019-09-04 最近对ffmpeg给视频文件添加字幕效果 ...

  2. Docker守护式容器

    1.什么是守护式容器 能够长期运行 没有交互式会话 适合运行应用程序和服务 2.以守护形式运行容器 运行交互式容器时以Ctrl+P Ctrl+Q 来退出容器,此时容器还在后台继续运行,我们可以通过do ...

  3. microsoft vs code 绿化

    下载地址: https://code.visualstudio.com/#alt-downloads 各个版本比较 User Installer System Installer .zip resou ...

  4. Springboot中IDE支持两种打包方式,即jar包和war包

    Springboot中IDE支持两种打包方式,即jar包和war包 打包之前修改pom.xml中的packaging节点,改为jar或者war    在项目的根目录执行maven 命令clean pa ...

  5. lnmp+discuz使用redis缓存(待进一步研究)

    一直说Redis.Redis缓存.一直不清楚怎么用.于是花点时间研究了一下,但是还没搞懂.先把大概内容记录一下,待后续继续学习 1.首先部署lnmp环境,这个我的博客有些,请自行搜索 2.给php添加 ...

  6. Linux下安装配置rocketmq

    1.安装jdk,如果系统有原来的系统自带的先删掉,因为很多库不全,自己需要到jdk官网下载包. 卸载CentOS自带的OpenJdk: [root@centos-lx /]# rpm -qa | gr ...

  7. spring boot 实现定时任务

    定时任务或者说定时调度,是系统中比较普遍的一个功能,例如数据归档.清理,数据定时同步(非实时),定时收发等等都需要用到定时任务,常见的定时调度框架有Quartz.TBSchedule等. 如何在Spr ...

  8. nginx deny 封IP

    官方文档地址:http://nginx.org/en/docs/http/ngx_http_access_module.html#deny Syntax: deny address | CIDR | ...

  9. JavaEE 期末总结

    struts2部分 一.struts2框架的集成: 1.web.xml配置struts2过滤器:前端控制器.核心控制器 如果有多个过滤器,需要将该过滤器放置到最后一个 2.struts.xml配置:主 ...

  10. List集合分批多线程处理,同时控制最大并发

    业务中,要实现数据日终同步,采用将同步文件中的数据封装成List集合分批处理加多线程的方式,根据数据量动态设置线程数,同时控制最大并发数量(业务中有IO操作,避免过大并发导致堵塞),实现效率提高 // ...