Docker网络
计算机网络模型
Linux中网卡
(1)查看网卡[网络接口]
ip link show
ls /sys/class/net
ip a
ifconfig
(2)网卡
- ip a解读
状态:UP/DOWN/UNKOWN等
link/ether:MAC地址
inet:绑定的IP地址
- 配置文件
cat /etc/sysconfig/network-scripts/ifcfg-eth0
- 给网卡添加IP地址
- 直接修改ifcfg-*文件
- 通过命令修改
- 添加IP地址
ip addr add 192.168.0.100/24 dev eth0
- 删除IP地址
ip addr delete 192.168.0.100/24 dev eth0
- 网卡启动与关闭
重启网卡 :service network restart / systemctl restart network
启动/关闭某个网卡 :ifup/ifdown eth0 or ip link set eth0 up/down
Network Namespace
在linux上,网络的隔离是通过network namespace来管理的,不同的network namespace是互相隔离的
network namespace的管理
ip netns list #查看
ip netns add ns1 #添加
ip netns delete ns1 #删除
namespace实战
(1)创建一个network namespace
ip netns add ns1
(2)查看该namespace下网卡的情况
ip netns exec ns1 ip a
(3)启动ns1上的lo网卡(2中方式)
ip netns exec ns1 ifup lo
ip netns exec ns1 ip link set lo up
(4)再次查看
可以发现state变成了UNKOWN
(5)再次创建一个network namespace
ip netns add ns2
(6)两个namespace网络连通起来(如图)
veth pair :Virtual Ethernet Pair,是一个成对的端口,可以实现上述功能
(7)创建一对link,也就是接下来要通过veth pair连接的link
ip link add veth-ns1 type veth peer name veth-ns2
(8)查看link情况
ip link
(9)将veth-ns1加入ns1中,将veth-ns2加入ns2中
ip link set veth-ns1 netns ns1
ip link set veth-ns2 netns ns2
(10)查看宿主机和ns1,ns2的link情况
ip link
ip netns exec ns1 ip link
ip netns exec ns2 ip link
(11)此时veth-ns1和veth-ns2还没有ip地址,显然通信还缺少点条件
ip netns exec ns1 ip addr add 192.168.0.11/24 dev veth-ns1
ip netns exec ns2 ip addr add 192.168.0.12/24 dev veth-ns2
(12)再次查看,发现state是DOWN,并且还是没有IP地址
ip netns exec ns1 ip link
ip netns exec ns2 ip link
(13)启动veth-ns1和veth-ns2
ip link add veth-ns1 type veth peer name veth-ns2
ip netns exec ns1 ip link set veth-ns1 up
ip netns exec ns2 ip link set veth-ns2 up
(14)再次查看,发现state是UP,同时有IP
ip netns exec ns1 ip a
ip netns exec ns2 ip a
(15)此时两个network namespace互相ping一下,发现是可以ping通的
ip netns exec ns1 ping 192.168.0.12
ip netns exec ns2 ping 192.168.0.11
container网络-Bridge
(1)docker0默认bridge
QA:为什么centos机器可以和容器内的网络互相通信?
答案(这里的容器以tomcat为例):
在tomcat01中有一个eth0和centos的docker0中有一个veth3是成对的,类似于之前实战中的
veth-ns1和veth-ns2,不妨再通过一个命令确认下:brctl
安装一下:yum install bridge-utils
brctl show
QA:为什么容器之间网络可以互相通信呢?
这种网络连接方法我们称之为Bridge,其实也可以通过命令查看docker中的网络模式:docker network ls
bridge也是docker中默认的网络模式
不妨检查一下bridge:docker network inspect bridge
在容器中是可以访问互联网的图示:
创建自己的network
(1)创建一个network,类型为bridge
docker network create tomcat-net
docker network create --subnet=172.18.0.0/24 tomcat-net(指定网段的方式)
(2)查看已有的network:
docker network ls
(3)查看tomcat-net详情信息:
docker network inspect tomcat-net
(4)创建tomcat的容器,并且指定使用tomcat-net
docker run -d --name custom-net-tomcat --network tomcat-net tomcat
(5)查看custom-net-tomcat的网络信息
docker exec -it custom-net-tomcat ip a
(6)查看网卡接口
brctl show
QA: 如果此时去通信上面我们创建的tomcat01发现是无法通信的?
docker exec -it custom-net-tomcat ping 172.17.0.2(这里指的是tomcat01的ip地址)
解决办法:
命令:docker network connect tomcat-net tomcat01
查看tomcat-net网络,可以发现tomcat01这个容器也在其中
此时进入到tomcat01或者custom-net-tomcat中,不仅可以通过ip地址ping通,而且可以通过名字ping到,这时候因为都连接到了用户自定义的tomcat-net bridge上
Host & None
Host
(1)创建一个tomcat容器,并且指定网络为host
docker run -d --name my-tomcat-host --network host tomcat
(2)查看ip地址
docker exec -it my-tomcat-host ip a
None
(1)创建一个tomcat容器,并且指定网络为none
docker run -d --name my-tomcat-none --network none tomcat
(2)查看ip地址
docker exec -it my-tomcat-none ip a
多机之间的container通信
(1)使得两边的eth0能够通信
(2)前提要确保容器内的IP地址不一样
(3)将容器中的所有信息当成eth0要传输给另外一端的信息
(4)具体通过vxlan技术实现
www.evoila.de/2015/11/06/what-is-vxlan-and-how-it-works
(5)处在vxlan的底层:underlay
处在xxlan的上层:overlay