docker网络
理解docker0
三个网络
docker是如何处理容器之间的访问的
启动一个容器
查看容器内的地址以及网卡名称
在查看宿主机的网络信息
也就是说,每启动一个docker容器,docker就会给docker容器分配一个ip,我们呢只要安装了docker,就会有一个网卡docker0,使用的是veth-pair技术
这些创建容器带来的网卡都是一对一对的,这就是veth-pair技术,他们都是成对出现的,一段连接着协议,一段彼此相连.正因为这种特性,veth-pair充当一个桥梁,连接各种虚拟网络设备.
容器之间通过docker0采用桥接模式, docker0和物理网卡直接NAT连接
可以通过iptables -t nat -vnL DOCKER
命令查看外部访问容器
的iptables转发规则
可以通过iptables -t nat -vnL POSTROUTING
命令查看容器访问外部
的iptables转发规则
–link
创建一个容器命令centos01 在创建一个centos02,执行命令ping centos01,此时是无法联通的.
这时候在通过添加 --link centos01 参数 创建一个centos03, 通过ping centos01命令,发现是可以通信的.
通过–link 可以解决网络联通问题,此解决方式不可以相互连通.只有加上规则的一方可以
通过docker network inspect 网络id 可以查询网络具体信息
同时可以看到该网络下所有容器的网络信息
–link 连接原理,在添加参数–link的容器中,可以看到在/etc/hosts文件下,已经把指向机器的名称以及容器id都做了地址解析
如手动在容器中修改/etc/hosts文件,也可以达到相同的效果
实际上docker已经不推荐使用–link了
推荐使用自定义网络,不适用docker0
docker0的问题:他不支持容器名连接访问
自定义网络
容器互联
查看所有的docker网络
docker network ls
docker的网络模式
- bridge: 桥接docker(默认)
- none: 不配置网络
- host: 和宿主机共享网络
- container:容器内网络联通(局限比较大)
我们自己创建网络也使用bridge模式
#我们直接启动的命令, 实际上是带有 --net bridge 这个参数的,这个就是我们的docker0
docker run -d -P --name centos01 centos
#docker0特点,默认,域名是不能访问的,只有使用--link可以打通单项连接
可以通过 docker network create --help 命令来查看创建
重要参数如下
#综上,可以通过以下命令创建自定义网络
docker network create --driver bridge --subnet 192.169.166.0/16 --gateway 192.169.0.1 mynet
##通过--net指定网络
docker run -it --name centos01 --net mynet centos /bin/bash
自定义的网络是支持容器名之间的互ping
自定义的网络docker都已经帮我们维护好了对应的关系,推荐使用这样的网络
不同的集群使用不同的网络,保证所有的集群是安全和健康的
#不同网络之间的容器默认是不通的,可以通过docker network connect [网络] [容器名] 命令进行联通
docker network connect mynet quizzical_babbage
连接相当于把这台机器加进了需要连接的网络中,类似一台机器两个网卡
可以看到这个容器现在内部有两个网卡
也就是说如果需要跨网络操作别的网络集群,就需要使用docker network connect 进行联通
docker0默认地址段和主机网段冲突解决方案
- 修改/etc/docker/daemon.json文件,加入以下代码
{
"default-address-pools":
[
{"base":"172.100.0.0/16","size":24}
]
}
###如果有镜像加速器 请加在花括号中,注意要添加","结尾
-
删除docker0
ip link delete docker0
-
重新加载并重启docker
systemctl daemon-reload syst