2022版Docker高级篇 - 4、Docker网络

连接视频


Docker网络

是什么

docker不启动,默认网络情况

先停止docker服务

systemctl stop docker
systemctl stop docker.socket
在这里插入图片描述

先在linux终端中,输入ifconfig命令,在windows终端中,输入ipconfig命令查看网络情况

ifconfig【linux】
在这里插入图片描述
ipconfig【windows】
在这里插入图片描述

ens33 中的192.168.37.132linux宿主机的地址;

lo:表示本地回环链路,为127.0.0.1

virbr0:表示虚拟网桥,在CentOS7的安装过程中如果有选择相关虚拟化的的服务安装系统后,启动网卡时会发现有一个以网桥连接的私网地址的virbr0网卡(virbr0网卡:它还有一个固定的默认IP地址192.168.122.1),是做虚拟机网桥的使用的,其作用是为连接其上的虚机网卡提供 NAT访问外网的功能。

docker启动后,网络情况

systemctl start docker
docker启动后,会产生一个名为docker0的虚拟网桥
在这里插入图片描述

查看docker网络模式命令

常用基本命令

查看所有命令

通过docker network --help查看所有命令

docker network --help
在这里插入图片描述

查看网络

docker network ls
在这里插入图片描述

添加一个网络:

docker network create aa_network
docker network ls
在这里插入图片描述
docker network rm aa_network【删除】
在这里插入图片描述

如上图所示,创建docker后,有三大网络模式,分别为bridgehostnone。主要用到的是bridgehost

查看网络源数据

docker network inspect XXX网络名字

docker network inspect bridge
在这里插入图片描述


能干嘛

  • 容器间的互联和通信以及端口映射
  • 容器IP变动时候可以通过服务名直接网络通信而不受到影响

在这里插入图片描述


网络模式

docker的网络模式一共5种,除了上面介绍的bridgehostnone,还有container模式和自定义模式

总体介绍

网络模式介绍
bridge为每个一个容器分配、设置 IP 等,并将容器连接到一个 docker0虚拟网桥,默认为该模式
host容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口
none容器有独立的 Network namespace,但并没有对其进行任何进行网络设置,如分配 veth pair 和网桥连接,IP 等
container新创建的容器不会创建自己的网卡和配置自己的 IP,而是和一个指定的容器共享 IP、端口号范围等

bridge模式:使用--network bridge指定,默认使用docker0
host模式:使用--network host指定
none模式:使用--network none指定
container模式:使用--network container:NAME或者容器ID指定

容器实例内默认网络IP生产规则

说明
  1. 先启动两个ubuntu容器实例

docker run -it -d --name u1 ubuntu bash
docker run -it -d --name u2 ubuntu bash
在这里插入图片描述

  1. docker inspect 容器ID or 容器名字

docker inspect u1 | tail -n 20
在这里插入图片描述

得到如下的结果:

从上面可以看出,u1容器的网络模式为bridge,网关为172.17.0.1ip地址为172.17.0.2

同样的,使用docker inspect u2 | tail -n 20命令查看容器u2

docker inspect u2 | tail -n 20
在这里插入图片描述

从上面可以看出,u2容器的网络模式为bridge,网关为172.17.0.1ip地址为172.17.0.3

  1. 关闭u2实例,新建u3,查看ip变化

docker rm -f u2
docker run -it -d --name u3 ubuntu /bin/bash
在这里插入图片描述
在这里插入图片描述

再次查看u3ip地址

docker inspect u3 | tail -n 20
在这里插入图片描述

结果如下:

可以看出,u3ip和之前u2ip是一样的。如果ip写死的话,如果u2突然宕机,则u3ip地址变成了和u2一样,则本该调用u2容器,结果调用了u3,直接导致了容器调用出错,服务内容产生变更。

结论

docker容器内部的ip是有可能会发生改变的

所以要进行网络的设计和规划

案例说明

docker network inspect bridge在这里插入图片描述
在这里插入图片描述
docker network inspect host
在这里插入图片描述
docker network inspect none
在这里插入图片描述
docker network inspect bb_network
在这里插入图片描述

1.bridge
bridge是什么

Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信。

查看 bridge 网络的详情信息,并通过 grep 获取名称项

docker network inspect bridge | grep name
在这里插入图片描述
ifconfig | grep docker
在这里插入图片描述

案例
说明

1Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。

2docker run 的时候,没有指定network的话默认使用的网桥模式就是bridge,使用的就是docker0。在宿主机ifconfig,就可以看到docker0和自己createnetwork(后面讲)eth0,eth1,eth2……代表网卡一,网卡二,网卡三……,lo代表127.0.0.1,即localhostinet addr用来表示网卡的IP地址

