docker网络
-
容器网络的类型介绍
-
none网络:该模式关闭了容器的通信功能
-
应用场景:对于一些安全性较高的应用并且不需要进行互联网的应用可以使用none网络。比如某个容器的唯一用途是生成随机密码,就可以放到none网络中避免密码被盗窃
-
-
host网络
-
介绍:网络不会虚拟化出自己的网卡、设置IP,而是使用宿主机的IP和端口。使用--network=host指定使用host网络
-
应用场景:使用host网络的最大好处就是性能,如果容器对网络传输效率有较高的要求,则可以使用host网络模式。不便之处就是牺牲灵活性,比如需要考虑端口冲突问题。另一个用途就是直接配置host网路
-
-
bridge网络
-
介绍:此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟机网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信
-
-
用户自定义网络
-
用户可以自定义的类型包括:bridge、overlay、macvlan。后两者主要用户跨主机之间的通信
docker network create --driver bridge my_net #用户可以自定义子网IP和网管 docker network create --driver bridge --subnet 172.22.16.0/24 --gateway 172.22.16.1 my_net2
docker run -it --network=my_net2 busybox #用户可以自定义静态IP docker run -it --network=my_net2 --ip 172.22.16.8 busybox
-
当前的网络拓扑
-
用户如果想使用新的网络可以使用--network指定
-
同一网关之间是可以进行通信的
-
-
如何实现httpd和busybox通信
-
为httpd容器添加一块net_my2的网卡,通过docker network connect命令实现
# 3fak3werwq为httpd容器ID docker network connect my_net2 3fak3werwq
-
-
容器之间是如何通信的
-
IP通信
-
两个容器要能通信,必须要有属于同一个网络的网卡。满足这个条件后,容器就可进行IP交互了。具体的做法就是通过--network指定相应的网络,或者通过docker network connect将现有的容器加入指定网络
-
-
Docker DNS Server
-
只能在user-defined网络中使用。也就是说,默认的bridge网络无法使用DNS
-
-
joined容器
-
joined容器是另一种实现容器之间通信的方式,它可以使两个或者多个容器共享一个网络栈,共享网卡和配置信息
docker run -d -it --name=web1 httpd #通过--network=容器:web1 指定join容器为web1 docker run -it --network=container:web1 busybox
-
落地场景:
-
不同的容器希望通过loopback高效地通信,比如web server与app server
-
希望监控其他容器的网络流量,比如运行在独立容器中的网络监控程序
-
-
-
-
容器和外界是如何进行通信的
-
容器访问外部世界
-
容器默认就能访问外部世界
-
-
外部世界访问容器‘
-
端口映射
#通过-p参数映射端口 docker run -d -p 80 httpd docker port {容器ID}
-
Lib network & CNM
-
Libnetwork 是 docker 容器网络库,最核心的内容是其定义的Container Network Model这个模型对容器网络进行了抽象,由以下三类组件组成
-
sandbox
-
sandbox是容器的网络栈,包含容器的interface,路由表和DNS设置。
-
-
endpoint
-
endpoint的作用是将sandbox接入Network
-
-
network
-
network 包含一组endpoint,同一network的endpoint可以直接通信
-
-
-
overlay
docker overlay 需要一个key-value数据库用于保存网络的状态信息,包括network、endpoint、IP等。Consul、Etcd和ZooKeeper都是Docker支持的key-value软件。
-
连通性:docker为每个overlay网络创建一个独立的network namespace,其中会有一个linux bridge br0,endpoint还是由veth pair实现,一端连接到容器中,另一端连接到namespace的br0上。br0除了连接所有的endpoint,还会连接一个vxlan设备,用于和其他host建立vxlan tunnel。容器之间就是通过和这个tunnel通信的。
-
隔离性:不同的overlay网络之间是隔离的
-
IPAM:docker默认为overlay网络分配24位子网掩码(10.0.X.0/24),所有主机共享这个subnet,容器启动时会顺序从空间分配IP,当然我们也可以通过--subnet指定IP空间
-
-
macvlan
macvlan本身是linux kernel 模块,其功能是允许同一个物理网卡配置多个MAC地址,即多个interface, 每个interface可以配置自己的IP。macvlan本质上是一种网卡虚拟化技术,macvlan的最大优点是性能极好,相比其他实现,macvlan不需要创建Linux bridge,而是直接通过以太interface连接到物理网络。
docker 跨主机通信
-
-