Docker网络

Posted 大忽悠爱忽悠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker网络相关的知识,希望对你有一定的参考价值。


ip addr查看当前linux虚拟机的ip地址

此时有三个网络,docker是如何处理网络之间的访问的呢?


启动tomcat容器,查看其ip地址


当前linux主机可以ping通当前容器的内部

原理

1.我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker就会有一个网卡docker0

这里使用的是桥接模式,使用的是evth-pair技术


我们发现这个容器带来的网卡,都是一对出现的

evth-pair就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连

正因为有这个特性,evth-pair充当一个桥梁,连接各种虚拟网络设备


创建tomcat01和tomcat02,测试发现两个容器之间可以相互ping通


结论:

tomcat01和tomcat02共用一个路由器docker0

所有的容器不指定网络的情况下,都是docker0做路由的

docker会给我们的容器分配一个默认的可用IP


小结

Docker使用的是Linux的桥接,宿主机中是docker容器的网桥docker0

Docker中的所有的网络接口都是虚拟的,虚拟的转发效率高(内网传递文件)

只要容器删除,对应的网桥就没了


Docker --link :添加主机名和ip的映射

docker间常常需要互联或者说通信,比如后台程序访问数据库容器,一般是需要ip+端口的形式,然而ip是经常会变化的,docker中采用link来为容器起个名字,以后访问只要名字+端口就行了,这样减少了ip访问下,ip常发生变化而导致的问题

操作概述,在创建第二个容器时,将第一个容器link到第二个容器中,这样第二个容器访问第一个容器时利用名字就能访问

1.在第二个容器创建时添加一个link,如下面在创建了第一个容器test1之后创建第二个容器时:

docker run -d --name test2 --link test1 busybox /bin/sh -c "while true;do sleep 3600 ;done"

2.进入第二个容器内部

docker exec -it test2 /bin/sh

输入ping test1----->发现是可通的

但注意进入test1 ping test2是不行的,原因在于link 具有方向性,即左边的可以ping 右面的名字

本质: 在test2容器的/etc/hosts文件中添加了172.18.0.3 test1 ,即将ip映射到了test1这个域名上

现在–link已经不建议使用了


–link命令指定别名

上面–link没有为当前容器起一个名字,那么默认ip映射到test1这个容器名上,访问的时候是ping test1

docker run -d --name test --link mysql:db -p xxx:xxx test
其中mysql是指一个name为mysql的容器,db为为其指定的别名

然后在test容器中就可以使用db来代替ip来访问mysql了


自定义网络

查看所有的docker网络 — docker network ls

docker的网络模式

  • bridge : 桥接 docker默认
  • none : 不配置网络
  • host : 和宿主机共享网络
  • container : 容器网络连通(用的少)

docker network --help 查看网络相关的命令

自定义网络

# 我们直接启动命令,有默认的参数,只是省略掉了 --net bridge,而这个就是我们的docker0
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat

docker0的特点 :默认的,域名不能访问,–link可以打通连接


创建自定义网络命令:docker network create

docker network create --driver bridge --subnet 192.168.1.0/16 --gateway 192.168.1.0 mynet
解析:
--driver bridge 表示使用桥接模式
--subnet 192.168.1.0/16 表示子网ip 可以分配 192.168.1.2 到 192.168.255.255
--gateway 192.168.1.0 表示网关
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 查看网络信息


测试ping IP及name是否都可以ping通:


测试结果如下:

使用自定义网络 ping 容器的 ip 地址和名称都能 ping 通(不使用–link也可以ping通名字)

我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络

好处:不同的集群使用不同的网络,保证集群是安全和健康的


网络连通

如何打通不同网段,实现连接


打通的是容器和对应的网卡,而不是打通网卡和网卡

查看相关帮助



在不指定网络的情况下再次启动两个容器,即默认的docker0


在不打通的情况下进行测试


结果:发现ping不通


测试

测试tomcat01 连通 mynet

案例实践:docker network connect

[root@web ~]# docker network connect mynet tomcat01
[root@web ~]# docker inspect mynet

连通之后就是将tomcat01 放到了mynet网络下

官方:一个容器两个ip地址;与阿里云服务,公网ip 私网ip类似

tomcat01 连通 tomcat-net-01



**结论:假设要跨网络操作别人,就需要使用docker network connect 连通! **


推荐文章

Docker的网络配置

以上是关于Docker网络的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装

markdown [Docker] Docker片段列表和命令#linux #docker #snippets

markdown docker-compose片段

sh Docker片段

《Docker 源码分析》全球首发啦!