Docker 网络

Docker 网络基础

docker使用Linux桥接网卡,在宿主机虚拟一个docker容器网
(docker0),docker启动一个容器时会根据docker网桥的网段分配给容器 一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网络网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接Container-IP访问到容器。
如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过-p或-P参数来启用,访问容器的时候就通过宿主机IP:容器端口访问容器

Docker网络常用命令

这个命令的学习,非常的容易。我们可以直接使用docker network --help进行查看就能够知道有那些命令了。
在这里插入图片描述
下面我们解释一下上面的这些命令具体是用来干什么的

命令作用
docker network create创建一个网络
docker network ls列出有那么些网络
docker network connect连接网络
docker network disconnect断开网络
docker network prune删除不使用的网络
docker network inspect查看网络详情
docker network rm删除一个或者多个网络

下面我们来演示一下上面命令的使用
在这里插入图片描述
此时我们创建了一个网络,我们发现他默认的模式是这个桥接模式bridge).

在这里插入图片描述
我们在将我们刚才创建的网络给删除掉,非常的简单就是普通的curd。最后我们在演示一下这个查看网络详情的命令
在这里插入图片描述
类似于json串一样的形式给我们展示出来,由于太长了博主没有全部截取下来。

docker 网络能干什么

所有网络的访问,前提是不是得在同一网段。在linux我们可以使用ifconfig和这个ip addr 命令来查看这个。那他到底能干嘛了

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

我们日常当中连接某个服务,一般是通过服务的ip和端口但是在docker当中如果某个容器重启了那么对应容器的ip地址是会发生变化的
所以我们应该使用对应的服务名来调用,不能写死ip而应该写死服务名来调用

docker 网络模式

在这里插入图片描述
下面我们一个一个来介绍:

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

如何指定:
在这里插入图片描述
下面我们来看一下默认网络IP的生产规则,下面我们我们启动两个ubuntu的容器实列
在这里插入图片描述
然后我们再来看看这个u2
在这里插入图片描述
我们发现这两个默认的网关是一样的都是这个docker0,我们可以使用ifconfig 进行查看。
在这里插入图片描述
那如果我们此时将u1给删除掉了,然后我们再将重新启动一个u3会发生什么了
在这里插入图片描述
我们发现此时u3的ip地址是这个之前u1的地址。此时我们就知道随着容器实列的变化他的IP也是会变化的。所以我们在调用部署在docker当中服务的ip我们不能写死。

下面我们来看看这个默认的bridge模式,通过命令进行查看

docker network inspect bridge

在这里插入图片描述
Docker服务默认会创建一个docker0的网桥,该网桥的名称我们叫做docker0,它在内核层连通了其他物理或者虚拟网卡,这就将所有的容器放到了同一个物理网络。

下面我们来谈一下这个docker当中bridge模式的步骤

  • Docker Daemon利用veth pair技术,在宿主机上创建两个虚拟网络接口设备,假设为veth0 和veth1。而veth pair技术的特性可以保证无论哪一个veth接收到网络报文,都会将报文传输给另一方。
  • Docker Daemon将veth0附加到Docker Daemon创建的docker0网桥上。保证宿主机的网络报 文可以发往veth0;
  • Docker Daemon 将veth1添加到Docker Container所属的namespace下,并被改名为eth0。 如此一来,保证宿主机的网络报文若发往veth0则立即会被eth0接收,实现宿主机到Docker Container网络的联通性;同时也保证Docker Container单独使用eth0,实现容器网络环境的隔离性。

如果我们用一副图来表示那么可以是如下所示:
在这里插入图片描述
下面我们可以看一下这个,到底是不是这样的了。下面博主来演示一下这个。下面我们启动一个ubutun的容器实列

docker run -it --name='u1' ubuntu

然后我们使用 ip addr命令进行查看
在这里插入图片描述
下面我们进入到容器当中再次查看会是什么效果了?
在这里插入图片描述
我们发现确实是成对存在的,虚拟出来了一网络接口设备
但是这个桥接模式也有一定的缺点:

  • Docker Container不具有一个公有IP,即和宿主机eth0不处于同一个网段。导致的结果是宿主机以外的世界不能直接和容器进行通信。

在这里特别需要注意的是这个:
eth设备是成双成对出现的,一端是容器内部命名为eth0,一端是加入到网桥并命名的veth(通常命名为veth),它们组成了一个数据传输通道,一端进一端出,veth设备连接了两个网络设备并实现了数据通信。

2. host模式

下面我们来看看这个host模式,如果采用了这个host模式。当我们docker run 启动一个容器时,容器不会获得独立的Network namespace 而是和宿主机共用一个network namespace 容器不在会虚拟出自己的网卡而是使用宿主机的ip和端口
在这里插入图片描述
下面我们来演示一下吧,先启动一个容器实列

docker run -it --name='u2' --network host ubuntu 

我们在容器当中输入这个ip addr命令
在这里插入图片描述
然后我们在看看宿主机的是什么样子的
在这里插入图片描述
我们发现一模一样,确实如上面所说。其次我们可以使用docker inspect 查看容器的情况
在这里插入图片描述
这就是host模式,全部使用宿主机的。此时启动容器就不需要使用-p开启端口映射了因为完全使用主机的了。

3.none
none模式使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过-- network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。在这里就不进行演示了,因为不常用。

4.container 容器模式
一种特殊host网络模式,
ontainer网络模式是Docker中一种较为特别的网络的模式。在容器创建时使用– network=container:vm1指定。(vm1指定的是运行的容器名)处于这个模式下的 Docker 容器会共享一个网络环境,这样两个容器之间可以使用localhost高效快速通信。

docker run -it --name=alpine1 alpine /bin/sh

下面我们在启动一个容器,alpine2我们让其和alpine1共享一个网络

 docker run -it --network container:alpine1 --name=alpine2 alpine /bin/sh

在这里插入图片描述
我们发现他们确实共享一个网络,如果我们此时干坏事我把alpine1容器给关掉了**,共享源我直接给你关了此时我们在次查看alpine2**容器里面的情况会是什么样子的。
在这里插入图片描述
我们发现此时对应的虚拟网络接口设备没了。

5.自定义网络
我们之前说了,docker容器的ip可能随着启动和停止导致ip发生变化,我们在连接服务应该写死服务名而不能写死ip。

在这里插入图片描述
在docker 当中默认的桥接模式我们使用ping安装地址去ping是可以的,但是使用服务名就不行。
下面我们创建一个自定义的网络,使用如下命令

docker network create ksy_network

在这里插入图片描述
然后我们新启动两台容器实列加入到我们对应的网络当中

docker run -it --network ksy_network --name=alpine1 alpine /bin/sh
docker run -it --network ksy_network --name=alpine2 alpine /bin/sh

然后我们在进入容器当中使用服务名来进行ping,看是否能ping通
在这里插入图片描述

我们发现此时是能够ping通的,这也就解决了上面的那个问题,容器ip可能发生变化但是我们使用服务名来搞就行了。有点DNS域名解析的感觉

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个追梦的少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值