目录

Linux中的网卡

Network Namespace 

Docker中的Bridge网络

使用自定义Bridge网络创建容器

Container中的其他网络

Host网络

None网络


Linux中的网卡

网卡:网卡是计算机网络中,计算机能够进行通信的硬件支撑(会有唯一的Mac地址)

1.查看网卡[网络接口] 
ip a:

状态:UP/DOWN/UNKOWN等
link/ether:MAC地址
inet:绑定的IP地址 

docker service 指定网卡 docker 添加网卡_docker



2.给网卡添加ip地址

(1) 添加ip地址
     ip addr add 192.168.0.100/24 dev eth0
(2)删除IP地址    
     ip addr delete 192.168.0.100/24 dev eth0

docker service 指定网卡 docker 添加网卡_tomcat_02

3. 网卡启动与关闭 
重启网卡
service network restart / systemctl restart network
启动/关闭某个网卡
ifup/ifdown eth0
或者ip link set eth0 up/down

Network Namespace 

在linux上,网络的隔离是通过network namespace来管理的,不同的network namespace是互相隔离的

管理namespace命令:
ip netns list       //查看
ip netns add ns1     //添加
ip netns delete ns1  //删除
ip netns exec ns1 ip a //查看ns1 namespace下的网卡情况

创建两个namespace,并且启动其上的网卡

ip netns add ns1
ip netns exec ns1 ip a
ip netns exec ns1 ip link set lo up
ip netns exec ns1 ip a
ip netns add ns2
ip netns exec ns2 ip link set lo up

docker service 指定网卡 docker 添加网卡_docker service 指定网卡_03

此时想让两个namespace网络连通起来 就需要使用veth pair 

Virtual Ethernet Pair,是一对的虚拟设备接口,用于不同network namespace间进行通信,veth pair将一个network namespace数据发往另一个network namespace的veth,如下图

 

docker service 指定网卡 docker 添加网卡_tomcat_04

##创建一对veth pair的link,veth-ns1 veth-ns2
ip link add veth-ns1 type veth peer name veth-ns2

##查看link情况

docker service 指定网卡 docker 添加网卡_tomcat_05

##将veth-ns1加入ns1中,将veth-ns2加入ns2中
ip link set veth-ns1 netns ns1 
ip link set veth-ns2 netns ns2

此时veth-ns1和veth-ns2还没有ip,无法连通,查看宿主机和各namespace下的ip情况

docker service 指定网卡 docker 添加网卡_docker_06

##给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

docker service 指定网卡 docker 添加网卡_自定义_07

##启动veth-ns1和veth-ns2
ip netns exec ns1 ip link set veth-ns1 up 
ip netns exec ns2 ip link set veth-ns2 up

再次使用ip a 查看,发现veth-ns1,veth-ns2有了IP,并且状态是UP

docker service 指定网卡 docker 添加网卡_tomcat_08

两个ip可以ping通了

veth-ns1@if5代表该网卡与ns2上的编号为5的网卡是一对,veth-ns2@if6的@if6也是同样的意思

docker service 指定网卡 docker 添加网卡_docker_09

Docker中的Bridge网络

创建两个tomcat容器,并进入其中查看

docker run -d --name tomcat01 -p 8081:8080 tomcat 
docker run -d --name tomcat02 -p 8082:8080 tomcat 
docker exec -it tomcat01 ip a 
docker exec -it tomcat02 ip a

两个container之间的网络是互通的,这样才可以保证在不同容器里部署的多个服务相互之间可以调用

docker service 指定网卡 docker 添加网卡_自定义_10

docker service 指定网卡 docker 添加网卡_自定义_11

创建更多的容器,可以发现各个容器之间的网络都是互通的,但是他们分别属于不同的namespace,不可能都是之间通过Virtual Ethernet Pair来连通的,这样容器之间的网络就太复杂了(需要每两个容器之间都有一个veth pair对)

查看宿主机的ip

docker service 指定网卡 docker 添加网卡_tomcat_12

docker service 指定网卡 docker 添加网卡_tomcat_13

在宿主机中直接ping tomcat01的ip是可以ping通的,猜测tomcat01和宿主机之间是通过veth pair连通的.。

在tomcat01中有一个eth0@if8和centos的docker0中的veth97c1ac6@if7(第8个网卡)是成对的

