docker的网络原理
day02 docker的网络原理
今日内容
目录
一、网络基础
1、网络命令空间
1、为了支持网络协议栈的多个实例,Linux在网络协议栈中引入了网络名称空间(NetworkNamespace),这些独立的协议栈被隔离到不同的命名空间中。处于不同的命名空间的网络协议栈是完全隔离的,彼此之间无法进行网络通信,就好像两个“平行宇宙”。通过这种对网络资源的隔离,就能在一个宿主机上虚拟多个不同的网络环境,而Docker正是利用这种网络名称空间的特性,实现了不同容器之间的网络隔离。在Linux的网络命名空间内可以有自己独立的Iptables来转发、NAT及IP包过滤等功能。
2、Linux的网络协议栈是十分复杂的,为了支持独立的协议栈,相关的这些全局变量都必须修改为协议栈私有。最好的办法就是让这些全局变量成为一个NetNamespace变量的成员,然后为了协议栈的函数调用加入一个Namespace参数。这就是Linux网络名称空间的核心。所以的网络设备都只能属于一个网络名称空间。当然,通常的物理网络设备只能关联到root这个命名空间中。虚拟网络设备则可以被创建并关联到一个给定的命名空间中,而且可以在这些名称空间之间移动。
2、Veth设备
引入Veth设备对是为了在不同的网络名称空间之间进行通信,利用它可以直接将两个网络名称空间链接起来。由于要连接的两个网络命名空间,所以Veth设备是成对出现的,很像一对以太网卡,并且中间有一根直连的网线。既然是一对网卡,那么我们将其中一端称为另一端的peer。在Veth设备的一端发送数据时,它会将数据直接发送到另一端,并触发另一端的接收操作。
2.1、使用Veth设备对
# 容器之间的网络互通问题?
实现两个不同的网络名称空间互联的方式
1、创建名称空间
[root@localhost ~]# ip netns add test01
2、创建veth设备对
[root@localhost ~]# ip link add veth type veth peer name veth001
3、绑定名称空间
[root@localhost ~]# ip link set veth001 netns test01
4、分配IP
[root@localhost ~]# ip netns exec test01 ip addr add 10.0.0.111/20 dev veth001
[root@localhost ~]# ip addr add 10.0.0.112/20 dev veth
5、重启
[root@localhost ~]# ip netns exec test01 ip link set dev veth001 down
[root@localhost ~]# ip netns exec test01 ip link set dev veth001 up
[root@localhost ~]# ip link set dev veth down
[root@localhost ~]# ip link set dev veth up
6、测试
[root@localhost ~]# ping 10.0.0.111
3、网桥
Linux可以支持多个不同的网络,它们之间能够相互通信,就需要一个网桥。网桥是二层的虚拟网络设备,它是把若干个网络接口“连接”起来,从而报文能够互相转发。网桥能够解析收发的报文,读取目标MAC地址的信息,和自己记录的MAC表结合,来决定报文的转发目标网口。
网桥设备br0绑定了eth0、eth1。对于网络协议的上层来说,只看得到br0。因为桥接是在数据链路层实现的,上层不需要关心桥接的细节,于是协议上层需要发送的报文被送到br0,网桥设备的处理代码判断报文该被转发到eth0还是eth1,或者两者皆转发。反过来,从eth0或从eth1接收到的报文被提交给网桥的处理代码,在这里会判断报文应该被转发、丢弃还是提交到协议枝上层。而有时eth1也可能会作为报文的源地址或目的地址直接参与报文的发送与接收,从而绕过网桥。
4、iptables
我们知道,Linux络协议非常高效,同时比较复杂如果我们希望在数据的处理过程中对关心的数据进行一些操作该怎么做呢?Linux提供了一套机制来为用户实现自定义的数据包处理过程。
在Linux网络协议棋中有一组回调函数挂接点,通过这些挂接点挂接的钩子函数可以在Linux网络棋处理数据包的过程中对数据包进行些操作,例如过滤、修改、丢弃等整个挂接点技术叫作Netfilterlptables
Netfilter负责在内核中执行各种挂接的规则,运行在内核模式中:而lptables是在用户模式下运行的进程,负责协助维护内核中Netfilter的各种规则表通过者的配合来实现整个Linux网络协议战中灵活的数据包处理机制。
5、ipvs
ipvs (IP Virtual Server) 实现了传输层负载均衡,也就是我们常说的4层LAN交换,作为 Linux 内核的一部分。ipvs运行在主机上,在真实服务器集群前充当负载均衡器。ipvs可以将基于TCP和UDP的服务请求转发到真实服务器上,并使真实服务器的服务在单个 IP 地址上显示为虚拟服务。
二、docker网络模式
1、网路的五种模式
就是为了实现容器互联的。
1、host模式
将容器网络绑定到宿主主机上。也就是说宿主主机上的网络直接绑定到容器内。
[root@localhost ~]# docker run -d --network host nginx # 就是把宿主机所有的网卡绑定给容器
2、container模式
共享一个容器的网络。
[root@localhost ~]# docker run -it -d centos # 创建容器
[root@localhost ~]# docker run -d --network "container:epic_swirles" nginx # 共享容器网络,共享哪个容器container指向哪个
3、网桥模式
1、创建网桥
[root@localhost ~]# docker network create meng # 创建网桥
2、使用网桥
[root@localhost ~]# docker run -it --network meng centos
3、使用id或名字访问
[root@32d3dddc29ed /]# curl 5c6374c282b6
[root@localhost ~]# docker run -d --name nginx --network meng nginx # 可以用名字访问
[root@7e01d07b3786 /]# curl nginx
4、none模式
这种模式只提供一个回环网络
[root@localhost ~]# docker run -it --network none centos
5、--link
链接一个容器,类似于container模式
[root@localhost ~]# docker run -it --link "nginxv1:nginxv1" centos
2、docker的network
1、创建网桥
--subnet :指定网络的CIDR
--gateway :网关
[root@localhost ~]# docker network create chenyang1 --subnet "10.0.0.0/24" --gateway "10.0.0.2"
2、查看网桥
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
网桥的ID 网桥的名称 网桥类型 网桥的来源
3、查看网桥的详细信息
docker network inspect [网桥的名称]
4、链接网桥
docker network connect [网桥] [容器]
[root@localhost ~]# docker network connect meng1 nginxv2
5、断开链接
docker network disconnect [网桥] [容器]
[root@localhost ~]# docker network disconnect meng1 nginxv2
6、删除网桥
docker network rm [网桥名称]
[root@localhost ~]# docker network rm chenyang3
7、清理网桥
[root@localhost ~]# docker network prune
8、查看错误日志
docker logs [id|名字]
[root@localhost ~]# docker logs nginx
3、案例
1、分析
Nginx ---> Django
1、创建网桥
[root@localhost ~]# docker network create meng3
2、部署Django
[root@localhost ~]# docker run -d -it python:3.6 bash
2d2d77726f5fadd22472527116300a7ab5bb43c660c7663d7843b2fa0f0afffb
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2d2d77726f5f python:3.6 "bash" 3 seconds ago Up 2 seconds stoic_mcnulty
[root@localhost ~]# docker exec -it stoic_mcnulty bash
root@2d2d77726f5f:/# pip install django
root@2d2d77726f5f:/# exit
[root@localhost ~]# docker commit -a 'A' -m 'A' -p stoic_mcnulty python:django
[root@localhost ~]# docker run -d -w /opt -v /root/linux/:/opt --network meng3 python:django python manage.py runserver 0.0.0.0:8000
3、nginx
vim django.conf
server {
server_name _;
listen 80;
location / {
proxy_pass http://django:8000;
}
}
[root@localhost ~]# docker run -d --name nginx --network meng3 -p 8080:80 -v /root/django.conf:/etc/nginx/conf.d/default.conf nginx

浙公网安备 33010602011771号