1、概述

        Docker 容器和服务如此强大的原因之一是您可以将它们连接在一起,或将它们连接到非 Docker 工作负载。Docker 容器和服务甚至不需要知道它们部署在 Docker 上,或者它们的对等体是否也是 Docker 工作负载。无论您的 Docker 主机运行 Linux、Windows 还是两者的混合体,您都可以使用 Docker 以与平台无关的方式管理它们。

        上述描述是Docker官网描述 Docker network的。说白了,Docker network 可以连接多个容器,使容器之间可以互相通信,并且是容器与Docker宿主机之前通信的桥梁。所以说Docker network在Docker体系中至关重要。

2、Docker network 相关命令

帮助文档

docker run 后面跟目录_IP

命令

说明

docker network ls

列出当前所有的网络

 docker network create 网络名称        

创建新的网络

docker network rm 网络名称        

删除已创建网络

docker network inspect 网络名称

查看网络信息

docker network prune

删除所有不用的网络

docker network connect [OPTIONS] NETWORK CONTAINER

连接一个容器和网络

docker network disconnect [OPTIONS] NETWORK CONTAINER

断开连接一个容器和网络

3、主流网络模式详解

docker run 后面跟目录_docker run 后面跟目录_02

docker默认创建了3个网络,我们分别介绍下3种网络

docker启动后,会在宿主机上创建一个docker0的虚拟网桥

docker run 后面跟目录_centos_03

3.1、bridge 模式

        bridge模式是docker中默认的网络,它会为每个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,默认为改模式。

它就像个交换机,负责宿主机到容器之间的联通。

使用--network bridge指定,默认使用docker0

docker run 后面跟目录_docker run 后面跟目录_04

 docker run -it centos:7 /bin/bash  等价于  docker run -it --network bridge  centos:7 /bin/bash

注意:这种模式官网是不推荐使用的,咱们看下反例

docker run 后面跟目录_centos_05

查看两个容器IP

docker run 后面跟目录_IP_06

这个时候突然centos01挂了,我们又启动了一个centos03,咱们再看看IP变化

docker run 后面跟目录_docker_07

 咱们可以看出原本属于centos01的IP 172.17.0.2 被分配给centos3容器了,这在传统的服务器上是不可思议的。

我们的微服务项目连接redis、mysql等中间件都是以IP访问的,这个时候如果部署到docker还是以IP访问,岂不是乱套了。

虽然IP变了,但是容器名称不会变化,所以springboot项目部署到docker中连接redis、mysql等中间件要以容器名称连接调用

3.2、host 模式

        host模式,容器不会虚拟出自己的网卡、配置自己的IP等,而是使用宿主机IP和端口。

使用--network host 指定

docker run 后面跟目录_IP_08

 

docker run 后面跟目录_IP_09

 注意:因为和宿主机公用端口等,此时容器再指定不同的映射端口就会有警告,咱们以tomcat8 为例验证

docker run 后面跟目录_IP_10

3.3、none模式

        host模式,容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair和网桥连接、IP等

使用--network none指定

docker run 后面跟目录_docker run 后面跟目录_11

 禁用网络功能,只有lo标识(就是127.0.0.1表示本地回环)

3.4、container模式

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

3.5、自定义网络(推荐)

在3.1中我们说过 bridge模式下,容器的IP可能会变化,最好就别用IP通行,直接通过容器名称通讯。

咱们分两拨验证

  • bridge 模式下,创建两个centos7容器,分别是 centos01和centos02,然后进入各自容器用IP和容器名称分别ping对方看看效果

命令:

docker run -it --name centos01 centos:7 /bin/bash
docker run -it --name centos02 centos:7 /bin/bash

查看各自容器IP

docker run 后面跟目录_docker run 后面跟目录_12

 进入各自容器ping对方

docker run 后面跟目录_docker run 后面跟目录_13

 

docker run 后面跟目录_centos_14

结论:在bridge网络模式下,容器之间可以以IP通信,不能以容器名称通信

  • 自定义网络模式下,创建两个centos7容器,分别是 centos01和centos02,然后进入各自容器用IP和容器名称分别ping对方看看效果

先创建自定义网络my_net:

docker run 后面跟目录_docker_15

命令:

docker run -it --name centos01 --network my_net centos:7 /bin/bash
docker run -it --name centos02 --network my_net centos:7 /bin/bash

创建并查看各自IP

docker run 后面跟目录_IP_16

 进入各自容器ping对方

docker run 后面跟目录_IP_17

docker run 后面跟目录_centos_18

 结论:在自定义网络模式下,容器之间可以不以IP通信,而是以容器名称通信(这种方式也是生产环境所推荐的)