1、概述
Docker 容器和服务如此强大的原因之一是您可以将它们连接在一起,或将它们连接到非 Docker 工作负载。Docker 容器和服务甚至不需要知道它们部署在 Docker 上,或者它们的对等体是否也是 Docker 工作负载。无论您的 Docker 主机运行 Linux、Windows 还是两者的混合体,您都可以使用 Docker 以与平台无关的方式管理它们。
上述描述是Docker官网描述 Docker network的。说白了,Docker network 可以连接多个容器,使容器之间可以互相通信,并且是容器与Docker宿主机之前通信的桥梁。所以说Docker network在Docker体系中至关重要。
2、Docker network 相关命令
帮助文档
命令 | 说明 |
---|---|
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默认创建了3个网络,我们分别介绍下3种网络
docker启动后,会在宿主机上创建一个docker0的虚拟网桥
3.1、bridge 模式
bridge模式是docker中默认的网络,它会为每个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,默认为改模式。
它就像个交换机,负责宿主机到容器之间的联通。
使用--network bridge指定,默认使用docker0
docker run -it centos:7 /bin/bash 等价于 docker run -it --network bridge centos:7 /bin/bash
注意:这种模式官网是不推荐使用的,咱们看下反例
查看两个容器IP
这个时候突然centos01挂了,我们又启动了一个centos03,咱们再看看IP变化
咱们可以看出原本属于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 指定
注意:因为和宿主机公用端口等,此时容器再指定不同的映射端口就会有警告,咱们以tomcat8 为例验证
3.3、none模式
host模式,容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair和网桥连接、IP等
使用--network none指定
禁用网络功能,只有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
进入各自容器ping对方
结论:在bridge网络模式下,容器之间可以以IP通信,不能以容器名称通信
- 自定义网络模式下,创建两个centos7容器,分别是 centos01和centos02,然后进入各自容器用IP和容器名称分别ping对方看看效果
先创建自定义网络my_net:
命令:
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
进入各自容器ping对方
结论:在自定义网络模式下,容器之间可以不以IP通信,而是以容器名称通信(这种方式也是生产环境所推荐的)