docker网络


文章目录

  • docker网络
  • 理解docker0
  • --link
  • 自定义网络
  • docker的网络模式
  • docker0默认地址段和主机网段冲突解决方案


理解docker0

docker iptables 开放所有端口 docker0 iptables no chain_linux

三个网络

docker是如何处理容器之间的访问的

启动一个容器

查看容器内的地址以及网卡名称

docker iptables 开放所有端口 docker0 iptables no chain_自定义_02

在查看宿主机的网络信息

docker iptables 开放所有端口 docker0 iptables no chain_自定义_03

也就是说,每启动一个docker容器,docker就会给docker容器分配一个ip,我们呢只要安装了docker,就会有一个网卡docker0,使用的是veth-pair技术

这些创建容器带来的网卡都是一对一对的,这就是veth-pair技术,他们都是成对出现的,一段连接着协议,一段彼此相连.正因为这种特性,veth-pair充当一个桥梁,连接各种虚拟网络设备.

docker iptables 开放所有端口 docker0 iptables no chain_linux_04

容器之间通过docker0采用桥接模式, docker0和物理网卡直接NAT连接

可以通过iptables -t nat -vnL DOCKER命令查看外部访问容器的iptables转发规则

可以通过iptables -t nat -vnL POSTROUTING命令查看容器访问外部的iptables转发规则

docker iptables 开放所有端口 docker0 iptables no chain_linux_05

–link

创建一个容器命令centos01 在创建一个centos02,执行命令ping centos01,此时是无法联通的.

这时候在通过添加 --link centos01 参数 创建一个centos03, 通过ping centos01命令,发现是可以通信的.

docker iptables 开放所有端口 docker0 iptables no chain_自定义_06

通过–link 可以解决网络联通问题,此解决方式不可以相互连通.只有加上规则的一方可以

通过docker network inspect 网络id 可以查询网络具体信息

docker iptables 开放所有端口 docker0 iptables no chain_docker_07

同时可以看到该网络下所有容器的网络信息

docker iptables 开放所有端口 docker0 iptables no chain_容器_08

–link 连接原理,在添加参数–link的容器中,可以看到在/etc/hosts文件下,已经把指向机器的名称以及容器id都做了地址解析

docker iptables 开放所有端口 docker0 iptables no chain_容器_09

如手动在容器中修改/etc/hosts文件,也可以达到相同的效果

实际上docker已经不推荐使用–link了

推荐使用自定义网络,不适用docker0

docker0的问题:他不支持容器名连接访问

自定义网络

容器互联

docker iptables 开放所有端口 docker0 iptables no chain_docker_10

查看所有的docker网络

docker network ls

docker iptables 开放所有端口 docker0 iptables no chain_linux_11

docker的网络模式

  1. bridge: 桥接docker(默认)
  2. none: 不配置网络
  3. host: 和宿主机共享网络
  4. container:容器内网络联通(局限比较大)

我们自己创建网络也使用bridge模式

#我们直接启动的命令, 实际上是带有 --net bridge 这个参数的,这个就是我们的docker0

docker run -d -P --name centos01 centos


#docker0特点,默认,域名是不能访问的,只有使用--link可以打通单项连接
可以通过 docker network create --help 命令来查看创建

重要参数如下

docker iptables 开放所有端口 docker0 iptables no chain_linux_12

#综上,可以通过以下命令创建自定义网络
docker network create --driver bridge --subnet 192.169.166.0/16  --gateway 192.169.0.1 mynet

docker iptables 开放所有端口 docker0 iptables no chain_linux_13

docker iptables 开放所有端口 docker0 iptables no chain_centos_14

##通过--net指定网络
docker run -it  --name centos01 --net mynet centos /bin/bash

自定义的网络是支持容器名之间的互ping

docker iptables 开放所有端口 docker0 iptables no chain_容器_15

自定义的网络docker都已经帮我们维护好了对应的关系,推荐使用这样的网络

不同的集群使用不同的网络,保证所有的集群是安全和健康的

#不同网络之间的容器默认是不通的,可以通过docker network connect [网络] [容器名] 命令进行联通

docker network connect mynet quizzical_babbage
连接相当于把这台机器加进了需要连接的网络中,类似一台机器两个网卡

可以看到这个容器现在内部有两个网卡

docker iptables 开放所有端口 docker0 iptables no chain_docker_16

也就是说如果需要跨网络操作别的网络集群,就需要使用docker network connect 进行联通

docker0默认地址段和主机网段冲突解决方案

  1. 修改/etc/docker/daemon.json文件,加入以下代码
{
"default-address-pools":
[
{"base":"172.100.0.0/16","size":24}
]
}
###如果有镜像加速器 请加在花括号中,注意要添加","结尾
  1. 删除docker0
ip link delete docker0
  1. 重新加载并重启docker
systemctl daemon-reload
syst