docker 网络

一、网卡

docker 网络

1、网卡:计算机进行通信的硬件支撑,有唯一的mac地址,

2、查看网卡信息

a、ip link show

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 44:1e:a1:4f:52:60 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 44:1e:a1:4f:52:62 brd ff:ff:ff:ff:ff:ff
4: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 44:1e:a1:4f:52:ac brd ff:ff:ff:ff:ff:ff
5: eth3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 44:1e:a1:4f:52:ae brd ff:ff:ff:ff:ff:ff
6: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN 
    link/ether 44:1e:a1:4f:52:60 brd ff:ff:ff:ff:ff:ff

b、ls /sys/class/net/   以文件的方式存在centos中

br0  eth0  eth1  eth2  eth3  lo

c、ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 44:1e:a1:4f:52:60 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::461e:a1ff:fe4f:5260/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 44:1e:a1:4f:52:62 brd ff:ff:ff:ff:ff:ff
4: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 44:1e:a1:4f:52:ac brd ff:ff:ff:ff:ff:ff
5: eth3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 44:1e:a1:4f:52:ae brd ff:ff:ff:ff:ff:ff
6: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN 
    link/ether 44:1e:a1:4f:52:6f brd ff:ff:ff:ff:ff:ff---------------->mac地址
    inet 192.168.171.18/24 brd 192.168.171.255 scope global br0------------>ip地址
    inet6 fe80::461e:a1ff:fe4f:5260/64 scope link 
       valid_lft forever preferred_lft forever

3、修改网卡信息

cd /etc/sysconfig/network-scripts---->cat ifcfg-eth0--->配置如下

    DEVICE=eth0------------------------->网卡的名字
    BOOTPROTO=none------------------------->协议
    NM_CONTROLLED=no
    ONBOOT=yes------------------------->开机是否启动
    TYPE=Ethernet------------------------->类型
    BRIDGE="br0"
    IPADDR=192.168.171.17
    NETMASK=255.255.255.0------------------------->子网掩码
    GATEWAY=192.168.171.254
    USERCTL=no

4、给网卡添加ip地址,和外界进行通信

可以修改文件,也可以用命令:ip addr add 192.168.0.100/24 dev eth0

5、将网卡中的ip删除:ip addr delete 192.168.0.100/24 dev eth0

6、网卡的状态

开启:ifup eth0

关闭:ifdown eth0

 

二、网卡隔离分类

1、网卡在centos中通过namespace隔离

2、创建network-namespace

ip netns add ns1------->创建名为“ns1”的network-namespace

ip netns list------>查看有哪些namespace

ip netns exec ns1 ip a---->查看namespace中的网卡信息,默认有本地的网卡信息

ip netns exec ns1 ip link show

ip netns exec ns1 ifup lo----->启动namespace中的网卡

 

三、不同namespace中的网卡进行通信

1、veth pair技术(Virtual Ethernet Pair)成对出现----->同时创建出两个网卡,这连个网卡默认是可以连通的。本别将网卡给ns1和ns2。

docker 网络

2、模拟

1、ip link add veth-ns1 type veth peer name veth-ns2    检查ip link show多了两个网卡:[email protected]  [email protected]

2、ip link set veth-ns1 netns ns1---------->将网卡[email protected]派给ns1

3、ip link set veth-ns1 netns ns1---------->将网卡[email protected]派给ns2

再查看ip link show发现veth-ns1 和 veth-ns2已经没有了

4、ip netns exec ns1 ip addr add 192.168.0.100/24 dev veth-ns1----->给网卡添加ip地址

5、ip netns exec ns1 ip link set veth-ns1 up----->开启网卡

6、ip netns exec ns1 ip addr add 192.168.0.101/24 dev veth-ns2----->给网卡添加ip地址

7、ip netns exec ns1 ip link set veth-ns2 up----->开启网卡

8、ip netns exec ns1 ping 192.168.0.101-------->通过ping测试网卡的连通性

      ip netns exec ns2 ping 192.168.0.100-------->通过ping测试网卡的连通性

注:一个docker容器就相当于一个network-namespace

 

四、通过image启动两个tomcat-container

1、网卡分别为:[email protected][email protected]:中间差一个22

2、装完docker后,ip a中会有docker0网卡

3、装完docker后,docker相当于一个namespace。其他的container都与docker成对的出现namespace以及成对的网卡

docker 网络

4、验证

yum install bridge-utils

brctl show

 

五、dcoker中的网络

注:创建docker时,默认会创建docker0网卡,docker0属于bridge类型的网络(网络名也叫bridge)

1、docker network ls---->chakna y

bridge host  null  tomcat-net(自定义的网络)

2、docker0属于bridge类型

3、docker network inspect bridge   可以看到docker0网卡连到了docker中的哪些container

4、docker network create tomcat-net----->创建网络名为“tomcat-net”,默认就是bridge类型的

      查看该网络:docker network inspect tomcat-net

5、创建容器时,可以指定网络,如果不指定,默认就是docker0,容器的网段就与docker0的网段一样

创建容器:docker run -d --name custom-net-tomcat --network tomcat-net  tomcat  ,则tomcat容器就与tomcat-net一个网段

查看容器网络:docker exec -it tomcat-net ip a

docker 网络

6、将container加入到自定义的tomcat-net网络中

docker network connect tomcat-net tomcat01--->将tomcat01容器添加到tomcat-net网络

查看tomcat01的网络:docker network inspect tomcat-net  、docker network inspect tomcat01----->发现tomcat01会有两个网络

docker 网络

7、通过容器名ping通,而不是ip地址

例:docker exec -it tomcat01 ping 171.17.0.3   &&   docker exec -it tomcat01 ping tomcat02

a、自建一个网络:docker network create tomcat-net

b、创建容器时使用该网络:docker run -d --name tomcat01 --network tomcat-net  tomcat、

docker run -d --name tomcat02 --network tomcat-net  tomcat

c、docker exec -it tomcat01 ping tomcat02 可以通 。原因:可以增加一条dns记录

或者

a、创建tomcat01时link到tomcat02:docker run -d --name tomcat01 --link tomcat02 tomcat

b、docker exec -it tomcat01 ping tomcat02 可以通

总结:link很少用,更提倡使用自定义的bridge类型的网络。即可通过容器名去访问

8、端口映射

docker run -d --name tomcat01 -p 8081:8080 tomcat

访问时通过:宿主机ip:8081 或  tomcat-container的ip:8080

9、采用host网络

docker run -d --name tomcat01 --network host  tomcat----->则tomcat-container网络与宿主机的网络是一样的

查看:docker exec -it tomcat01 ip a

10、两台机器中的container进行通信

vx|an---->结果多机通信的问题,底层的一个技术是overlay