3、网桥docker0创建一对对等虚拟设备接口一个叫veth,另一个叫eth0,成对匹配。

3.1、整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair);

3.2、每个容器实例内部也有一块网卡,每个接口叫eth0

3.2.、docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。

通过上述,将宿主机上的所有容器都连接到这个内部网络上,两个容器在同一个网络下,会从这个网关下各自拿到分配的ip,此时两个容器的网络是互通的。

在这里插入图片描述

代码

使用如下的代码开启两个tomcat容器实例

docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8
在这里插入图片描述

两两匹配验证

首先在宿主机上执行 ip addr,得到如下的结果

ip addr
在这里插入图片描述

可以看出2122匹配,2324匹配。

接下来进入tomcat81容器内,执行ip add,得到如下的结果

docker exec -it tomcat81 bash
ip addr
在这里插入图片描述

下面看出,在容器tomcat82内,23匹配了24

docker exec -it tomcat82 bash
ip addr
在这里插入图片描述

总结:

从上图可以看出,两两匹配,互互相通。

2. host
host是什么

直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行NAT 转换。

案例
说明

容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口

在这里插入图片描述

代码

警告:

执行如下的代码会发出下图的警告

docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8
在这里插入图片描述
在这里插入图片描述

问题
docker启动时总是遇见标题中的警告

原因
docker启动时指定--network=host-net=host,如果还指定了-p映射端口,那这个时候就会有此警告
并且通过-p设置的参数将不会起到任何作用,端口号会以主机端口号为主,重复时则递增。

解决:
解决的办法就是使用docker的其他网络模式,例如--network=bridge,这样就可以解决问题,或者直接无视

在这里插入图片描述

正确:

执行docker run 命令的时候不加-p这个参数,就不会报警告

docker run -d --network host --name tomcat83 billygoo/tomcat8-jdk8
在这里插入图片描述
docker inspect tomcat83 | tail -n 20
在这里插入图片描述

无之前的配对显示了,看容器实例内部

docker exec -it tomcat83 bash
ip addr
在这里插入图片描述
在这里插入图片描述
和宿主机访问的信息一模一样

没有设置-p的端口映射了,如何访问启动的tomcat83??

在浏览器中输入如下命令即可:

http://宿主机IP:8080/
在这里插入图片描述

CentOS里面用默认的火狐浏览器访问容器内的tomcat83看到访问成功,因为此时容器的IP借用主机的,
所以容器共享宿主机网络IP,这样的好处是外部主机与容器可以直接通信。

3. none
none是什么

none模式下,并不为Docker容器进行任何网络配置。
也就是说,这个Docker容器没有网卡、IP、路由等信息,只有一个lo
需要我们自己为Docker容器添加网卡、配置IP等。

禁用网络功能,只有lo标识(就是127.0.0.1表示本地回环)

案例

docker run -d -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8
在这里插入图片描述

在容器外部查看

docker inspect tomcat84 | tail -n 20
在这里插入图片描述

可以看出,指定网络模式为none启动的容器没有gateway,没有ipaddress

在容器内部查看

docker exec -it tomcat84 bash
ip addr
在这里插入图片描述

可以看出,只有一个lo

4. container
container是什么

container网络模式

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

在这里插入图片描述

案例1

docker run -d -p 8085:8080 --name tomcat85 billygoo/tomcat8-jdk8

docker run -d -p 8086:8080 --network container:tomcat85 --name tomcat86 billygoo/tomcat8-jdk8

--network container:tomcat85 借用tomcat85的网络

运行结果

在这里插入图片描述

当运行tomcat85容器时正常,在运行tomcat86容器时报错

相当于tomcat86tomcat85共用同一个ip同一个端口,导致端口冲突本案例用tomcat演示不合适。。。演示坑,

换一个镜像给大家演示。

案例2

这里使用Alpine镜像进行演示。

Alpine操作系统是一个面向安全的轻型 Linux发行版。
Alpine Linux 是一款独立的、非商业的通用 Linux 发行版,专为追求安全性、简单性和资源效率的用户而设计。 可能很多人没听说过这个 Linux 发行版本,但是经常用 Docker 的朋友可能都用过,因为他小,简单,安全而著称,所以作为基础镜像是非常好的一个选择,可谓是麻雀虽小但五脏俱全,镜像非常小巧,不到 6M的大小,所以特别适合容器打包。

docker run -it --name alpine1 alpine /bin/sh
docker run -it --network container:alpine1 --name alpine2 alpine /bin/sh
在这里插入图片描述
另开一个控制台
在这里插入图片描述

运行完以上两个命令后,都不会报错。

运行结果,验证共用搭桥

在这里插入图片描述
在这里插入图片描述

从上图可以看出来,ip地址都为172.17.0.2,即两个容器共用了同一个网段,同一个ip

