本地网络信息
三个网络,分别代表不同的环境
一、问题
1. docker网络是如何处理容器网络访问的?
//运行一个 tomcat 实例,测试看看
docker run -d -P --name tomcat01 tomcat
查看容器的Ip地址
docker exec -it tomcat01 ip addr
查看宿主主机是否能ping通容器
通过测试,宿主主机可以ping通容器!!!
查看容器是否能ping通外面的网络
通过测试,容器内可以ping通:“内网、docker0”网络地址!!!
网络的互通,思路如下:
细心的同学,可能发现,tomcat01的网络地址是172.17.0.2,而docker0的网络地址是172.17.0.1,由此可以得出它们在同一个网段!
还有就是容器和容器之间是可以互相ping通的
绘制网络模型图
tomcat01和tomcat02是共用一个路由器,docker0。
所有容器不指定网络的情况下,都是docker0路由器,docker会给我们的容器分配一个默认可用IP
科普网络基础知识
一、网络地址
IP地址由网络号(包括子网号)和主机号组成,网络地址的主机号为全0,网络地址代表着整个网络。
二、广播地址
广播地址通常称为直接广播地址,是为了区分受限广播地址。
广播地址与网络地址的主机号正好相反,广播地址中,主机号为全1。当向某个网络的广播地址发送消息时,该网络内的所有主机都能收到该广播消息。
三、组播地址
D类地址就是组播地址。
先回忆下A,B,C,D类地址吧:
A类地址以0开头,第一个字节作为网络号,地址范围为:0.0.0.0~127.255.255.255;(modified @2016.05.31)
B类地址以10开头,前两个字节作为网络号,地址范围是:128.0.0.0~191.255.255.255;
C类地址以110开头,前三个字节作为网络号,地址范围是:192.0.0.0~223.255.255.255。
D类地址以1110开头,地址范围是224.0.0.0~239.255.255.255,D类地址作为组播地址(一对多的通信);
E类地址以1111开头,地址范围是240.0.0.0~255.255.255.255,E类地址为保留地址,供以后使用。
注:只有A,B,C有网络号和主机号之分,D类地址和E类地址没有划分网络号和主机号。
四、回环地址
127.0.0.0/8被用作回环地址,回环地址表示本机的地址,常用于对本机的测试,用的最多的是127.0.0.1。
五、A/B/C/D 类私有地址
私有地址(private address)也叫专用地址,它们不会在全球使用,只具有本地意义。
A类私有地址:10.0.0.0/8,范围是:10.0.0.0~10.255.255.255
B类私有地址:172.16.0.0/12,范围是:172.16.0.0~172.31.255.255
C类私有地址:192.168.0.0/16,范围是:192.168.0.0~192.168.255.255
Docker中的 –link
思考一个场景,我们编写了一个微服务,database url=ip,项目不重启,数据库ip换掉了,我们希望可以处理这个问题,可以用名称来进行访问容器吗?
root@liang:/home/joila# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
44a4e3e12a05 tomcat "catalina.sh run" 5 seconds ago Up 4 seconds 0.0.0.0:32770->8080/tcp tomcat02
3a8958037482 tomcat "catalina.sh run" 16 hours ago Up 16 hours 0.0.0.0:32769->8080/tcp tomcat01
root@liang:/home/joila# docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known
# 如何可以解决这个问题呢?
通过 –link 命令 实现 连接
# 通过 --link 就可以解决网络连通问题
root@liang:/home/joila# docker run -d -P --name tomcat03 --link tomcat02 tomcat
c434b500fd9b34e61d6eb6e5758e550c5d42559687d433ebb860db9ac33b1841
root@liang:/home/joila# docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.081 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.048 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.079 ms
# 通过命令查看 link信息
root@liang:/home/joila# docker inspect tomcat03
通过查看 host配置,探究原理
本质探究:
–link 就是我们咋 hosts配置中增加了一个 172.18.0.3 tomcat02 44a4e3e12a05
我们现在在实际操作Docker网络中,不建议使用 –link !!
如何自定义网络?
一、查看所有的Docker网络
1. 网络模式
模式 | 描述 |
bridge | 桥接docker(默认) |
none | 不配置网络 |
host | 和宿主主机共享网络 |
container | 容器网络连通(用的少,局限很大) |
二、自定义一个网络
# 查看网络的帮助说明
docker network --help
1. 创建一个桥接网络
# 查看创建桥接网络的帮助说明
docker network create --help
我们自定义创建网络的命令
# --driver 模式
# --subnet 子网
# --gateway 网关
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
# 探究刚刚创建的自定义网络的详细信息
docker network inspect mynet
# 启动两个容器并关联网络模式,进行测试
docker run -d -P --name tomcat-net-01 --net mynet tomcat
docker run -d -P --name tomcat-net-02 --net mynet tomcat
# 再次探究自定义网络的详细信息
docker network inspect mynet
不使用 –link,也可以ping容器名称了!
我们自定义的网络,docker都已经帮我们维护好了对应的关系,所以在平时业务场景中,推荐这样使用docker网络!
三、优势
服务 | 好处 |
redis集群 | 不同的集群使用不同的网络,保证集群是安全和健康的! |
mysql集群 | 不同的集群使用不同的网络,保证集群是安全和健康的 |
自定义网络如何连通不同网段?
一、测试
# 启动两个容器,且网络模式默认的docker0
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat02 tomcat
测试 tomcat01 是否可以 ping 通 tomcat-net-02
结果:两个容器不在同一个网段,ping是肯定肯定不会通的
二、打通两个不同网段的容器
# 查看连通帮助文档
docker network connect --help
实现 tomcat01 打通 mynet网络模式
docker network connect mynet tomcat01
打通后,术语就是:一个容器,两个ip地址
测试是否ping的通
结论:假设要跨网操作别的网段,就需要使用 docker network connect 连通
结论
Docker使用的是Linux的桥接,宿主主机中是一个Docker容器的网桥 docker0
Docker中的所有网络接口是虚拟的。虚拟的转发效率高(内网传递数据)!!!