主页

索引

模块索引

搜索页面

常用

网络基础

https://img.zhaoweiguo.com/knowledge/images/dockers/net_osi.png

Docker 四种网络模式:

1. 默认网络模式 - bridge, --net=bridge(默认)
2. 无网络模式 - none, --net=host
3. 宿主网络模式 - host, --net=none
4. 自定义网络, docker 1.9版本以后新增的特性
5. 其他容器模式(即container模式,join模式),--net=container:NAME_or_ID

一. 默认网络模式 - bridge

首先来侃一侃docker0. 之所以说它是默认的网络,是由于当我们运行container的时候没有“显示”的指定网络时,我们的运行起来的container都会加入到这个“默认” docker0 网络。他的模式是bridge。

https://img.zhaoweiguo.com/knowledge/images/dockers/net_bridge.png

说明

如下图所示为Docker中 bridge 驱动模式的示意图,其中蓝色的模块表示主机上的网卡
当Docker启动时会自动在主机上创建一个虚拟网桥 docker0 ,
    使用默认网络模式创建docker容器时会自动创建一对儿 veth pair 接口,
        一端连接在docker容器中(如图容器中的 eth0 ),
        一端连接在虚拟网桥 docker0 上(如图 veth )
这种 veth pair 是一种虚拟网络设备,主要用于不同namespace中(意味着网络隔离)的网络通信,它总是成对存在的
    在这里可以把它想象成一对儿靠虚拟网线连接起来的两个虚拟网卡
        一端连接着docker容器,一端连接着虚拟网桥 docker0 。

通过这种方式,不同docker容器之间可以通过ip地址互相通信
    也可以通过虚拟网桥访问主机上的网络 eth0
    (添加iptables规则,将docker容器对目标地址发出的访问通过地址伪装 的方式修改为主机对目标地址进行访问)

如果想要外界网络访问docker容器时,需要在docker容器启动时加上参数'-p [主机端口]:[容器端口]'进行端口映射
原理也是通过修改iptables规则将访问[主机端口]的数据转发到docker容器的[容器端口]中
但是这种做法也存在着占用主机有限的端口资源的缺点。

安装Docker时,它会自动创建三个网络:

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
557d70cd18ab        bridge              bridge              local
27015fb1d01c        host                host                local
d7bdd36df894        none                null                local

除非您使用该docker run –network=<NETWORK>选项另行指定,否则Docker守护程序默认情况下将容器连接到此网络。您可以使用主机上的ifconfig命令将此桥接器视为主机网络堆栈的一部分:

$ ifconfig
docker0   Link encap:Ethernet  HWaddr 02:42:47:bc:3a:eb
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:47ff:febc:3aeb/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:9001  Metric:1
          RX packets:17 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:1100 (1.1 KB)  TX bytes:648 (648.0 B)

默认的名为bridge的网络是有很多限制的,为此,我们可以自行创建bridge类型的网络。默认的bridge网络与自建bridge网络有以下区别:

端口不会自行发布,必须使用-p参数才能为外界访问
    而使用自建的bridge网络时,container的端口可直接被相同网络下的其他container访问
container之间的如果需要通过名字访问,需要`--link`参数,
    而如果使用自建的bridge网络,container之间可以通过名字互访
    注: 不建议采用这种方法

二. 无网络模式 - none

顾名思义,所有加入到这个网络模式中的container,都”不能”进行网络通信。

三. 宿主网络模式 - host

https://img.zhaoweiguo.com/knowledge/images/dockers/net_host.png
  • 直接使用宿主机的网络,端口也使用宿主机的

  • 这种网络模式将container与宿主机的网络相连通,虽然很直接,但是却破获了container的隔离性

  • 该模型仅适用于Docker17.6及以上版本

四. 自定义网络

docker 允许我们创建3种类型的自定义网络,bridge,overlay,MACVLAN:

bridge:Bridge模式是Docker默认的网络模式
    当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,用来连接宿主机和容器
    此主机上的Docker容器都会连接到这个虚拟网桥上
overlay:当有多个docker主机时,跨主机的container通信
    可以连接多个docker守护进程或者满足集群服务之间的通信;适用于不同宿主机上的docker容器之间的通信
macvlan:每个container都有一个虚拟的MAC地址
    可以为docker容器分配MAC地址,使其像真实的物理机一样运行
plugins :使用第三方网络驱动插件;

五. 其他容器(container)模式

https://img.zhaoweiguo.com/knowledge/images/dockers/net_container.png

主页

索引

模块索引

搜索页面