写点什么

Docker 网络学习第五篇 - 基础网络模式

用户头像
Lazy
关注
发布于: 2021 年 05 月 14 日
Docker网络学习第五篇-基础网络模式

标准的 Docker 支持 4 类网络模式


  • host 模式:容器和宿主机共享 Network namespace。

  • container 模式: 容器和另外一个容器共享 Network namespace。

  • none 模式:容器有独立的 Network namespace,但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接,配置 IP 等。

  • bridge 模式:docker 默认模式,就是利用在Docker网络学习第一篇-Linux虚拟网络讲到的 Birdge 实现。

host 模式

就是和主机使用同一个 network namespace, 直接使用主机的 ip 和端口与外界通信。下面通过 nginx 演示,在 nginx-conf/default.conf 配置文件中指定端口为11111


docker run --rm --name nginx-test --net=host -v /data/ljgeng/nginx-conf:/etc/nginx/conf.d nginx
复制代码


另起一个窗口,输入命令curl -I localhost:11111, 可以看到返回响应码 200,说明访问是成功的。nginx-test 并没有指定任何端口映射,容器中的11111端口实际就是主机端口,从表现的现象来看,确实可以直接使用了主机 ip 和端口和 nginx-test 通信,要进一步验证 nginx-test 和主机是使用同一个 network namespace,首先得了解下面这个知识:


不同 network namespace 中的进程有不同的 net:[]号码发配,拥有相同 net:[]号码的进程属于同一个 network namesapce


  • 首先查看 nginx-test 进程号


docker inspect nginx-test  -f "{{.State.Pid}}"16705
复制代码


  • 查看 nginx-test 的 net 号


ll /proc/16705/ns...lrwxrwxrwx 1 root root 0 Aug 17 11:03 net -> net:[4026531956]...
复制代码


  • 查看 主机的 net 号


ll /proc/self/ns...lrwxrwxrwx 1 root root 0 Aug 17 11:18 net -> net:[4026531956]...
复制代码


可以看出 nginx-test 与主机 net 号确实相同,说明使用了同一个 network namespace, 模式示例图如下:



container 模式

和 host 不同的是,容器和另一个容器共享 namespace。两个容器的进程可以通过 lo 网卡设备通信,现有两个容器, nginx-test 和 nginx-test1, 后者与前者共享 network namespace,前者端口设置为 11111, 后者为 11112。


  • 窗口 1 执行


docker run --rm --name nginx-test -v /data/ljgeng/nginx-conf:/etc/nginx/conf.d  nginx
复制代码


  • 窗口 2 执行


docker run --rm --name nginx-test1  \--net=container:nginx-test -v /data/ljgeng/nginx-conf1:/etc/nginx/conf.d  nginx
复制代码


  • 窗口 3 执行


docker exec -it nginx-test1 /bin/sh -c "apt-get update && apt install curl && curl -I localhost:11111"
...HTTP/1.1 200 OK...
复制代码

none 模式

通过--network=none 来指定。这种类型的网络没有办法联网,封闭的网络可以很好的保证容器的安全性。

bridge 模式

在 Docker 进程启动时会自动创建一个虚拟网桥 docker0, 在创建某一个具体的容器时,如果没有指定--net 或者指定--net=bridge, 那么在创建容器的同时会创建一对 veth pair 设备,一端放在容器中,一端接入网桥 docker0 上。



通过brctl show 查看 网桥设备


[root@2030-edu-01-no ~]# brctl showbridge name  bridge id    STP enabled  interfacesbr-40a246442710    8000.024299092001  no    docker0    8000.0242612d67e0  no    veth0734eff                                 ...
复制代码


在启动容器时 通过-p port:port指定映射端口,实际是利用 DANT 进行的转发,DNAT 知识可以在Docker网络学习第二篇-认识iptables 查看。使用iptables -t nat -vnL 查看转发规则。


使用docker network create <network-name> (可以使用-d 指定驱动,默认是 bridge) 命令时,实际就是创建了一个网桥,同一个网桥内的容器可以互相通信;


使用 ip netns ls 查看时,并没有发现 docker 容器的 namespace, 这是因为 docker 启动容器后会以进程号创建新的名字空间,而在较新的版本里面,默认删除了系统中的名字空间信息文件,如果想恢复,只需要执行 ln -s /proc/容器进程号/ns/net /var/run/netns/容器 命令即可。

发布于: 2021 年 05 月 14 日阅读数: 24
用户头像

Lazy

关注

某知名软件上市公司基层软件开发。 2019.10.17 加入

助力于脑科学软件工程,为中国脑计划舔砖加瓦。 脑科学软件工程包含多种模态数据的处理分析(如脑影像、基因、行为评测等)、脑相关科研平台、研究成果转化。其应用可覆盖到医疗、教育、生活娱乐等各个领域。

评论

发布
暂无评论
Docker网络学习第五篇-基础网络模式