当前位置:   article > 正文

Docker微服务-网络network_docker network create

docker network create

1、作用

        1)网络间的互联通讯和端口映射

        2)容器IP变动的时候可以通过网络名称访问,而不受影响

2、常用命令

查询网络:docker network ls

新建网络:docker network create <NETWORK NAME>

删除网络: docker network rm <NETWORK ID>|<NAME>

查看网络数据源:docker network inspect 网络名字

3、bridge模式

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两两匹配: 

 

 4、host模式

容器将不会获得一个独立的NetworkNamespace,而是和宿主机共用一个NetworkNamespace。容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口。

注意:docker启动时指定--network=host或-net=host,如果还指定了-p映射端口,那这个时候就会有警告,并且通过-p设置的参数将不会起到任何作用,端口号会以主机端口号为主,重复时则递增。
解决:就是使用docker的其他网络模式,例如--network=bridge,这样就可以解决问题,或者直接无视

下面我用--network=host创建了一个容器:

可以看见宿主机的ip网卡和容器的一模一样。用  docker inspect 17a9b5bbbfb4 查看也发现容器确实没有资金的ip,说明是用的主机的ip.

5、none模式

禁用了网络功能,只有一个本地回环地址:lo 127.0.0.1。这种模式很少用,可以了解下。

 6、container模式

新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。

在创建容器的时候加:--network container:共享容器名称

通过ifconfig查看他们的ip会发现一样,但是吧共享的容器停掉,那创建的这台容器ip也会消失,只有回环地址了。

8、自定义网络模式

自定义网络默认使用的是桥接模式。

解决的问题:容器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了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/229494
推荐阅读
相关标签
  

闽ICP备14008679号