理解Docker0网络 docker0特点:默认域名不能访问,需要--link单向打通
我们可以在run 后面直接加cmd参数 查看容器的ip地址
docker exec -it tom01 ip addr
可以看到第一个lo是Loopback Address 回环地址
第二个172内网段的则是容器自己创建分配的ip地址.
默认情况下,
每启动一个docker容器,docker会给容器分配一个ip ,安装完docker 默认的网卡就是docker0,
而网卡使用bridge模式,用evth-pair技术进行容器之间或者容器和本机之间相互通信
可以看到docker的地址就是网关地址
evth-pair技术原理了解
默认情况下,linux和容器之间是不能访问的,是基于evth-pair技术,通过他们的协议,在彼此之间做了一个接口桥梁,得以相互分配到同一个ip内网段进行互访.
evth-pair都是一对对的
可以看到下图是创建了2个容器分别是tom01和tom02,而docker本体的ip地址里两个容器的ip对应关系分别是11-10和17-16.
从右边的两个容器里输出ip地址可以看到是10-11,16-17,这个就是evth-pair的技术,通过这个技术,让2个容器在同一网段,所以容器之间也是可以相互访问
大致的网络拓扑图就是这样
容器互联 --link
docker run -d -P --name tom03 --link tom02 tomcat:8.0.52
新建一个容器link到tom2,注意tom2此时必须是启动状态.虽然tom03绑定了tom02,也可以Ping通,但是我们从tom02却无法ping tom03,所以这个--link只能单向绑定.
2. --link
虽然方便,但是单向绑定,操作不方便,有局限性,也不推荐使用
我们使用自定义网络模式进行容器互联
使用docker network 命令
使用docker network -l 可以查看网络模式
brige:桥接模式 docker默认 类似DNAT的模式(默认使用这种) docker run --name tom01 -d --net bridge tomcat:8.0.25
平时默认run的时候 --net bridge就是自动添加的
none:不配置网络只有回环地址 隔离性强
host: 和宿主机共享网络
container:容器网络相连(用的少,局限性大)
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好。
下面开始自定义个网络模式
主要还是用gateway,subnet 定义网关和子网
例:docker network create --gateway 192.168.0.1 --subnet 192.168.0.0/16 mynet
分别使用自定义的网络模式创建2个容器
docker run -d --name mynettom01 --network mynet tomcat:8.0.52
使用docker network inspect mynet
查看我们自定义的网络
接下来让我们试试自定义的网络中容器之间是否可以用域名访问,可以看到都是可以实现的.而且是双向的
实际企业应用中,我们可以为每个服务集群自定义一个网络 比如mysqlnet,redisnet.这样集群之间相互隔离,并且都可以用自定义的网络名字开启服务.
开启后,集群内的应用又相互访问,并且是双向的支持域名访问.
集群之间的网络互通
从上面实现了集群之间隔离,但是如果集群之间需要数据交互,也是需要打通网络的.这里开始打通集群网络的操作. 主要使用docker network connect命令实现
之前已经创建了mynet,现在再创建另外集群的子网命名为secnet
docker run -d --name tom03 --network secnet tomcat:8.0.52
docker network connect mynet tom03 docker network connect [OPTIONS] NETWORK CONTAINER
原文:https://www.cnblogs.com/Young-shi/p/14964433.html