可以安装下bridge-utils验证下:yum install bridge-utils 

docker service 指定网卡 docker 添加网卡_docker_14

故docker中容器之间可以连通,是因为他们各自通过veth pair对与docker0连通,

像docker这样容器之间通过中间层(docker0)实现连通的网络连接方式称之为bridge.

如下图所示

docker service 指定网卡 docker 添加网卡_docker_15

通过docker network inspect bridge可以看到docker 的bridge网络中各container的信息(默认的Bridge网络名称就是bridge)

docker service 指定网卡 docker 添加网卡_自定义_16

使用自定义Bridge网络创建容器

(1)创建自己的bridge network
docker network create tomcat-net 
或者 docker network create --subnet=172.18.0.0/24 tomcat-net 

查看当前docker的网络

docker service 指定网卡 docker 添加网卡_自定义_17

查看一下tomcat-net网络的详情,当前没有任何的container

#docker network inspect tomcat-net

docker service 指定网卡 docker 添加网卡_自定义_18

(2)创建tomcat的容器,并且指定使用tomcat-net
   docker run -d --name custom-net-tomcat --network tomcat-net tomcat 
(3)查看下自定义的tomcat-net 的网络信息

docker service 指定网卡 docker 添加网卡_docker service 指定网卡_19

(4)查看容器custom-net-tomcat的网络信息和宿主机的网络信息
docker exec -it custom-net-tomcat ip a 

docker service 指定网卡 docker 添加网卡_tomcat_20

ip a查看宿主机下的ip

docker service 指定网卡 docker 添加网卡_docker service 指定网卡_21

(5)查询bridge网络信息,在新的bridge上有新的pair对

docker service 指定网卡 docker 添加网卡_自定义_22

(6)在custome-net-tomcat 自定义network的容器中ping一下tomcat01的ip,发现不通

不同的network下的容器无法互通

docker exec -it custom-net-tomcat ping 172.17.0.2

docker service 指定网卡 docker 添加网卡_docker service 指定网卡_23

(7)尝试把tomcat01的容器也加入到tomcat-net的网络中
  docker network connect tomcat-net tomcat01 

(8)查看tomcat-net的网络,发现tomcat01这个容器也在其中

docker network inspect tomcat-net

docker service 指定网卡 docker 添加网卡_docker_24

而且一个network里的tomcat01和custom-net-tomcat可以通过ip和容器名ping通

docker service 指定网卡 docker 添加网卡_tomcat_25

 

默认的bridge和自定义的bridge网络区别:

1. 自定义的bridge网络可以删除,但是默认bridge网络不可以

2. 默认bridge网络中所有容器间只能用IP相互访问。自定义bridge网络中容器之间除ip访问外,还可以直接用容器名作为hostname访问

3. docker run的时候只能在使用自定义网络时指定容器ip

 

Container中的其他网络

 

Host网络

host网络意味着容器与宿主机共用一套网络,也就是说容器使用的网络就是宿主机的网络,使用--network  host指定使用host网络。

(1)创建一个tomcat容器,并且指定网络为host
docker run -d --name my-tomcat-host --network host tomcat 
(2)查看ip地址 与宿主机的ip是一样的 
docker exec -it my-tomcat-host ip a   

docker service 指定网卡 docker 添加网卡_docker_26


(3)检查host网络

docker service 指定网卡 docker 添加网卡_docker service 指定网卡_27

 使用host网络就可以直接通过8080端口访问容器,而不需要映射到宿主机的端口

docker service 指定网卡 docker 添加网卡_docker_28

优点:复用了宿主机网络,网络性能好,数据的传输效率;

缺点:宿主机端口可能发生冲突;破坏了容器的网络隔离性

None网络

none网络意味着没有网络,所创建的容器只有lo,没有其他的网卡。容器创建时可以使用--network  none指定使用none网络。

(1)创建一个tomcat容器,并且指定网络为none
docker run -d --name my-tomcat-none --network none tomcat 
(2)查看ip地址
docker exec -it my-tomcat-none ip a 

docker service 指定网卡 docker 添加网卡_自定义_29


 其网络类型为UNKNOWN 

(3)检查none网络

docker service 指定网卡 docker 添加网卡_tomcat_30