您好,欢迎来到锐游网。
搜索
您的当前位置:首页docker容器的网络模式详解

docker容器的网络模式详解

来源:锐游网

安装docker的时候,会自动安装三种基本网络(bridge, host, none)和自定义网络,自定义可选的模式有:bridge、overlay、macvlan。

查看docker网络

docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
c8e13f3559d5        bridge              bridge              local
b989be1c11f8        host                host                local
adef4743c68e        none                null                local

一、容器的四中网络模式
宿主机的网络

(1) Docker Daemon 利用 veth pair 技术,在宿主机上创建一对虚拟网络接口设备,假设为
veth0 和 veth1。它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。

(2) Docker Daemon 将 veth pair 的一端放在主机中,以 veth65f9 这样类似的名字命名,并将这个网络设备加入到docker0网桥中,可以通过brctl show命令查看。

(3) Docker Daemon 将另一端添加到 Docker Container 所属的 namespace 下,并被改名为 eth0。这样就实现宿主机到Docker Container 网络的联通性;同时,也保证 Docker Container 网络环境的隔离性。

bridge 桥接模式下的 Docker Container 在使用时,并非为开发者包办了一切。最明显的是,
该模式下 Docker Container 不具有一个公有 IP,即和宿主机的 eth0 不处于同一个网段。导致的结果是宿主机以外的世界不能直接和容器进行通信。虽然 NAT 模式经过中间处理实现了这一点,所以需要通过 -p 参数来绑定一个宿主机端口为之服务,但是 NAT 模式仍然存在问题与不便,如:容器均需要在宿主机上竞争端口,容器内部服务的访问者需要使用服务发现获知服务的外部端口等。另外 NAT 模式由于是在三层网络上的实现手段,故肯定会影响网络的传输效率。

docker run --name redis-bridge -p 6379:6379 --privileged=true -d redis:3.2 redis-server --appendonly yes

docker run --name redis-bridge2 -p 6380:6379 --privileged=true -d redis:3.2 redis-server --appendonly yes

yum install -y bridge-utils

查看容器的网络
docker inspect redis-bridge2

"Networks": {
    "bridge": {
        "IPAMConfig": null,
        "Links": null,
        "Aliases": null,
        "NetworkID": "a173910e9839f38e754a24b3f8d3ee1bd4e3358569b6a61720f6e4e2ad4f59f5",
        "EndpointID": "4178326c8d6f11408827b6c2adff885ae11eaadfcb448d87e11534e4731a27bd",
        "Gateway": "172.17.0.1",
        "IPAddress": "172.17.0.3",
        "IPPrefixLen": 16,
        "IPv6Gateway": "",
        "GlobalIPv6Address": "",
        "GlobalIPv6PrefixLen": 0,
        "MacAddress": "02:42:ac:11:00:03"
    }
}

docker inspect redis-bridge

"Networks": {
    "bridge": {
        "IPAMConfig": null,
        "Links": null,
        "Aliases": null,
        "NetworkID": "a173910e9839f38e754a24b3f8d3ee1bd4e3358569b6a61720f6e4e2ad4f59f5",
        "EndpointID": "7c36ecbfd29e7037bc6786c22d2ef5d5bfffe1870cf2cb56357e00571effef38",
        "Gateway": "172.17.0.1",
        "IPAddress": "172.17.0.2",
        "IPPrefixLen": 16,
        "IPv6Gateway": "",
        "GlobalIPv6Address": "",
        "GlobalIPv6PrefixLen": 0,
        "MacAddress": "02:42:ac:11:00:02"
    }
}

进入容器查看网络

docker run --name redis-host --network host --privileged=true -d redis:3.2 redis-server --appendonly yes

容器将不会虚拟出自己的网卡,配置自己的IP等,而是共享宿主机的IP和端口。这样,容器在网络层面就没有隔离性,使用 127.0.0.1 + 端口 可以访问宿主机和容器,此种模式和直接在宿主机上安装服务效果是一样的,但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
运行容器的时候加上 --network host,此种模式下 -p 参数将失效,因为容器直接使用宿主机的端口。
进入容器 ip addr 发现和主机一样。

3、container

Docker Container 的 other container 网络模式,可以用来更好的服务于容器间的通信。
在这种模式下的 Docker Container 可以通过 localhost 来访问 namespace 下的其他容器,传输效率较高。虽然多个容器共享网络环境,但是多个容器形成的整体依然与宿主机以及其他容器形成网络隔离。另外,这种模式还节约了一定数量的网络资源。但是需要注意的是,它并没有改善容器与宿主机以外世界通信的情况。
创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。

docker run --name redis-cont --network container:nginx --privileged=true -d redis:3.2 redis-server --appendonly yes

指定当前容器的网络空间 --network container:xxxxx ,使用同一个网络空间的容器构成一个整体,他们相互之间可以通过 127.0.0.1 来通讯。

xxxxx 容器既可以是bridge模式,也可以是host,如果是host的话,那么新容器就等同于以host模式创建的。

4、none
网络环境为 none,即不为 Docker Container 任何的网络环境。一旦 Docker Container 采用了none 网络模式,那么容器内部就只能使用 loopback 网络设备,不会再有其他的网络资源。
可以说 none 模式为 Docker Container 做了极少的网络设定,但是俗话说得好“少即是多”,在没有网络配置的情况下,作为 Docker 开发者,才能在这基础做其他无限多可能的网络定制开发。这也恰巧体现了 Docker 设计理念的开放。

在 none 网络模式下分配固定 ip:
netns 是在 linux 中提供网络虚拟化的一个项目,使用 netns 网络空间虚拟化可以在本地虚拟
化出多个网络环境,目前 netns 在 lxc 容器中被用来为容器提供网络。使用 netns 创建的网络空间独立于当前系统的网络空间,其中的网络设备以及 iptables 规则等都是独立的,就好像进入了另外一个网络一样。

docker run -it --name vm5 --network none nginx

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- ryyc.cn 版权所有 湘ICP备2023022495号-3

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务