linux中的网卡
网卡[网络接口]
查看网卡三种方式:
ip link show
ls /sys/class/net
ip a
ip a解读
状态:UP/DOWN/UNKOWN等
link/ether:MAC地址
inet:绑定的IP地址
配置文件
在Linux中网卡对应的其实就是文件,所以找到对应的网卡文件即可
比如:cat /etc/sysconfig/network-scripts/ifcfg-eth0
给网卡添加ip地址
当然,这块可以直接修改ifcfg-*文件,但是我们通过命令添加试试
(1)ip addr add 192.168.0.100/24 dev eth0
(2)删除IP地址 ip addr delete 192.168.0.100/24 dev eth0
启动关闭网卡
重启网卡:service network restart / systemctl restart network
启动/关闭网卡:ifup/down eth0 或者 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 实战
- 创建一个network namespace
ip netns add ns1
- 查看namepace下的网卡
ip netns exec ns1 ip a
- 启动ns1上的lo网卡
ip netns exec ns1 ifup lo
or
ip netns exec ns1 ip link set lo up
- 再次查看
ip netns exec ns1 ip a
可以发现state变成了UNKNOW状态 - 再次创建一个namespace
ip netns add ns2
- 此时想让两个namespace网络连通起来
veth pair
:Virtual Ethernet Pair,是一个成对的端口,可以实现上述功能
- 创建一对link,也就是接下来要通过veth pair连接的link
ip link add veth-ns1 type veth peer name veth-ns2
- 查看link的情况
ip link
- )将veth-ns1加入ns1中,将veth-ns2加入ns2中
ip link set veth-ns1 netns ns1
ip link set veth-ns2 netns ns2
- 查看宿主机和ns1,ns2的link情况
ip link
ip netns exec ns1 ip link
ip netns exec ns2 ip link
- 此时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
- 再次查看,发现state是DOWN,并且还是没有IP地址
ip netns exec ns1 ip link
ip netns exec ns2 ip link
- 启动veth-ns1和veth-ns2
ip netns exec ns1 ip link set veth-ns1 up
ip netns exec ns2 ip link set veth-ns2 up
- 再次查看,发现state是UP,同时有IP
ip netns exec ns1 ip a
ip netns exec ns2 ip a
- 此时两个network namespace互相ping一下,发现是可以ping通的
ip netns exec ns1 ping 192.168.0.12
ip netns exec ns2 ping 192.168.0.11
container的ns
按照上面的描述,实际上每个container,都会有自己的network namespace,并且是独立的,我们可以进入 到容器中进行验证.
- 不妨创建两个container看看
docker run -d --name tomcat01 -p 8081:8080 tomcat
docker run -d --name tomcat02 -p 8082:8080 tomcat
- 进入到两个容器中,并且查看ip
docker exec -it tomcat01 ip a
docker exec -it tomcat02 ip a
- 互相ping一下是可以ping通的
值得我们思考的是,此时tomcat01和tomcat02属于两个network namespace,是如何能够ping通的? 有些小伙伴可能会想,不就跟上面的namespace实战一样吗?注意这里并没有veth-pair技术 ,接下来继续分享docker container的网络
深入分析container网络-Bridge
docker0默认bridge
-
查看centos的网络可以发现docker有个默认的网卡docker0
-
查看容器Tomcat01的网络:
-
在centos中ping一下tomcat01的网络,发现可以ping通
-
既然可以ping通,而且centos和tomcat1又属于不同的network namespace,是怎么连接的?
很显然,跟之前的实战是一样的,画个图
-
也就是说,在tomcat01中有一个eth0和centos的docker0中有一个veth3是成对的,类似于之前实战中的 veth-ns1和veth-ns2,不妨再通过一个命令确认下:brctl
安装一下:yum install bridge-utils
brctl show
这种网络连接方法我们称之为Bridge,其实也可以通过命令查看docker中的网络模式:
docker network ls bridge
也是docker中默认的网络模式
- 不妨检查一下bridge:
docker network inspect bridge
- 在tomcat01容器中是可以访问互联网的,顺便把这张图画一下咯,NAT是通过iptables实现的
创建自己的docker network
一般在默认的network ip地址不够用时,创建新的network。
- 创建一个network,类型为bridge
docker network create tomcat-net
or
docker network create --subnet=172.18.0.0/24 tomcat-net
-
查看已有的network:
docker network ls
-
查看tomcat-net详情信息:
docker network inspect tomcat-net
-
创建tomcat的容器,并且指定使用tomcat-net
docker run -d --name tomcat-net-tomcat --network tomcat-net tomcat
- 查看custom-net-tomcat的网络信息
docker exec -it tomcat-net-tomcat ip a
6. 查看centos的网卡ip a
- 查看网卡接口
- 此时在tomcat-net-tomcat容器中ping一下tomcat01的ip会如何?发现无法ping通
- 此时如果tomcat01容器能够连接到tomcat-net上应该就可以咯docker 跨network连接
docker network connect tomcat-net tomcat01
查看docker network inspect tomcat-net
可以发现tomcat01也在tomcat-net的network中
- 此时进入到tomcat01或者custom-net-tomcat中,不仅可以通过ip地址ping通,而且可以通过名字ping 到,这时候因为都连接到了用户自定义的tomcat-net bridge上
ping tomcat02的ip可以,但是ping tomcat02
是不通的
结论:
docker 默认的network中的容器,通过容器名称是ping不通的
自定义的docker network中的容器,可以通过容器名ping通对方。
深入分析container网络Host & None
Host
- 创建一个tomcat容器,并且指定网络为host
docker run -d --name my-tomcat-host --network host tomcat
- 查看ip地址
docker exec -it my-tomcat-host ip a
可以发现和centos是一样的
3. 检查host网络
None
- 创建一个tomcat容器,并且指定网络为none
docker run -d --name my-tomcat-none --network none tomcat
- 查看ip地址
docker exec -it my-tomcat-none ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
- 检查none网络
一般用bridge类型,host和none不常用。