目录

  • 一.Docker网络
  • 1.桥接网络
  • 2.host网络模式
  • 3.none模式
  • 二.自定义网络
  • 1.创建自定义网络
  • 2.自定义网络
  • 3.手动指定ip
  • 4.双网卡实现不同网段间的容器通信
  • 三.Docker容器通信
  • 1.使用容器名称通信
  • 2.–link可以用来链接2个容器
  • 3.容器如何访问外网
  • 4.外网访问容器
  • 四.跨主机Docker容器通信
  • 1.跨主机同网段容器通信
  • 2.跨主机的不同网段的容器通信
  • 3.docker network子命令


一.Docker网络

实验环境:

docker双网卡 双网卡 docker_docker双网卡

docker双网卡 双网卡 docker_Docker_02


docker双网卡 双网卡 docker_docker_03


docker双网卡 双网卡 docker_自定义_04


docker双网卡 双网卡 docker_docker_05


docker安装后会自动创建3种网络:bridge、host、none

docker双网卡 双网卡 docker_docker双网卡_06


iptables -nL ##

docker双网卡 双网卡 docker_docker_07

1.桥接网络

docker双网卡 双网卡 docker_Docker_08

安装桥接网络
docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口。

docker双网卡 双网卡 docker_docker_09


docker双网卡 双网卡 docker_docker_10


docker双网卡 双网卡 docker_docker_11

运行一个容器查看桥接

docker双网卡 双网卡 docker_自定义_12

删除掉容器后,桥接消失

docker双网卡 双网卡 docker_Docker_13

2.host网络模式

docker双网卡 双网卡 docker_docker_14

需要指定network host

docker双网卡 双网卡 docker_docker_15


curl 172.25.28.1查看端口,可以发现docker运行的镜像nginx占用的是80端口

docker双网卡 双网卡 docker_Docker_16


再运行一个容器demo2,ps 查看正在运行的容器只有demo,原因是:–network host会占用虚拟机的80端口,但是demo的80端口挤掉了demo2

docker双网卡 双网卡 docker_自定义_17


docker双网卡 双网卡 docker_自定义_18

查看日志:docker logs demo2,可以发现原因

docker双网卡 双网卡 docker_docker双网卡_19

3.none模式

none模式是指禁用网络功能,只有lo接口,在容器创建时使用

–network=none指定

docker双网卡 双网卡 docker_docker双网卡_20

二.自定义网络

自定义网络模式,docker提供了三种自定义网络驱动
bridge
overlay
macvlan

bridge驱动类似默认的bridge网络模式,但增加了一些新的功能,overlay和macvlan是用于创建跨主机网络。

docker的ip不固定,哪个容器先起来,哪个先用前面的ip 默认情况不是用容器名称,ping ip

docker双网卡 双网卡 docker_docker_21


docker双网卡 双网卡 docker_Docker_22

docker双网卡 双网卡 docker_docker双网卡_23


docker双网卡 双网卡 docker_docker双网卡_24


ping ip 可以

docker双网卡 双网卡 docker_docker_25

ping 名称不通

docker双网卡 双网卡 docker_自定义_26

1.创建自定义网络

docker双网卡 双网卡 docker_docker双网卡_27


自定义mynet1网桥

docker双网卡 双网卡 docker_docker_28


docker双网卡 双网卡 docker_Docker_29

运行容器,使其都连接在mynet1的自定义网桥上

docker双网卡 双网卡 docker_docker_30


docker双网卡 双网卡 docker_docker_31

测试:
ping demo可以直接成功,说明可以提供解析

docker双网卡 双网卡 docker_docker双网卡_32


docker双网卡 双网卡 docker_自定义_33

2.自定义网络

在创建时指定参数:--subnet 、--gateway

之前已经创建了mynet1网桥,subnet 为172.20.0.0/24,gateway为172.20.0.1,此处新建mynet2网桥时,subnet 和 gateway不能与mynet1重复!!

docker双网卡 双网卡 docker_自定义_34

3.手动指定ip

4.双网卡实现不同网段间的容器通信

桥接到不同网桥上的容器,彼此是不通信的。

docker在设计上就是要隔离不同network的。

那么如何使两个不同网桥的容器通信呢: 使用 docker network connect命令为vm1添加一块my_net2 的网卡。

docker双网卡 双网卡 docker_docker_35


运行第一个容器搭mynet1网络,运行第二个容器搭mynet2网络

发现这两个容器ping不通!!

docker双网卡 双网卡 docker_docker双网卡_36


第二个容器的id为2c****,使mynet1 连接第二个容器,attach 第二个容器的id,再次ping 第一个容器,发现可以ping通

docker双网卡 双网卡 docker_docker_37


可以看到mynet1,mynet2的ip都出现在了里面!说明通信成功!

docker双网卡 双网卡 docker_自定义_38

三.Docker容器通信

1.使用容器名称通信

容器之间除了使用ip通信外,还可以使用容器名称通信。
dns解析功能必须在自定义网络中使用。
启动容器时使用 --name 参数指定容器名称。
在容器创建时使用–network=container:vm1指定。(vm1指定的是运行的容器名)
docker demo 必须是运行的!!!

Joined容器一种较为特别的网络模式。

docker双网卡 双网卡 docker_Docker_39


docker双网卡 双网卡 docker_自定义_40


docker双网卡 双网卡 docker_自定义_41

