目录
一:前言
二:Docker的网络模式
2.1:bridge 网络模式(桥接模式)
2.2:host 网络模式
2.3:none网络模式
2.4:Container 网络模式
三:Docker自定义网络(推荐)
为容器扩容其他网络
断开容器网络
移除网络
当项目大规模使用 Docker 时,容器通信的问题也就产生了。要解决容器通信问题,必须先了解很多关于网络的知识。
安装 Docker 以后,会默认创建三种网络"bridge", "host", "null", 通过 docker network ls 查看
[root@vm03 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
0f05bed2f9ee bridge bridge local
ca3153ca103e host host local
8707db62b9fc none null local
网络模式 |
简介 |
bridge |
为每一个容器分配、设置 IP 等,并将容器连接到一个 docker0 虚拟网桥,默认为该模式。 |
host |
容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。 |
none |
容器有独立的 Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,IP 等。 |
container |
新创建的容器不会创建自己的网卡和配置自己的 IP,而是和一个指定的容器共享IP、端口范围等。 |
重点:在该模式中,Docker 守护进程创建了一个虚拟以太网桥 docker0
默认情况下,守护进程会创建一对对等虚拟设备接口 veth pair ,将其中一个接口设置为容器的eth0 接口(容器的网卡),另一个接口放置在宿主机的命名空间中,以类似 vethxxx 这样的名字命名,从而将宿主机上的所有容器都连接到这个内部网络上。
举例说明容器与宿主机的网络如何通信:
1:查看宿主机ip信息,发现已经默认创建docker0 内网ip 172.17.0.1
2: 运行一个容器查看内部ip信息, 会发现容器内部会创建14: eth0@if15的网卡,内网ip 172.17.0.3
3查看宿主机网卡信息变化:发现docker创建一对对等虚拟接口15: vethd8bd694@if14
容器内部是14: eth0@if15 宿主机是15: xxx@if14 两个是对等的,而且容器内与docker0在一个虚拟网段
概述:
1:host 网络模式需要在创建容器时通过参数 --net host 或者 --network host 指定;
2:采用 host 网络模式的 Docker Container,可以直接使用宿主机的 IP 地址与外界进行通信,若宿主机的 eth0 是一个公有 IP,那么容器也拥有这个公有 IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行 NAT 转换;
3:host 网络模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。
举例理解:host网络模式
1:通过制定host模式运行容器
docker run -itd --name centos7_02 --network host centos:7
2:进入容器查看网卡信息可以发现,host模式启动的容器会保留宿主机的网卡这里是192.168.8.210,docker0网卡也存在,这也说明与其它容器在一个内网上
我们可以通过 docker network inspect host 查看所有 host 网络模式下的容器,在 Containers 节点中可以看到容器名称。
概述:
none 网络模式是指禁用网络功能,只有 lo 接口 local 的简写,代表 127.0.0.1,即 localhost 本地环回接口。在创建容器时通过参数 --net none 或者 --network none 指定;
none 网络模式即不为 Docker Container 创建任何的网络环境,容器内部就只能使用 loopback网络设备,不会再有其他的网络资源。可以说 none 模式为 Docke Container 做了极少的网络设定,但是俗话说得好“少即是多”,在没有网络配置的情况下,作为 Docker 开发者,才能在这基础做其他无限多可能的网络定制开发。这也恰巧体现了 Docker 设计理念的开放。
Container 网络模式是 Docker 中一种较为特别的网络的模式。在创建容器时通过参数 --net
container:已运行的容器名称|ID 或者 --network container:已运行的容器名称|ID 指定;
处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用 localhost 高效快
速通信。
Container 网络模式即新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样两个容器除了网络方面相同之外,其他的如文件系统、进程列表等还是隔离的。
举例说明:
使用容器centos7_02网络创建一个新容器centos7_05
docker run -itd --name centos7_05 --network container:centos7_02 centos:7
1:查看新容器centos7_02网卡信息
2:查看容器centos7_05网卡信息
可以发现新建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等
容器间网络通信必须要有属于同一个网络的网卡。在同一个自定义网络下
虽然 Docker 提供的默认网络使用比较简单,但是为了保证各容器中应用的安全性,在实际开发中更推荐使用自定义的网络进行容器管理
创建一个基于 bridge 网络模式的自定义网络模式 new_network
docker network create new_network
通过自定义网络模式 new_network创建容器
docker run -itd --name centos7_07 --network new_network centos:7
查看新建容器网络
docker container inspect centos7_07
docker network connect bridge centos7_07
docker network disconnect bridge centos7_07
docker network rm new_network
注意:如果通过某个自定义网络模式创建了容器,则该网络模式无法删除。