我们创建好容器之后,服务都是要对外进行使用的,所以我们需要进行容器之间的相互访问。这个时候我们就需要用到docker的网络
在这里插入图片描述
先去百度找几张关于docker网络的图,图是很能清晰的描述docker网络的。
首先我们知道,我们宿主机去分别ping容器是可以ping通的。我们这里实际测试下
- 进入容器查看容器的ip地址是172.17.0.2,我们返回宿主机去ping试试 看看能不能ping通
我们看到是能够ping通的,那么我们想一想。如果两个容器相互之间能不能直接ping通呢?
我们再启动一个nginx
docker run -d -it -P --name nginx02 nginx
如果容器内部不能执行ifconfig 我们需要安装net-tools包
[root@VM_0_16_centos ~]# docker exec -it nginx02 /bin/bash
root@e6ce3d91ceec:/# apt update && apt install net-tools
第一个容器地址172.17.0.2 第二个容器地址172.17.0.3 我们尝试ping下
执行发现ping命令也没有,那我们就安装一个呗
apt-get install inetutils-ping #安装ping命令
发现是可以ping通的
我们再看看宿主机上面的网卡配置
看到一个docker0的虚拟网卡。我们发现两个容器和docker0网段是一样的,所以他是能ping通的。docker0这里充当了路由器的觉得。
我们画一个图理解下。
大概就是这样的一个流程,docker0相当于路由器。负责转发请求。
我们容器与docker0相互交流是通过veth-pair 充当一个桥梁,连接各种虚拟网络设备的
OpenStac,Docker容器之间的连接,OVS的连接,都是使用evth-pair技术
现在我们要解决一个事情 就是我们是否能够通过容器名称来直接ping通。这里有点像我们的域名DNS。我们通过域名可以访问到指定的IP地址。
docker里面提供了 --link来解决这个问题
docker run -it -d -P --name nginx04 --link nginx02 nginx
我们进入nginx04 看看能不能直接使用nginx02来ping通
我们发现ping通没什么问题。这就类似于我们做了一个DNS映射。
我们复盘整个请求流程
首先 nginx04 请求 nginx02 看看本地hosts文件有没有ip地址映射。没有的话直接报错。有的话根据ip地址去进行访问。
–link 本质就是在hosts配置中添加映射
但是这种不能双向的访问 除非你nginx02也去绑定下nginx04
有没有更好的解决办法呢?
我们可以使用docker network 命令
我们看下network命令可以干啥?
docker network --help
自定义网络
网络模式
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 network inspect hong #查看hong这个网络的信息
需要注意的是 如果我们使用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
我们来尝试一下两个容器 不同网段的能不能相互访问
提示不能访问
如果需要跨网段访问。我们可以将容器绑定到另外一个网段
这样可以看到我们的nginx02存在于两个网络之中。这样就可以容器之间访问在两个网络中。
docker告一段落 。等项目实战的时候会把技术用起来。一个技术学了不用很难忘记。