赞
踩
1)网络间的互联通讯和端口映射
2)容器IP变动的时候可以通过网络名称访问,而不受影响
查询网络:docker network ls
新建网络:docker network create <NETWORK NAME>
删除网络: docker network rm <NETWORK ID>|<NAME>
查看网络数据源:docker network inspect 网络名字
Docker服务默认会创建一个docker0网桥(其上有一个docker0内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虛拟网卡,这就将所有容器和本地主机都放到同1个物理网络。Docker默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过网桥相互通信。
1)Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,
称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
2)docker run的时候,没有指定network的话默认使用的网桥模式就是bridge,使用的就是docker0。在宿主机ifconfig,就可以看到dockerO和自己create的network(后面讲)eth0,eth1, et......代表网卡一,网卡二,网卡..... lo代表127.0.0.1,即localhost, inet addr用来表示网卡的IP地址
3网桥dockerO创建一对一对等虚拟设备接口一个叫veth,另一个叫eth0,成对匹配。
3)整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口, 每个接口叫veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair) ;
4)每个容器实例内部也有一块网卡,每个接口叫eth0;
5)docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对;
通过上述,将宿主机上的所有容器都连接到这个内部网络上,两个容器在同一个网络下,会从这个网关下各自拿到分配的ip,此时两个容器的网络是互通的。
下面的截图可以帮助你理解etho和veth两两匹配:
容器将不会获得一个独立的NetworkNamespace,而是和宿主机共用一个NetworkNamespace。容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口。
注意:docker启动时指定--network=host或-net=host,如果还指定了-p映射端口,那这个时候就会有警告,并且通过-p设置的参数将不会起到任何作用,端口号会以主机端口号为主,重复时则递增。
解决:就是使用docker的其他网络模式,例如--network=bridge,这样就可以解决问题,或者直接无视
下面我用--network=host创建了一个容器:
可以看见宿主机的ip网卡和容器的一模一样。用 docker inspect 17a9b5bbbfb4 查看也发现容器确实没有资金的ip,说明是用的主机的ip.
禁用了网络功能,只有一个本地回环地址:lo 127.0.0.1。这种模式很少用,可以了解下。
新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。
在创建容器的时候加:--network container:共享容器名称
通过ifconfig查看他们的ip会发现一样,但是吧共享的容器停掉,那创建的这台容器ip也会消失,只有回环地址了。
自定义网络默认使用的是桥接模式。
解决的问题:容器IP变动的时候可以通过网络名称访问,而不受影响。
我们创建两个镜像u1和u2
docker run -it --name=u1 ubuntu /bin/bash
docker run -it --name=u2 ubuntu /bin/bash
此时u1的IP:172.17.0.2 u2的IP:172.17.0.3
在u1里ping 172.17.0.3是可以的,但是ping u2是不通的
注:安装ping apt install iputils-ping
此时就暴露出了上面我们提的问题。接下来看如何解决:
1)创建自定义网络: docker network create mynet
2)创建容器进入自定义网络
docker run -it --name=u3 --network mynet ubuntu /bin/bash
docker run -it --name=u4 --network mynet ubuntu /bin/bash
3)ping 容器名称
这个时候我们发现是可以ping通的。这样就可以直接用容器名称访问对方,不用写死IP了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。