docker重启时究竟发生了什么?

使用docker时有时遇到问题,查阅相关问题,解决方法时重启docker服务。实际测试可以解决问题,那docker daemon重启,究竟改变了什么?

如docker run时遇到如下问题:

docker: Error response from daemon: driver failed programming external connectivity on endpoint node1 (9cedc114be35eb86cd6f7f7bb4f11f93b5f8d2c0745afc72664cef8e96aad439): iptables failed: iptables --wait -t filter -A DOCKER ! -i docker0 -o docker0 -p tcp -d 172.17.0.2 --dport 3000 -j ACCEPT: iptables: No chain/target/match by that name.

(exit status 1).

docker daemon启动过程会初始化一系列的iptables规则以及修改部分内核参数(如net.ipv4.ip_forward)。

经过对比分析,可以看到docker启动,分别在filter和nat建立了名为DOCKER的chain,

在forward转发链增加了一些ACCEPT规则,在nat增加了postrouting和prerouting以及output的规则。

  • filter表中的forward主要是对容器和宿主机以及本机容器之间数据包的放行。
  • 上面的docker run报错就是因为没有filter和nat中的DOCKER chain导致的,感兴趣的同学可以手动清空iptables然后手动创建这两个chain,会发现可以run端口映射的容器了,因为docker run增加的规则就是在这两个表中的DOCKER chain下添加的。
  • 再说一下nat表的-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE这条规则。
    这条规则是处理docker的SNAT地址伪装用的。具体含义是将容器网络网段发送到外部的数据包(!-o docker0)伪装成宿主机的ip,就是讲数据包的原来的容器ip换成了宿主机ip,做了一次snat。对于这个我们也踩过坑,不经snat转换的容器数据包被我们其他节点的防火墙给拦截了(限制非vm网段的ip),导致访问失败。
  • -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
    这条的含义是把目标地址类型属于主机系统的本地网络地址的数据包,在数据包进入NAT表PREROUTING链时,都让它们直接jump到一个名为DOCKER的链。

容器数据包发送到host外就需要nat规则以实现docker地址伪装成主机ip。如没有此规则,数据包以docker地址发送,而docker地址是局域网地址,不能接收到回应数据包。

参考:
1. docker和iptables
2. 发往Docker容器内的数据包源地址被修改的研究

原文地址:https://www.cnblogs.com/embedded-linux/p/12258101.html

时间: 2024-08-17 07:23:01

docker重启时究竟发生了什么?的相关文章

docker重启 容器自动重启

创建容器时添加参数  --restart=always 后,当 docker 重启时,容器自动启动. 使用方法: docker container update --restart=always 容器名字 操作实例如下: [[email protected] mnt]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 46cdfc60b7a6 nginx "nginx -g 'daemon ..."

开机加电到系统打开究竟发生了什么?(1)

每天工作都少不了一件事情:打开电脑... 开机过程中究竟发生了什么事情?电脑内部各零件是怎么变化的?多年前,我记得我很好奇,可是现在却有点麻木了.只有保持好奇心才能保持年轻! 说到计算机,还是先回想一下计算机的构成吧,第一次接触电脑不是在大学,而是上初中在网吧,和同学一起玩游戏,还是那时候欢乐多一点,头一次玩了一夜电脑,还是很兴奋的,让我最高兴的莫过于游戏可以无限续命,最终通关了游戏. 后来上了大学,专业是软件技术(.net),懵懵懂懂的上了几节计算机的课,知道了计算机有主机和外设构成,听说了冯

20年,中国互联网究竟发生了什么?

摘要 : 写这篇文章的缘起,是最近的一些观察和思考,借由这些观察和思考,我发现,这20年来,互联网这个行业虽然千变万化风起云涌,但其背后的一些大众心理.诉求和规律,却是不变以及可以捕捉到的.这很有趣. 写这篇文章的缘起,是最近的一些观察和思考,借由这些观察和思考,我发现,这20年来,互联网这个行业虽然千变万化风起云涌,但其背后的一些大众心理.诉求和规律,却是不变以及可以捕捉到的.这很有趣. 并且,当你回过头去把这20年来主流的互联网产品的演变历史梳理完一遍之后,你可能也能够对未来3-5年的互联网

