目录
Linux中的网卡
Network Namespace
Docker中的Bridge网络
使用自定义Bridge网络创建容器
Container中的其他网络
Host网络
None网络
Linux中的网卡
网卡:网卡是计算机网络中,计算机能够进行通信的硬件支撑(会有唯一的Mac地址)
1.查看网卡[网络接口]
ip a:
状态:UP/DOWN/UNKOWN等
link/ether:MAC地址
inet:绑定的IP地址
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
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
此时想让两个namespace网络连通起来 就需要使用veth pair
Virtual Ethernet Pair,是一对的虚拟设备接口,用于不同network namespace间进行通信,veth pair将一个network namespace数据发往另一个network namespace的veth,如下图
##创建一对veth pair的link,veth-ns1 veth-ns2
ip link add veth-ns1 type veth peer name veth-ns2
##查看link情况
##将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情况
##给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
##启动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
两个ip可以ping通了
veth-ns1@if5代表该网卡与ns2上的编号为5的网卡是一对,veth-ns2@if6的@if6也是同样的意思
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之间的网络是互通的,这样才可以保证在不同容器里部署的多个服务相互之间可以调用
创建更多的容器,可以发现各个容器之间的网络都是互通的,但是他们分别属于不同的namespace,不可能都是之间通过Virtual Ethernet Pair来连通的,这样容器之间的网络就太复杂了(需要每两个容器之间都有一个veth pair对)
查看宿主机的ip
在宿主机中直接ping tomcat01的ip是可以ping通的,猜测tomcat01和宿主机之间是通过veth pair连通的.。
在tomcat01中有一个eth0@if8和centos的docker0中的veth97c1ac6@if7(第8个网卡)是成对的
可以安装下bridge-utils验证下:yum install bridge-utils
故docker中容器之间可以连通,是因为他们各自通过veth pair对与docker0连通,
像docker这样容器之间通过中间层(docker0)实现连通的网络连接方式称之为bridge.
如下图所示
通过docker network inspect bridge可以看到docker 的bridge网络中各container的信息(默认的Bridge网络名称就是bridge)
使用自定义Bridge网络创建容器
(1)创建自己的bridge network
docker network create tomcat-net
或者 docker network create --subnet=172.18.0.0/24 tomcat-net
查看当前docker的网络
查看一下tomcat-net网络的详情,当前没有任何的container
#docker network inspect tomcat-net
(2)创建tomcat的容器,并且指定使用tomcat-net
docker run -d --name custom-net-tomcat --network tomcat-net tomcat
(3)查看下自定义的tomcat-net 的网络信息
(4)查看容器custom-net-tomcat的网络信息和宿主机的网络信息
docker exec -it custom-net-tomcat ip a
ip a查看宿主机下的ip
(5)查询bridge网络信息,在新的bridge上有新的pair对
(6)在custome-net-tomcat 自定义network的容器中ping一下tomcat01的ip,发现不通
不同的network下的容器无法互通
docker exec -it custom-net-tomcat ping 172.17.0.2
(7)尝试把tomcat01的容器也加入到tomcat-net的网络中
docker network connect tomcat-net tomcat01
(8)查看tomcat-net的网络,发现tomcat01这个容器也在其中
docker network inspect tomcat-net
而且一个network里的tomcat01和custom-net-tomcat可以通过ip和容器名ping通
默认的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
(3)检查host网络
使用host网络就可以直接通过8080端口访问容器,而不需要映射到宿主机的端口
优点:复用了宿主机网络,网络性能好,数据的传输效率;
缺点:宿主机端口可能发生冲突;破坏了容器的网络隔离性
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
其网络类型为UNKNOWN
(3)检查none网络