~阿弥陀佛~

人生能有多少天是按照自己的想法去活着

容器虚拟化网络

目前linux内核支撑6中名称空间

主机名域名:UTS   

用户:USER

挂载文件系统: Mount

进程间通信: IPC

进程ID: PID

网络:Net

OVS:OpenVswitch SDN 开源的虚拟交换机,并且能模拟实现三层交换设备

假设一台物理机,4块网卡,要创建两个名称空间,而这些网卡是可以单独关联给一个单独的名称空间使用。一个网卡只能属于一个空间。每一个名称空间都能配置IP地址并且与外部进行通讯。

如果名称空间数量超过网卡数量,可以使用虚拟网卡用纯软件的方式模拟设备使用,Linux内核级支持两种设备的模拟,一种是二层设备,一种是三层设备。

二层:物理网卡,链路层,能封装物理报文在各网络设备之间实现报文转发。这个功能可以利用linux内核中对虚拟设备的支持创建对虚拟网卡接口,而且这个网卡接口设备是成对儿出现可以模拟为一根网线的两端,一端主机,一端交换机。Linux内核原生支持二层虚拟网桥设备

Overlay network 叠加网络

 

 

[root@node-1 ~]# docker network ls

NETWORK ID     NAME      DRIVER    SCOPE

15b2026a5bb0   bridge    bridge    local

e487bba842a4   host      host      local

5c1962091568   none      null      local

 

Bridge

桥接网络,非物理桥,在本机创建软交换机docker0(既能当交换机也能做网卡)

[root@node-2 ~]# yum -y install bridge-utils  (安装bridge工具)

[root@node-2 ~]# brctl  show  (docker0模式是个nat桥,关联了两个接口veth3ea71e6 vethac331cd 另一端关联if4  if6反映的是容器内部网络

bridge name  bridge id        STP enabled   interfaces

docker0         8000.02425784b011      no          veth3ea71e6

                                                             vethac331cd

[root@node-2 ~]# ip link show

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000

    link/ether 00:0c:29:46:57:ae brd ff:ff:ff:ff:ff:ff

3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default

    link/ether 02:42:57:84:b0:11 brd ff:ff:ff:ff:ff:ff

5: veth3ea71e6@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default

    link/ether 7a:ea:5e:55:e2:0a brd ff:ff:ff:ff:ff:ff link-netnsid 0

7: vethac331cd@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default

link/ether 66:8c:58:63:bc:25 brd ff:ff:ff:ff:ff:ff link-netnsid 1

 

 

[root@node-2 ~]# iptables -t nat -vnL

Chain PREROUTING (policy ACCEPT 46 packets, 10600 bytes)

Chain POSTROUTING (policy ACCEPT 2454 packets, 150K bytes)

 pkts bytes target     prot opt in     out     source               destination        

 2454  150K KUBE-POSTROUTING  all  —  *      *       0.0.0.0/0            0.0.0.0/0            /* kubernetes postrouting rules */

    0     0 MASQUERADE  all  —  *      !docker0  172.17.0.0/16        0.0.0.0/0          

【任何接口进来,只要从docker0出去,源地址来自172.17.0.0/16 无论到达任何主机做MASQUERADE地址伪装,所以docker0桥默认是nat桥

Chain DOCKER (2 references)

 pkts bytes target     prot opt in     out     source               destination        

0     0 RETURN     all  —  docker0 *       0.0.0.0/0            0.0.0.0/0      

 

 

验证通信启动两个容器(其中一个nginx监听80),通过docker inspect查看ip地址分别为172.17.0.2和0.4

容器内部访问:

[root@node-2 ~]# docker exec -it  wlx1 /bin/sh

/ # wget -O  –  -q http://172.17.0.4    (-O将文件加载完后不保存在文件直接显示到 -当前)

<!DOCTYPE html>

<html>

<head>

<title>Welcome to nginx!</title>

Commercial support is available at

<a href="http://nginx.com/">nginx.com</a>.</p>

 

物理机访问

[root@node-2 ~]# curl 172.17.0.4

<!DOCTYPE html>

<html>

<head>

<title>Welcome to nginx!</title>

<style>

在任何一个docker主机上创建的容器,当使用默认的桥接网络时,只能额外添加一个dnat规则,以便于它可以被其他外部的客户端访问

 

假设运行两个容器tomcat和redis,这两个容器每个容器能看到自己的用户账号user,能有自己的文件系统mount,能有自己的pid 并且互不干扰,但是他们使用同一组网络拥有同一个网络协议栈拥有同一个主机名和域名,tomcat要访问redis数据则进行lo通信,因此通过127.0.0.1即可互相通信

Host

容器共享物理机(宿主机)网络名称空间,第一个容器直接使用物理机的网络名称空间,也就意味着第一个容器改网卡的所有信息是直接修改的物理机的,第二个容器可以使用桥接,因此第一个容器就拥有了管理物理网络的特权

None

如果要设定容器使用none网络意味着不使用网络,此种容器可能用来批处理数据计算等等不需要进行网络通讯的程序

四种网络模型:

Closed container:封闭式容器,l只有o接口

Bridged container: 桥接式容器 接到dcoker0桥上

Joined container:联盟式容器,user mount pid隔离,UTS,NET,IPC共享

Open container: 开放式容器,共享物理机网络

 

 

[root@node-2 ~]# docker network inspect bridge(查看网络模型的详细信息,inspect查看任何一个容器对象的详细信息)

[

    {

        "Name": "bridge",

        "Id": "cc774b597c21317a8334deb984bf67dbf66386f4d1b6939be6b638461353dc30",

        "Created": "2021-09-05T16:13:09.202847111+08:00",

        "Scope": "local"

 

[root@node-2 ~]# docker container inspect wlx1  (查看wlx1容器的详细信息等)

Next Post

Previous Post

Leave a Reply

© 2021 ~阿弥陀佛~

ICP备案号: 京ICP备19038630号

版权所有@ 王力翔

耗时 0.210 秒 | 查询 43 次 | 内存 22.42 MB