Docker学习:容器五种(3+2)网络模式 | bridge模式 | host模式 | none模式 | container 模式 | 自定义网络模式详解

前言

本讲是从Docker系列讲解课程,单独抽离出来的一个小节,重点介绍容器网络模式, 属于了解范畴,充分了容器的网络模式,更有助于更好的理解Docker的容器之间的访问逻辑

疑问:为什么要了解容器的网络模式?

首先,容器之间虽然不是物理隔离,但是它们彼此之间默认是不互联互通的,这也有助于保持每个容器的纯粹性,相互之间互不影响

其次,既然使用了容器,通常情况下,容器需要与宿主机通信,或者A容器与B容器通信而B不需要知道A的存在,或者A/B两容器相互通信。

从而,就引出了本节内容,他们相互通信,就绕不开容器的网络模式

概述

1.容器通信模式分类

模式名称 简介 备注

bridge

容器拥有独属于自己的虚拟网卡和和虚拟IP等网络资源,它们分别通过docker0虚拟网卡与宿主机的eth0网卡交互,进而和外界网络交互 默认模式
host 容器没有自己的任何独立的网络资源(比如:容器的IP、网卡和端口),完全和宿主机共享网络空间 弊端:同一个端口只能同时被一个容器服务绑定
none 该模式关闭了容器的网络功能,仅有独自的网络空间(一个空架子),并且该模式不会给容器分配任何网络资源,包括虚拟网卡、路由、防火墙、IP、网关、端口等

光秃秃的一个容器,没有任何的网络资源,就是自娱自乐的光杆司令(很少用)

container 它是bridge和host模式的合体,优先以bridge方式启动启动第一个容器,后面的所有容器启动时,均指定网络模式为container,它们均共享第一个容器的网络资源,除了网络资源,其他资源,容器彼此之间依然是相互隔离的 第一个以bridge方式启动的容器服务挂掉,后面依赖它的容器,都暂停服务
自定义 该模式也更为灵活,可以通过-d 指定自定义的网络模式的类型,可以是bridge或者overlay,其中overlay功能更为强大,可以指定多个subnet子网网段。 该模式,在容器之间可以使用别名相互通信,这一点很nice(重要)

docker0虚拟网卡科普:

当docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,宿主机上以Bridge模式启动的容器会链接到这个虚拟网桥上。docker0默认地址172.17.0.0/16。虚拟网桥的工作方式和物理交换机类似,这样宿主机上的所有容器就通过docker0连在一个二层网络中,再通过docker0和物理网卡eth0交互(我本机的物理网卡名字是ens33)。

Docker 安装以后,会默认创建三种网络,可以通过 docker network ls 查看。

[root@centOS7 ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
fad4a56fe429   bridge    bridge    local
2ec1ca3d2105   host      host      local
17d14a812fce   none      null      local

预告:剩余的两种需要手动定义,再通过docker network ls命令查看才会展现出来!

2.网络模式的使用方式

docker run 后面添加 --net参数即可。

示例:--net=bridge、  --net=host 、--net=container、--net=none

3.ip a 默认的网卡资源信息 

查看目的对以下两个网卡混个脸熟

ens33是宿主机的物理网卡,大部分电脑是eth0

docker0,它是docker的虚拟网卡,桥接模式下,内部容器都会把信息汇总给docker0网卡,由它再转发给eth0,来和外界交互。

ip addr #或者ip a 都可以查看所有的网络资源


下面一起深入探讨一下各模式的使用方式吧!


一、bridge桥接网络模式

docker run默认模式,最为常用。所以 --stat=bridge 可以省略不写。

特点:

1.默认为每个容器分配单独的网络空间,彼此相互隔离。
2.每个容器都单独的网卡、路由、IP等一些列基本的网络设施。
3.每个容器启动后,都会被分配一个独立的虚拟IP。
4.该模式会自动,将宿主机上的所有容器,都链接到 #ip a 看到的docker0的虚拟网卡上。 
5.外界主机不能直接访问宿主机内的容器服务,需要宿主机通过-p做端口映射后访问宿主的映射端口。

1.准备工作,启动nginx前查看宿主机桥接模式网关、80端口占用情况

1)docker inspect bridge 总览桥接模式下的网关子网网段

docker inspect bridge    #查看桥接网络模式docker0虚拟网卡的详细信息(子网网段、网关等)

注意:下图中查看的网关信息,是bridge模式下的网关信息,可以看到桥接模式的网关和IP,docker0是桥接模式下,所有容器交互通信的交通枢纽。

稍后会查看host模式下的网关信息,里面都是空的

2)开启nginx前,先查看宿主机80端口占用情况

查看目的,可以得知,在桥接模式下,容器自始至终使用的都是容器自身虚拟网卡和虚拟IP,并不会占用宿主机的(80)端口和IP。

桥接模式实验结束后,会再次查看宿主机的80端口有没被占用(实际情况下,不会被占用的)

docker ps -a  #实验前,查看是否有启动的容器,如果有暂时先停掉,特别是nginx容器
netstat -nalpt #实验前,先查看宿主机的(80)端口占用情况

2.通过启动nginx容器服务深入了解bridge模式

1)以桥接模式启动nginx容器

docker images  #查看镜像列表
docker run -d --name nginx_V1 nginx:alpine  #默认就是桥接,不用--net单独指定bridge
docker ps   #查看已启动的容器

2)查看桥接模式下,nginx容器的网络资源分配情况

ip a ,目的:可以看到系统给nginx容器服务单独分配了一个虚拟网卡veth****

注意:在桥接模式下,每个容器启动后,都会被分配一个独属于容器自己的虚拟网卡和虚拟IP。

ip a  #发现多了一个虚拟网卡:vetha7cac49@if44

下面再通过:docker inspect  nginx_v1 命令查看桥接模式下,容器的网络配置详细信息

docker ps 
docker inspect nginx_v1 #通过nginx容器别名查看容器的详细信息,可以看到容器的网关和IP 172.17.0.2

可以看到独立的IP、Port、GateWay、Mac等资源。

3)宿主机下,curl nginx容器IP,可以正常访问

curl 172.17.0.2  #桥接模式下,系统自动为nginx容器分配的虚拟IP

4)开启新窗口,进入同一宿主机其他Tomcat容器内部curl nginx容器IP

可以发现,宿主机内的其他容器,依然可以访问nginx容器服务

docker run -it -p 8080:8080 tomcat:8.5.46-jdk8-openjdk /bin/bash  # 进入其他容器内部
curl 172.17.0.2  #在Tomcat容器中,访问nginx容器

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值