为何想要动态映射端口呢?

因为刚开始run启动容器时,并不知道里面需要映射哪些端口,等容器已创建了,想映射端口。

当然可以通过先commit成镜像,然后再次run时指定端口,但会生成中间的镜像,对于有轻微洁癖的我是不允许这种情况发生的。

我们可以对比映射前后iptables-save的变化(即没有加-p与加了-p选项后对比):

docker run -i -t --name test -p 8080:80 1f4fd79edf6d /bin/bash 

iptables-save的结果

*nat -A DOCKER !-i docker0 -p tcp -m tcp --dport8080-j DNAT --to-destination 172.17.0.2:80*filter -A FORWARD -d 172.17.0.2/32!-i docker0 -o docker0 -p tcp -m tcp --dport80-j ACCEPT

通过“iptables -t table名 -L”查看:

filter表 Chain FORWARD ACCEPT     tcp  --  anywhere             localhost            tcp dpt:http   nat表 Chain DOCKER DNAT       tcp  --  anywhere             anywhere             tcp dpt:webcache to:172.17.0.2:80

可以看到filter表的FORWARD链和nat表的DOCKER链各添加了一条规则。

受此启发,从而我们可以通过如下方法动态映射端口:

iptables -t nat -A DOCKER !-i docker0 -p tcp -m tcp --dport8080-j DNAT --to-destination 172.17.0.4:80 iptables -I FORWARD -d 172.17.0.4/32!-i docker0 -o docker0 -p tcp -m tcp --dport80-j ACCEPT

把“iptables -A FORWARD”改成“-I”放在第一条,用-A是添加到最后,用-I是放在最前面。

如果误操作了,可以通过如下方法删除:

iptables -t table名 -D chain名 rulenum [options]//rulenum 是规则的编号。从1 开始。可以使用--line-numbers 列出规则的编号 iptables -t nat -L--line-numbers iptables -t nat -D DOCKER 1

[编辑]艺搜参考

http://jar-c.blog.163.com/blog/static/116401250201061541150973/

http://stackoverflow.com/questions/19897743/exposing-a-port-on-a-live-docker-container

Docker入门系列7 动态映射端口port mapping的更多相关文章

  1. Docker入门系列(一):目标和安排

    Docker入门系列(一) 这个系列的教程来源于docker的官方文档,此文档的目的在于一步一步学习docker的使用方法. 这一系列的教程有如下几篇文档: docker安装启动 构建第一个docke ...

  2. Docker入门系列之三:如何将dockerfile制作好的镜像发布到Docker hub上

    这个系列的前两篇文章,我们已经把我们的应用成功地在Docker里通过nginx运行了起来,并且用dockerfile里制作好了一个镜像. Docker入门系列之一:在一个Docker容器里运行指定的w ...

  3. ElasticSearch7.3 学习之定制动态映射(dynamic mapping)

    1.dynamic mapping ElasticSearch中有一个非常重要的特性--动态映射,即索引文档前不需要创建索引.类型等信息,在索引的同时会自动完成索引.类型.映射的创建. 当ES在文档中 ...

  4. 解决docker容器启动时候无法映射端口的问题

    当我们停止防火墙后,docker容器启动映射端口可能无法映射端口,这个时候需要重建docker0网桥. 详细的错误是这样的: docker: Error response from daemon: d ...

  5. Docker入门系列1:简介

    可以实现快速部署. 比如一台 16 核 32G 内存的虚拟机上,需要跑 500+ 个用户的应用(每个应用的功能可以认为是一个网站 + 一系列的 RESTful API),有两个事情很重要: 资源隔离: ...

  6. Docker入门系列之五:15个 Docker 命令

    在这篇文章中,我们将学习15个Dockers CLI命令.如果你还不了解Docker,请查看这个系列的其他部分进行学习,Docker概念,生态系统,Dockerfile,Docker镜像. Docke ...

  7. Docker入门系列4:命令行小结

    百度Baidu App Engine(BAE)平台也是以Docker作为其PaaS云基础. 目的就是为了解决以下问题: 1) 环境管理复杂: 从各种OS到各种中间件再到各种App,一款产品能够成功发布 ...

  8. Docker入门系列3:使用

    入门 首先强烈建议玩一遍官方的入门教程,Interactive commandline tutorial,下面是答案: 查看版本:docker version 搜索Image:docker searc ...

  9. Docker入门系列之一:什么是Docker?

    原文作者:Jeff Hale 原文地址:https://towardsdatascience.com/learn-enough-docker-to-be-useful-b7ba70caeb4b 翻译: ...

随机推荐

  1. soc与cpu区别

    soc(System on Chip)片上系统cpu只包括运算器和控制器.早期 的系统是指在PCB上有cpu和Nand控制器,LCD控制器之类的控制器,构成一个系统. cpu和这些控制器之间用pcb板 ...

  2. [论文]Clustering-Based Ensembles as an Alternative to Stacking

    Clustering-Based Ensembles as an Alternative to Stacking 作者:Anna Jurek, Yaxin Bi, Shengli Wu, and Ch ...

  3. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---26

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  4. 洛谷——1115 最大子段和(区间DP)

    题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 输入文件maxsum1.in的第一行是一个正整数N,表示了序列的长度. 第2行包含N个绝对值不大于10000 ...

  5. HDFS Scribe Integration 【转】

    It is finally here: you can configure the open source log-aggregator, scribe, to log data directly i ...

  6. ArcGIS 10.2 二次开发,兼容Visual Studio 2012二次开发,完美安装教程

    GIS 经常安装是常有的事,每次重装系统都要浪费大半天去安装这个.所以凑这一次安装,把这个软件重新安装的步骤整理了一下,希望对大家有所帮助.这次整理的内容的关键优点是,对常见的出错内容进行了归纳整理. ...

  7. ios获得文件字节总数

    NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:self.finalPath err ...

  8. Vbs脚本经典教材

    转载:http://www.cnblogs.com/BeyondTechnology/archive/2011/01/10/1932440.html Vbs脚本经典教材(最全的资料还是MSDN) —为 ...

  9. MetaQ简单实用demo

    Metaq的生产者代码 import java.io.BufferedReader; import java.io.InputStreamReader; import com.taobao.metam ...

  10. hdu 3392(滚动数组优化dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3392 Pie Time Limit: 6000/3000 MS (Java/Others)    Me ...