Docker学习笔记(6)-docker网络详解

时间:2021-07-07 01:26:45


我们创建好容器之后,服务都是要对外进行使用的,所以我们需要进行容器之间的相互访问。这个时候我们就需要用到docker的网络

在这里插入图片描述

Docker学习笔记(6)-docker网络详解


Docker学习笔记(6)-docker网络详解

先去百度找几张关于docker网络的图,图是很能清晰的描述docker网络的。
首先我们知道,我们宿主机去分别ping容器是可以ping通的。我们这里实际测试下

Docker学习笔记(6)-docker网络详解

  • 进入容器查看容器的ip地址是172.17.0.2,我们返回宿主机去ping试试 看看能不能ping通

    我们看到是能够ping通的,那么我们想一想。如果两个容器相互之间能不能直接ping通呢?

我们再启动一个nginx

docker run -d -it -P --name nginx02 nginx

Docker学习笔记(6)-docker网络详解


Docker学习笔记(6)-docker网络详解

如果容器内部不能执行ifconfig 我们需要安装net-tools包
[root@VM_0_16_centos ~]# docker exec -it nginx02 /bin/bash
root@e6ce3d91ceec:/# apt update && apt install net-tools

Docker学习笔记(6)-docker网络详解


第一个容器地址172.17.0.2 第二个容器地址172.17.0.3 我们尝试ping下

执行发现ping命令也没有,那我们就安装一个呗

apt-get install inetutils-ping  #安装ping命令

Docker学习笔记(6)-docker网络详解


发现是可以ping通的

我们再看看宿主机上面的网卡配置

Docker学习笔记(6)-docker网络详解


看到一个docker0的虚拟网卡。我们发现两个容器和docker0网段是一样的,所以他是能ping通的。docker0这里充当了路由器的觉得。

我们画一个图理解下。

Docker学习笔记(6)-docker网络详解


大概就是这样的一个流程,docker0相当于路由器。负责转发请求。

我们容器与docker0相互交流是通过veth-pair 充当一个桥梁,连接各种虚拟网络设备的
OpenStac,Docker容器之间的连接,OVS的连接,都是使用evth-pair技术

现在我们要解决一个事情 就是我们是否能够通过容器名称来直接ping通。这里有点像我们的域名DNS。我们通过域名可以访问到指定的IP地址。

docker里面提供了 --link来解决这个问题

docker run -it -d -P --name nginx04  --link nginx02 nginx

Docker学习笔记(6)-docker网络详解


我们进入nginx04 看看能不能直接使用nginx02来ping通

Docker学习笔记(6)-docker网络详解


我们发现ping通没什么问题。这就类似于我们做了一个DNS映射。

我们复盘整个请求流程
首先 nginx04 请求 nginx02 看看本地hosts文件有没有ip地址映射。没有的话直接报错。有的话根据ip地址去进行访问。

–link 本质就是在hosts配置中添加映射

但是这种不能双向的访问 除非你nginx02也去绑定下nginx04

有没有更好的解决办法呢?

我们可以使用docker network 命令

我们看下network命令可以干啥?

docker network --help

Docker学习笔记(6)-docker网络详解

自定义网络

网络模式
bridge :桥接模式 转发访问 (默认)
none:不配置网络
host : 主机模式 和宿主机共享模式
container:容器网络连通(局限性大)

docker启动容器是默认bridge桥接。

我们可以自定义一个网络。到时候集群的时候可以分服务来创建网络

docker network create --driver bridge (网络类型)  --subnet 192.168.0.0/16 (子网地址 16代表能分配的地址数) --gateway 192.168.0.1 (路由地址) hong (网络名称)

Docker学习笔记(6)-docker网络详解


Docker学习笔记(6)-docker网络详解


Docker学习笔记(6)-docker网络详解

这里我们看到已经创建了一个网络

接下来我们把我们的容器都连上我们自己的网络里面

Docker学习笔记(6)-docker网络详解

docker network inspect hong #查看hong这个网络的信息

Docker学习笔记(6)-docker网络详解

需要注意的是 如果我们使用docker network connect去连接我们自己的桥 需要重启容器才能生效

或者在创建容器的时候就使用–net来连接上自己的桥。

好处:不同的集群我们可以使用不同的网络。来确保安全。

我们再做一个小测试。建立两个不同网络。两个不同网络的容器是否能够访问,这个其实从理论上来说是不能直接相互访问的,因为网段不一样。

创建一个新的网络。

docker network create --driver bridge --subnet 10.0.0.0/8 --gateway 10.0.0.1 mynnet
docker run -d -P --net mynnet --name nginx05 nginx

Docker学习笔记(6)-docker网络详解


我们来尝试一下两个容器 不同网段的能不能相互访问

Docker学习笔记(6)-docker网络详解


提示不能访问

如果需要跨网段访问。我们可以将容器绑定到另外一个网段

Docker学习笔记(6)-docker网络详解


Docker学习笔记(6)-docker网络详解


这样可以看到我们的nginx02存在于两个网络之中。这样就可以容器之间访问在两个网络中。

docker告一段落 。等项目实战的时候会把技术用起来。一个技术学了不用很难忘记。