3.docker的网络通信机制

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 实战

  1. 创建一个network namespace
ip netns add ns1
  1. 查看namepace下的网卡
ip netns exec ns1 ip a
  1. 启动ns1上的lo网卡
ip netns exec ns1 ifup lo 
or 
ip netns exec ns1 ip link set lo up
  1. 再次查看ip netns exec ns1 ip a可以发现state变成了UNKNOW状态
  2. 再次创建一个namespace ip netns add ns2
    在这里插入图片描述
  3. 此时想让两个namespace网络连通起来
    veth pair :Virtual Ethernet Pair,是一个成对的端口,可以实现上述功能
    在这里插入图片描述
  4. 创建一对link,也就是接下来要通过veth pair连接的link
ip link add veth-ns1 type veth peer name veth-ns2 
  1. 查看link的情况ip link
  2. )将veth-ns1加入ns1中,将veth-ns2加入ns2中
ip link set veth-ns1 netns ns1 
ip link set veth-ns2 netns ns2 
  1. 查看宿主机和ns1,ns2的link情况
ip link 
ip netns exec ns1 ip link 
ip netns exec ns2 ip link 
  1. 此时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 
  1. 再次查看,发现state是DOWN,并且还是没有IP地址
ip netns exec ns1 ip link 
ip netns exec ns2 ip link 
  1. 启动veth-ns1和veth-ns2
ip netns exec ns1 ip link set veth-ns1 up 
ip netns exec ns2 ip link set veth-ns2 up 
  1. 再次查看,发现state是UP,同时有IP
ip netns exec ns1 ip a 
ip netns exec ns2 ip a
  1. 此时两个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,并且是独立的,我们可以进入 到容器中进行验证.

  1. 不妨创建两个container看看
docker run -d --name tomcat01 -p 8081:8080 tomcat
docker run -d --name tomcat02 -p 8082:8080 tomcat 
  1. 进入到两个容器中,并且查看ip
docker exec -it tomcat01 ip a 
docker exec -it tomcat02 ip a 
  1. 互相ping一下是可以ping通的
    值得我们思考的是,此时tomcat01和tomcat02属于两个network namespace,是如何能够ping通的? 有些小伙伴可能会想,不就跟上面的namespace实战一样吗?注意这里并没有veth-pair技术 ,接下来继续分享docker container的网络

深入分析container网络-Bridge

docker0默认bridge

  1. 查看centos的网络可以发现docker有个默认的网卡docker0
    在这里插入图片描述

  2. 查看容器Tomcat01的网络:
    在这里插入图片描述

  3. 在centos中ping一下tomcat01的网络,发现可以ping通

  4. 既然可以ping通,而且centos和tomcat1又属于不同的network namespace,是怎么连接的?
    很显然,跟之前的实战是一样的,画个图
    在这里插入图片描述

  5. 也就是说,在tomcat01中有一个eth0和centos的docker0中有一个veth3是成对的,类似于之前实战中的 veth-ns1和veth-ns2,不妨再通过一个命令确认下:brctl

安装一下:yum install bridge-utils
brctl show

在这里插入图片描述

这种网络连接方法我们称之为Bridge,其实也可以通过命令查看docker中的网络模式:
docker network ls bridge也是docker中默认的网络模式

在这里插入图片描述

  1. 不妨检查一下bridge:docker network inspect bridge
    在这里插入图片描述
  2. 在tomcat01容器中是可以访问互联网的,顺便把这张图画一下咯,NAT是通过iptables实现的
    在这里插入图片描述

创建自己的docker network

一般在默认的network ip地址不够用时,创建新的network。

  1. 创建一个network,类型为bridge
docker network create tomcat-net 
or 
docker network create --subnet=172.18.0.0/24 tomcat-net 
  1. 查看已有的network:docker network ls
    在这里插入图片描述

  2. 查看tomcat-net详情信息:docker network inspect tomcat-net
    在这里插入图片描述

  3. 创建tomcat的容器,并且指定使用tomcat-net

docker run -d --name tomcat-net-tomcat --network tomcat-net tomcat
  1. 查看custom-net-tomcat的网络信息
docker exec -it tomcat-net-tomcat ip a 

在这里插入图片描述
6. 查看centos的网卡ip a
在这里插入图片描述

  1. 查看网卡接口
    在这里插入图片描述
  2. 此时在tomcat-net-tomcat容器中ping一下tomcat01的ip会如何?发现无法ping通
  3. 此时如果tomcat01容器能够连接到tomcat-net上应该就可以咯docker 跨network连接
docker network connect tomcat-net tomcat01 

查看docker network inspect tomcat-net可以发现tomcat01也在tomcat-net的network中
在这里插入图片描述

  1. 此时进入到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

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

可以发现和centos是一样的
3. 检查host网络

在这里插入图片描述

None

  1. 创建一个tomcat容器,并且指定网络为none
docker run -d --name my-tomcat-none --network none tomcat 
  1. 查看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 
  1. 检查none网络
    在这里插入图片描述

一般用bridge类型,host和none不常用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值