docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > docker proxy原理

docker proxy实现原理解析

作者:janeysj

Docker 是一个开源的容器化平台,它允许开发者打包、分发和运行应用程序,本文给大家介绍docker proxy实现原理,感兴趣的朋友跟随小编一起看看吧

docker-proxy 是 Docker 网络架构中的一个“传声筒”。当你启动一个容器并使用 -p 参数映射端口时,它就在幕后默默工作。如下的一个docker-compose配置:

注意这里的端口映射,就类似于你运行 docker run -p 30003:30003 的命令时,你实际上是要求宿主机将发往 30003 端口的流量转发到容器内部的 30003 端口。

为了实现这个转发,Docker 使用了两种机制:

以上两个动作是由docker自动完成的,这时,你使用如下命令(netstat, ps)可以查看到该docker-proxy进程:

但是,如果你使用命令sudo kill -9 2152 把这个docker-proxy进程杀死,你再次访问该主机的30003端口,仍然可以正常访问!!!但是你ssnetstat搜索不到任何关于30003端口的信息。

1. 为什么进程杀了,网页还能访问?

这就是 Docker 的“双保险”机制:

当你杀掉 docker-proxy 进程后,内核态的 iptables 规则依然稳如泰山。所以,外部流量打到 30003 时,内核直接把包转给了容器,网页自然能打开。这时你输入命令,大概率会看到:

[root@localhost ~]#  sudo iptables -t nat -L DOCKER -n | grep 30003
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:30003 to:172.21.0.3:30003

2. 为什么ss搜不到了?

ssnetstat 查的是系统中的 Socket 监听表

3. 会有什么后果?

虽然现在访问正常,但杀掉 docker-proxy 可能会导致以下小问题:

4. 怎么恢复?

如果你想让 docker-proxy 重新出现,最简单的方法是重启容器

docker restart web-ui

重启后,Docker 会重新创建 iptables 规则并启动一个新的 docker-proxy 进程。

总结:

一个很重要的结论:Docker 的端口映射本质上是内核行为(iptables),docker-proxy 只是一个辅助。 只要内核规则在,服务就不会断。

到此这篇关于docker proxy实现原理解析的文章就介绍到这了,更多相关docker proxy原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文