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

因为刚开始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. 一张图让你学会Python【转】

    转自:http://blog.csdn.net/qq_30845505/article/details/51588423 有编程基础的人一看就可以了解 Python 的用法了.真正的 30 分钟上手. ...

  2. 复制View对象

    
Mark一下 - (UIView*)duplicate:(UIView*)view { NSData * tempArchive = [NSKeyedArchiver archivedDataWit ...

  3. IPC最快的方式----共享内存(shared memory)

    在linux进程间通信的方式中,共享内存是一种最快的IPC方式.因此,共享内存用于实现进程间大量的数据传输,共享内存的话,会在内存中单独开辟一段内存空间,这段内存空间有自己特有的数据结构,包括访问权限 ...

  4. PHP操作MongoDB(增删改查)

    MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似.PHP7以前的版本和PHP7之后的版本对MongoDB的操 ...

  5. mysql中PDO参数化引号引起的Warning: PDOStatement::execute(): SQLSTATE[HY093]:报错

    sql语句之前是这样写的:INSERT INTO tablename SET a = ':a',b = ':b',c = ':c',d = :d,e = :e $data = array ( [':a ...

  6. springBoot 打成jar包

    1.一种方式通过cmd 窗口进行打包 配置maven 环境变量 进入到项目中  运行 mvn clean 然后运行mvn package 进行打包 2.通过idea 进行打包 (1)pom 中安装打包 ...

  7. AC日记——[HNOI2007]紧急疏散evacuate bzoj 1189

    [HNOI2007]紧急疏散evacuate 思路: 处理每个人到门的最短路: 然后二分答案: s向人连边流量1: 人向门拆分后的点连边流量1(拆成400,前一个点连当前点流量INF): 然后门向t连 ...

  8. 网络安全---大学霸_ITDaren

    http://blog.csdn.net/u014621518/article/category/2191665

  9. EasyMvc入门教程-高级控件说明(14)列布局控件

    想起刚做网页时候,看着这么大的屏幕,一直在 想该如何布局呢,后来经过Table布局,Div布局,Border布局,列式布局. 目前EasyMvc主要支持12列的列式布局(手机兼容性好).请看下面的例子 ...

  10. ylb:SQL 表的高级查询-多表连接和子查询

    ylbtech-SQL Server: SQL Server-表的高级查询-多表连接和子查询 SQL Server 表的高级查询-多表连接和子查询. 1,ylb:表的高级查询-多表连接和子查询 返回顶 ...