处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信。

2.–link可以用来链接2个容器

–link 可以用来链接2个容器。
–link的格式: –link **:alias

需要删除之前的demo

ping名字demo成功!

docker双网卡 双网卡 docker_Docker_42


Demo和web的ip:172.17.0.2, web是容器内新开启的,和demo共用同一个ip Busybox的ip:172.17.0.3

docker双网卡 双网卡 docker_自定义_43


域名是动态变化的:

docker双网卡 双网卡 docker_自定义_44


docker双网卡 双网卡 docker_docker_45


docker双网卡 双网卡 docker_docker双网卡_46


docker双网卡 双网卡 docker_Docker_47


可以发现:demo由原来的172.17.0.3 变为 172.17.0.4

docker双网卡 双网卡 docker_Docker_48


docker双网卡 双网卡 docker_docker双网卡_49


docker双网卡 双网卡 docker_docker双网卡_50

3.容器如何访问外网

容器如何访问外网是通过iptables的SNAT实现的

docker双网卡 双网卡 docker_Docker_51

docker双网卡 双网卡 docker_docker_52

docker双网卡 双网卡 docker_docker双网卡_53

docker双网卡 双网卡 docker_自定义_54


直接可以访问外网(真实主机开启了地址伪装功能)

docker双网卡 双网卡 docker_Docker_55

4.外网访问容器

外网访问容器用到了docker-proxy和iptables DNAT

宿主机访问本机容器使用的是iptables DNAT;外部主机访问容器或容器之间的访问是docker-proxy实现

docker双网卡 双网卡 docker_docker双网卡_56


端口映射:-p 选项指定映射端口

docker双网卡 双网卡 docker_自定义_57

查看目的地转换规则,第六条链

docker双网卡 双网卡 docker_docker_58

查看端口

docker双网卡 双网卡 docker_Docker_59

删除第6条连: iptables -t nat -D DOCKER 6 , 查看没有

docker双网卡 双网卡 docker_自定义_60

docker双网卡 双网卡 docker_自定义_61

查看端口有docker-proxy,此时只有 docker-proxy

docker双网卡 双网卡 docker_自定义_62

重新加入后查看

docker双网卡 双网卡 docker_docker双网卡_63


docker双网卡 双网卡 docker_docker双网卡_64

四.跨主机Docker容器通信

跨主机容器网络

  • 跨主机网络解决方案:
    docker原生的overlay和macvlan
    第三方的flannel、weave、calico
  • 众多网络方案是如何与docker集成在一起的
    libnetwork docker容器网络库
    CNM (Container Network Model)这个模型对容器网络进行了抽象
  • CNM分三类组件
    Sandbox:容器网络栈,包含容器接口、dns、路由表。(namespace)
    Endpoint:作用是将sandbox接入network (veth pair)
    Network:包含一组endpoint,同一network的endpoint可以通信。

docker双网卡 双网卡 docker_docker双网卡_65

1.跨主机同网段容器通信

server1 打开混杂模式

docker双网卡 双网卡 docker_docker_66


server2 打开混杂模式

docker双网卡 双网卡 docker_自定义_67


docker双网卡 双网卡 docker_docker_68


在两台docker主机上各创建macvlan1网络:

docker双网卡 双网卡 docker_自定义_69

docker双网卡 双网卡 docker_Docker_70


docker双网卡 双网卡 docker_docker双网卡_71


不同主机的容器可以ping 通

容器的接口直接与主机网卡连接,无需NAT或端口映射。

docker双网卡 双网卡 docker_docker双网卡_72

2.跨主机的不同网段的容器通信

macvlan会独占主机网卡,但可以使用vlan子接口实现多macvlan网络
vlan可以将物理二层网络划分为4094个逻辑网络,彼此隔离,vlan id取值为1~4094。

server1和server2新加一块网卡eth1

docker双网卡 双网卡 docker_docker_73

docker双网卡 双网卡 docker_docker_74


编写eth1的网卡文件(server1和server2)

docker双网卡 双网卡 docker_自定义_75


重新激活网卡:ifup eth1

ip link set up eth1启用网卡

eth1网卡的混杂模式打开(server1和server2)

docker双网卡 双网卡 docker_docker_76


docker双网卡 双网卡 docker_docker_77


删除之前的macvlan1和macvlan2

docker双网卡 双网卡 docker_docker_78


server1和server2创建macvlan2,注意网段需要改变一下和前面eth0不一样172.21.0.*

docker双网卡 双网卡 docker_自定义_79

docker双网卡 双网卡 docker_Docker_80

创建容器并运行,注意网段需要改变一下和前面eth0不一样172.21.0.*

docker双网卡 双网卡 docker_自定义_81


在server2也需要创建容器并运行:

docker双网卡 双网卡 docker_docker双网卡_82


docker双网卡 双网卡 docker_docker双网卡_83

demo的信息中会自动生成和 macvlan1同网段172.20.*.*的ip:172.20.0.2

docker双网卡 双网卡 docker_Docker_84


不同网段 172.21.0.10不能通信,但是生成的Ip172.20.0.2可以访问

docker双网卡 双网卡 docker_docker双网卡_85

3.docker network子命令

connect		连接容器到指定网络
create			创建网络
disconnect	断开容器与指定网络的连接
inspect		显示指定网络的详细信息
ls			显示所有网络
rm			删除网络