Docker网络

本地网络信息

三个网络,分别代表不同的环境

一、问题

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中的所有网络接口是虚拟的。虚拟的转发效率高(内网传递数据)!!!

DockerDocker internetDocker网络
暂无评论

发送评论 编辑评论


				
上一篇
下一篇