Docker网络-精简版

来源:互联网 发布:java调用kettle实例 编辑:程序博客网 时间:2024/06/05 04:16

自建网络:

单host上的网络,在Docker安装时会自动在host上创建三个网络,我们可用docker network ls命令查看
none网络
故名思议,none网络就是什么都没有的网络。挂在这个网络下的容器除了lo,没有其他任何网卡,容器创建时,可以通过
--network=none指定使用none网络
host网络
连接到host网络的容器共享Docker host的网络栈,容器的网络配置与host完全一样。可以通过--network=host指定使用host网络。
在容器中可以看到host的所有网卡,并且连hostname也是host的。
使用此网络的最大好处就是性能,如果容器对网络传输效率有很高的要求,则可以选择host网络,当然不便之处就是牺牲一些灵活性,比如要考虑端口冲突问题,Docker host上已经使用的端口就不能再使用了。
bridge网路
Docker安装时会创建一个命令为docker0的linux bridge,如果不指定--network,创建的容器默认都会挂到docker0
查看所有容器网络:docker network inspect bridge

自定义网络:

Docker提供user-define网络驱动:bridge,overlay,macvlan。overlay和macvlan用于创建跨主机的网路。
例如:
1. docker network create --driver bridge my_net
2. docker network create --driver bridge --subnet 192.168.140.0/24 --gateway 192.168.140.1 my_net2
分别使用brctl show 和 dokcer network inspect xxx 查看网络
容器要使用新的网络,需要在启动时通过 --network 指定:
@docker run -it -d --name vm26 --network=my_net   centos
@docker run -it -d --name vm23 --network=my_net2 --ip 192.168.140.5  centos
如何让不同网段的容器连通,可以直接加veth对。即 docker  network connect xxx <container>

容器间通讯的三种方式
ip通讯
如果两个容器能通讯,必须要有属于同一个网络的网卡。
满足条件后,容器就可以通过ip交互了。具体做法是在容器创建时通过--network指定相应的网络,或者通过docker network connect 将现有容器加入到指定网络。
Docker DNS server
通过ip访问容器虽然满足了通讯的要求,但是不够灵活。因为我们在部署应用之前无法确定ip,部署之后再指定要访问的ip会比较麻烦。对于这个问题,可以通过docker自带的dns服务解决。
从docker 1.10版本开始,docker daemon实现了一个内嵌的DNS server,使容器可以直接通过“容器名”通信,方法简单,只要在启动时用 --name为容器命令就可以了。
joined容器
joined容器是另一个实现容器间通讯的方式。
joined容器非常特别,它可以使用两个或者多个容器共享一个网络栈,共享网卡和配置信息,joined容器之间可以通过127.0.0.1直接通信。
@docker run -it -d --network=container:vm2 --name vm31 centos
可以查看到它们共享了相同的网络栈。
joined容器非常适合以下场景:
1. 不同容器中的程序希望通过loopback高效通信
2. 希望监控其他容器的网络流量,比如运行在独立容器中的网络监控程序

容器与互联网互相访问
容器访问外网:
默认情况下,容器就能访问外网。
iptables-save:
@-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
@-A POSTROUTING -s 192.168.140.0/24 ! -o br-5e7b8d960552 -j MASQUERADE
@-A POSTROUTING -s 172.18.0.0/16 ! -o br-00e6ed88a4d4 -j MASQUERADE
其含义是:如果网桥docker0收到来自容器网桥的外出包,把它交给MASQUERADE处理,而MASQUERADE的处理是将
包的源地址替换成host的地址发送出去,即做了一次网络地址转换(nat)
@tcpdump -i xxxx -n icmp
外网访问容器:
可以通过端口映射访问容器。
@root    3401  1002  0 08:40 ?   00:00:00 /usr/libexec/docker/docker-proxy-current -proto tcp -host-ip 0.0.0.0 -host-port 80 -container-ip 172.17.0.7 -container-port 80

原创粉丝点击