Linux docker的网络隔离方案和网络模式的使用问题
docker的网络管理比较复杂,是由于它的网络是基于Linux内核的namespace开始。
docker刚安装完毕后,最开始的docker网络模式只有三种,如下:
#查看Docker默认的三种网络
root@centos6:~$ docker network ls
NETWORK ID NAME DRIVER SCOPE
7f6b9cbd3eec bridge bridge local
0cb106f52e66 host host local
cfb50541161b none null local
network ID 是系统随机分配的,不必过于关注,name是可以自定义的,driver,也就是驱动类型,比较常用的有
bridge,host,null,macvlan。此时的宿主机上应该会有两个虚拟网卡,名称为 docker0和vetha98e3a4,这个vetha98e3a4名字不是固定的,也是随机的。如果不指定网络模式启动一个镜像,那么,镜像使用的IP会为172.17.0.2,快速查询容器使用的IP:
docker inspect -f '{{ .NetworkSettings.Networks.容器所使用的网络名称}}' 容器ID
容器所使用的网络名称指的是 运行容器时所指定的网络模式所对应的网络名称,如果启动容器时没有指定,默认使用的是bridge这个网络名称,也就是上面 docker network ls 命令所查询的 name 中的 bridge。
前面也说了 ,可以自定义网络驱动,如何自定义?
docker network create -d bridge --subnet=172.19.0.0/24 --gateway=172.19.0.1 mynet 这样就自定义了一个驱动为bridge的名称为mynet的,网段为172.19.0.0,网关为172.19.0.1的网络模式。(不能设定为宿主机的网段,别的网段任意指定,不过通常还是使用172.x.0.0网段)
在执行之前的查询网络命令:docker network ls
NETWORK ID NAME DRIVER SCOPE
aa0502db03d3 bridge bridge local
14950d3c5ac1 host host local
53e6c0e615ab mynet bridge local
e65fc7e1ed66 none null local
为什么说是网络模式呢? 如果运行容器的时候指定了 网络模式为 mynet这个,那么 所有使用该网络模式启动的容器都是同一个网络段。这样就达到了容器之间的网络隔离。(由于是桥接到了宿主机,因此只能和宿主机通信,无法和宿主机以往的主机通信)
那么,现在启动一个容器,指定使用mynet网络模式:
[root@centos7 first]# docker run --net mynet -itd --name mycentos1 centos
69a45a00631834206ead0df18dc685c3fff93fedc7d29850cfdae8f717ea9b4a
[root@centos7 first]# docker exec -it 69a45 /bin/bash
[root@69a45a006318 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
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
11: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:13:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.19.0.2/16 brd 172.19.255.255 scope global eth0
valid_lft forever preferred_lft forever
可以发现,指定了网络模式为自定义的mynet(使用的驱动是bridge)后,新启动的容器名称为mycentos2的
网络段为172.19.0.0/16了。在启动一个容器呢?
[root@centos7 first]# docker run --net mynet -itd --name mycentos2 centos
d7bc415cd8e8283c90ed4c07c512ba740b7130b7aa2fb414db1cb4df4bff1ca8
[root@centos7 first]# docker exec -it d7bc4 /bin/bash
[root@d7bc415cd8e8 /]# ifconfig
bash: ifconfig: command not found
[root@d7bc415cd8e8 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
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
13: eth0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:13:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.19.0.3/16 brd 172.19.255.255 scope global eth0
valid_lft forever preferred_lft forever
使用默认的网络模式启动一个新的容器呢?
[root@centos7 first]# docker run -itd --name mycentos3 centos
e2c92188cb1eaf0f83c414576b6507d66ad6c62831858ac5f23188097a59fb04
[root@centos7 first]# docker exec -it e2c92 /bin/bash
[root@e2c92188cb1e /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
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
15: eth0@if16: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
这时候的容器名称为mycentos3的IP为172.17.0.3. 总结一下:
mycentos1 的IP为172.19.0.2,使用的为mynet网络模式。容器内使用的虚拟网卡为 eth0@if12
mycentos2 的IP为172.19.0.3 使用的为mynet网络模式。容器内使用的虚拟网卡为 eth0@if14
mycentos2 的IP为172.17.0.3 使用的为默认的bridge模式。容器内使用的虚拟网卡为 eth0@if16
可以得出一个结论,容器内使用的网卡形式为eth0,后面接编号以区分不同的容器网络,主要是使用的IP是从172.17.0.2开始,下一个网络模式就使用172.17.0.2开始,通过自定义网络模式,在启动容器的时候指定使用哪个网络模式从而将需要一个网段的容器启动到一起,这样就人为的达到了容器之间的网络隔离。(毫无疑问,172.17.0.0网段 是不能和172.17.0.0网段通信的)
===============================================================================================
macvlan模式的建立:
需要真实的宿主机的子网网段,宿主机的网关,宿主机的网卡名称
[root@centos7 first]# docker network create -d macvlan --subnet=192.168.0.0/24 --gateway=192.168.0.1 -o parent=ens33 myvlan
a9ebbb73eedabcc7f6b02c5b7456195366fceec4775dcf249e181c243bc1ac26
[root@centos7 first]# docker network ls
NETWORK ID NAME DRIVER SCOPE
aa0502db03d3 bridge bridge local
14950d3c5ac1 host host local
53e6c0e615ab mynet bridge local
a9ebbb73eeda myvlan macvlan local
e65fc7e1ed66 none null local
macvlan模式的使用:
root@centos7 first]# docker run -itd --net myvlan --name ^Ccentos4 centos
[root@centos7 first]#
[root@centos7 first]# docker run -itd --net myvlan --name mycentos4 centos
31dbed41e48417f3a6e5cc002fb3d86f0f788a4a8e76fc2b50d6932548de312c
[root@centos7 first]# docker exec -it 31dbe /bin/bash
[root@31dbed41e484 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
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
20: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
link/ether 02:42:c0:a8:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.0.2/24 brd 192.168.0.255 scope global eth0
valid_lft forever preferred_lft forever
容器和宿主机在一个网段了,相当于一个真实的仿真的虚拟机了。
=========================================================================
docker run -itd --name mycentos5 --net=none centos
#已无网络模式启动一个容器,那么这个容器没有网络连接。彻底的隔离了。
标签:容器,00,网络,ff,Linux,docker,root From: https://blog.51cto.com/u_15966109/6082659