假如此时关闭alpine1,再看看alpine2

输入命令 ip addr,可以得到:
27: eth0@if28: 消失了,只剩下了lo本地回环链路。

在这里插入图片描述
在这里插入图片描述

5. 自定义网络

在这里插入图片描述

自定义网络原因:希望所有网络分门别类,在各自的网络里和谐共存,且能完成网络之间的通信。

过时的link

https://docs.docker.com/network/links

在这里插入图片描述

在这里插入图片描述

案例
before

案例:

docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8
在这里插入图片描述

上述成功启动并用docker exec进入各自容器实例内部

首先进入tomcat81容器内部

docker exec -it tomcat81 bash
在这里插入图片描述

然后进入tomcat82容器内部

docker exec -it tomcat82 bash
在这里插入图片描述

可以看出,tomcat81容器的ip地址为172.17.0.2tomcat82容器的ip地址为172.17.0.3

然后在tomcat82容器内ping tomcat81容器,看能否ping
在这里插入图片描述

可以看出,能够ping通。

然后在tomcat81容器内pingtomcat82容器,看能否ping

在这里插入图片描述

可以看出,能够ping通。

问题

按照IP地址ping是OK的
按照服务名ping结果???

在这里插入图片描述
在这里插入图片描述

可以看出,按照服务名ping,都会出现名称解析暂时失败的错误。

但是在网络设计规划里面,是不能将ip地址固定的,只能ping服务名的方式。所以下面介绍如何自定义网络。

after

案例

1)自定义桥接网络,自定义网络默认使用的是桥接网络bridge

2)新建自定义网络

docker network create zzp_network
docker network ls
在这里插入图片描述

3)新建容器加入上一步新建的自定义网络

docker run -d -p 8081:8080 --network zzp_network --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --network zzp_network --name tomcat82 billygoo/tomcat8-jdk8
在这里插入图片描述

4)互相ping测试

在这里插入图片描述
在这里插入图片描述

可以看出,通过服务名互相ping,可以ping通了。这样解决了集群环境下,多台容器通过服务名进行网络通信的方式。

问题结论

自定义网络本身就维护好了主机名和ip的对应关系(ip和域名都能通)


Docker平台架构图解

整体说明

从其架构和运行流程来看,Docker 是一个 C/S 模式的架构,后端是一个松耦合架构,众多模块各司其职

Docker 运行的基本流程为:

  1. 用户是使用 Docker ClientDocker Daemon 建立通信,并发送请求给后者。
  2. Docker Daemon 作为 Docker 架构中的主体部分,首先提供 Docker Server 的功能使其可以接受 Docker Client 的请求。
  3. Docker Engine 执行 Docker 内部的一系列工作,每一项工作都是以一个 Job 的形式的存在。
  4. Job 的运行过程中,当需要容器镜像时,则从 Docker Registry 中下载镜像,并通过镜像管理驱动 Graph driver将下载镜像以Graph的形式存储。
  5. 当需要为 Docker 创建网络环境时,通过网络管理驱动 Network driver 创建并配置 Docker 容器网络环境。
  6. 当需要限制 Docker 容器运行资源或执行用户指令等操作时,则通过 Execdriver 来完成。
  7. Libcontainer是一项独立的容器管理包,Network driver以及Exec driver都是通过Libcontainer来实现具体对容器进行的操作。

整体架构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
通过这一个课程的介绍,首先我们就能够去了解到,Windows Server 2022 的系统当中,容器服务基本的应用场景和特点,然后我们就可以逐步地去完成,容器服务组件的安装和配置,并且获取容器仓库当中,标准和基础的映像,通过标准和基础映像,运行容器实例第二章:介绍 docker 和容器服务的应用场景和特点,Windows 平台当中容器服务的特点        第三章:介绍在 Windows 10 以及 Windows Server 2022 的系统当中,部署 docker 服务的不同方式,涉及到的组件,以及完成 docker 服务部署的过程        第四章:完成容器服务的基本操作,从映像仓库获取标准映像,使用标准映像创建和运行容器实例        第五章:了解容器映像自定义的基本过程,并且基于标准的映像,创建、自定义和保存自定义应用程序的映像,并且使用自定义映像创建和运行容器实例        第六章:介绍 Docker 配置文件的功能和应用场景,并且创建和配置 Docker 配置文件,使用 Docker 配置文件创建和运行容器实例        第七章:介绍 Docker 容器实例运行时,计算、存储、网络资源的分配特点,并且为不同的容器实例分配计算、存储和网络资源         第八章:介绍 Windows Admin Center 提供的 docker 管理功能,并且完成  Windows Admin Center 安装和配置,完成 Docker 相关组件的查看和管理

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值