(转)金蝶KIS迷你版、标准版在查询数量金额明细账时提示“发生未知错误,系统当前操作被取消,请与金蝶公司联系”

金蝶KIS迷你版.标准版在查询数量金额明细账时提示“发生未知错误,系统当前操作被取消,请与金蝶公司联系” 2013-07-10 12:17:51|  分类: 金蝶专题|举报|字号 订阅 金蝶KIS迷你版.标准版在查询数量金额明细账时提示“发生未知错误,系统当前操作被取消,请与金蝶公司的技术支持机构联系” 问题描述:厦门金蝶KIS迷你版.标准版在查询数量金额明细账时提示“发生未知错误,系统当前操作被取消,请与金蝶公司的技术支持机构联系”.但是选择“确定”后仍然可以查询到数据.问题原因: GLQty

解决Docker build时 Sending build context to Docker daemon 过大的问题

当使用Dockerfile Build镜像时,优势会发现发送到Daemo的内容过大 build image:q_build/javaweb:20150910174642Sending build context to Docker daemon 4.768 GBSending build context to Docker daemon  Step 0 : FROM 192.168.100.123:5000/q_basic/javaweb:1.0  ---> 0aab72ab2945 Step 

服务器直接关机,再开机,硬重启时把数据库搞坏了,状态为“可疑”的解决方法

服务器放的网站都正常,就是远程连不上,着急改点东西,就让机房的人把服务器重启了一下,那边一般都是直接关机,再开机,硬重启. 之前也一直没有出现过异常,但今天硬重启了以后,发现网站出错,一看原来是数据库状态为“可疑”,不能用了,真是吓我一跳,第一次遇到这种问题. 在网上搜了一下,找到解决方法,管用,挺好的,记录一下. 首页把iis及一些连数据库的服务停掉,80和1433端口在防火墙里面也禁止连接,意思就是不让访问,要不会影响执行速度. 把DbName换成坏掉的数据库名,当前数据库选Master,步

Axis 调用.net WebServic接口出现:验证消息的安全性时错误发生

解决方法:call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP12_CONSTANTS); 參考:http://www.blogjava.net/andy199999/ 异常内容: AxisFault faultCode: {http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}InvalidSecurity faultS

Unix系统重启时必须注意的事项

Unix系统重启时必须注意的事项 对于系统管理员来说如何管理自己的服务器已经是再简单不过,但是如何管理好服务器却不是一个简单的事情.对于Windows服务器管理员来说经常性重启Windows设备已经成为一种生活常态,但在Unix系统中这可不是常态的事,在默认情况下重新启动不会带来任何形式的改善. 对于每一位服务器管理员来说这都算得上热门话题,但在Unix极客们眼中它则属于一种层次更深的课题--可能因为Windows管理员们往往把重启当成故障排查工作的首要步骤之一,而Unix团队则一般只在束手无策

十天学Linux内核之第七天---电源开和关时都发生了什么

原文:十天学Linux内核之第七天---电源开和关时都发生了什么 说实话感觉自己快写不下去了,其一是有些勉强跟不上来,其二是感觉自己越写越差,刚开始可能是新鲜感以及很多读者的鼓励,现在就是想快点完成自己制定的任务,不过总有几个读者给自己鼓励,很欣慰的事情,不多感慨了,加紧时间多多去探索吧,今天要去描述的是电源开和关时都发生了什么,一起去看看吧~~ bootloader引导装入程序将内核映像加载到内存并处理控制权传送到内核后在内核引导时每个子系统都必须要初始化,我们根据实际执行的线性顺序跟踪内核的