一、容器名称通信
容器之间除了使用ip通信外,还可以使用容器名称通信。
1.使用同一个自定义的网络模式,容器名称通信
- docker 1.10开始,内嵌了一个DNS server
- dns解析功能必须在自定义网络中使用
- 启动容器时使用–name参数指定容器名称
2.join容器
joined容器是一种较为特别的网络模式,在容器创建时使用–network=container:vm1指定。(vm1指定的是运行的容器名)
好处可以使用localhost通信:
3.link
link可以用来链接2个容器
–link的格式:
- --link的格式:
- --link <name or id>:alias
- name和id是源容器的name和id,alias是源容器在Link下的别名
link有两个作用:1.更新了host文件;2.更新了变量
再来做个实验,将第一次运行的容器infallible_sanderson关闭,再次运行一个容器,随机名为youthful_jang,此时,新运行的容器ip是172.17.0.2,将infallible_sanderson再次开启,ip变为172.17.0.4,因为vm1的ip是3,所以youthful_jang的ip为4。
二、 容器如访问外网
端口映射,-p指定映射端口
再创建一个容器,将宿主机的8080映射到容器的80端口。
也可以通过浏览器访问:
外网访问容器用到了docker-proxy和iptables DNAT。
- 宿主机访问本机使用的是iptables DNAT
- 外部主机访问容器或容器之间访问是docker-proxy实现。
三、跨主机容器网络
跨主机网络解决方案
- docker原生的overlay和macvlan
- 第三方的flannel,weave,calico
众多网络方案是如何与docker集成在一起的
- libnetwork docker容器网络库
- CNM(container Network Model)这个模型对容器网络进行了抽象
CNM分三类组件
-
Sandbox:容器网络栈,包含容器接口,dns,路由表。(namespace)
-
Endpoint:作用是将sanbox接入network (veth pair)
-
Network:包含一组endpoint,同一network的endpoint可以通信
macvlan网络方案实现 -
Linux kernel 提供的一种网卡虚拟化技术。‘
-
无需Linux bridge,直接使用物理接口,性能极好。
在两台docker主机上各添加一块网卡,打开网卡混杂模式
1.准备好两台docker主机,两块网卡:
2.打开网络混杂模式
第一次做的有错误:实际上没有打开
更正:
新添加的eth1网卡,需要启用。启用后再设置混杂模式开启。
node1和node2都首先开启一下网卡再开启混杂模式。
3.在两台主机上各创建macvlan网络:
4.在两台主机创建容器:
5.macvlan网络结构分析
- 没有新建linux bridge,使用的是物理机的网卡通信
容器的接口直接与主机网卡连接,无需NAT或端口映射
- macvlan会独占主机网卡,但可以使用vlan子接口实现macvlan网络
- vlan可以将物理二层网络划分为4094个逻辑网络,彼此隔离,vlan id取值为1~4094
创建网络:
运行容器:
macvlan网络间的隔离和连通
- macvlan网络在二层上是隔离的,所以不同macvlan网络的容器是不能通信的。
- 可以在三层上通过网关将macvlan网络连接起来。
- docker本身不做任何限制,像传统vlan网络那样管理即可