docker四种网络模式

介绍

docker相当于虚拟机软件 Vmware 或 VirtualBox,是有网络模式,并且安装虚拟网卡

docker虚拟网卡

查看宿主机的ip:

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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether fa:16:3e:83:56:13 brd ff:ff:ff:ff:ff:ff
    inet 192.168.16.4/20 brd 192.168.31.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe83:5613/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:22:ab:7b:ff brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:22ff:feab:7bff/64 scope link 
       valid_lft forever preferred_lft forever

上面的 3: docker0:就是虚拟网卡,ip是172.17.0.1

docker 网络模式

同样,docker中也有网络模式,共4种:

  • bridge模式,不写参数 或 使用--net=bridge指定,默认设置。

  • host模式,使用--net=host指定。

  • container模式,使用--net=container:NAME_or_ID指定。

  • none模式,使用--net=none指定。

查看docker网络

查看docker安装了哪些网络

docker network ls

执行结果如下:

NETWORK ID          NAME                DRIVER              SCOPE
2b55b4d8cb35        bridge              bridge              local
de8e17860cc8        host                host                local
c25c6222ce03        none                null                local

有3种网络

查看某网络的详细信息

docker network inspect  【NETWORK ID 或 NAME】

例子:

docker network inspect bridge

执行结果如下:

[
    {
        "Name": "bridge",
        "Id": "2b55b4d8cb353bd6c5784e12fbe58d7ecd0f8018964a2fd22e8d7e579f08d565",
        "Created": "2020-07-16T00:24:20.88312208+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "1c1be00c22ed26e1fd89a58778e4d39896cf68020a4ddd822b7d337286ced3b5": {
                "Name": "mysql5.7_test",
                "EndpointID": "dcde2d7b5c9fc6415797f81a6730369980550f4252dcd98efd0b5411ce2213fb",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            },
            "7f426fce9213911c851edb74494ab2a3e77c67a01d889c4f66969fc9fa7f4013": {
                "Name": "redis6.0_test3",
                "EndpointID": "ccbdb31af8f70ff94305e06c6be17d7d970cb7696822265b64c256ba9aad8573",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            },
            "92de4401b2997fc8e3c36068b7c08c95d30b1cdffb66aa27c9412e9e35453634": {
                "Name": "tomcat_test",
                "EndpointID": "a2a3305d6589fd452b34e31f9d3c8a012b29ff7657628015ba44f17d7f2af4b6",
                "MacAddress": "02:42:ac:11:00:04",
                "IPv4Address": "172.17.0.4/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

其中在 Containers 部分列出有哪些容器使用了该网络

查看容器的网络模式

https://www.malaoshi.top/show_1EF5kAX8OlBQ.html

bridge模式

默认模式

当docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机(路由器)类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。

类似于Vmware的nat网络模式。同一个宿主机上的所有容器会在同一个网段下,相互之间是可以通信的。

原理

在主机上创建一对虚拟网卡 veth pair 设备,Docker将 veth pair 设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。

验证原理

确定启动上面的tomcat容器后,查看该容器的ip:

docker exec -it tomcat_test 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
582: eth0@if583: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

注意: 上面的 582: eth0@if583:,ip是172.17.0.4


查看宿主机的ip:

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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether fa:16:3e:83:56:13 brd ff:ff:ff:ff:ff:ff
    inet 192.168.16.4/20 brd 192.168.31.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe83:5613/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:22:ab:7b:ff brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:22ff:feab:7bff/64 scope link 
       valid_lft forever preferred_lft forever
583: veth289a0d8@if582: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 82:f5:62:6e:70:be brd ff:ff:ff:ff:ff:ff link-netnsid 2
    inet6 fe80::80f5:62ff:fe6e:70be/64 scope link 
       valid_lft forever preferred_lft forever

注意: 583: veth289a0d8@if582:与容器的网络相对应,这就是 veth pair

优缺点

  • 网络的隔离性好
  • 一个镜像创建多个容器时,通过-p参数映射端口,容器本身不需要修改端口
  • 有些情况性能较差,如:nginx在大并发压力测试时
  • 有些服务不能使用这种模式

host模式

容器 和 宿主机 共用一个Network Namespace,使用宿主机的IP和端口,可以直接与外界通信

容器将不会虚拟出自己的网卡,配置自己的IP等,在容器内看到的网卡ip是宿主机上的ip,不需要进行NAT

除了网络方面,其他的如文件系统、进程列表等还是隔离的

优缺点

  • 网络性能好,nginx docker推荐使用该网络模式

  • 网络的隔离性不好,一个容器使用宿主机的某个端口后,该端口的其他容器无法创建,也无法运行

测试

  1. 先停掉容器所有容器
    docker stop $(docker ps -q)

  2. 启动第一个容器,网络为host模式
    docker run -d --net="host" tomcat

    1. 启动第一个容器,网络为host模式
      docker run -d --net="host" tomcat
  3. 查看启动的容器:docker ps 发现只有第一个容器启动了

  4. 查看所有容器:docker ps -a ,发现第二个停掉了

  5. 查看第二个容器的日志:docker logs 第二个的id,显示如下:8080端口被占用

container模式

多个容器使用共同的网络,看到的ip是一样的。

指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。

除了网络方面,其他的如文件系统、进程列表等还是隔离的

none模式

不配置任何网络。

这个模式和前两个不同。在这种模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。

应用场景:

  • 不需要网络的容器
  • 要求安全的容器

感谢:
https://www.jianshu.com/p/22a7032bb7bd


原文出处:/show_1EF5pznxyOzl.html