Docker网络
背景
此前在Docker入门中,我们实现了软件的快速部署,和自定义镜像的制作,而为了实现多容器之间的通信,Docker网络就必须要安排上了
Docker入门中跟随的是easydock的教程进行学习,但内容过于简练,不利于理解,后续发现狂神的教学视频,仿佛复现了宝藏,本篇文章算是狂神Docker基础的学习笔记,主要记录了Docker网络基本原理及容器间通信实现,B站神评镇楼.
Docker默认网络配置
我们在创建容器时不指定子网,则会自动使用docker0网络(即下表中的NAME为bridge的网络).
docker network ls
>>
NETWORK ID NAME DRIVER SCOPE
693339080ebd bridge bridge local # 即桥接docker0网络,容器不指定网络默认使用此网络,但是无法通过域名访问
b595981011a1 host host local
8255d5c8aa86 none null local
Docker0网络网卡信息
服务器网卡
docker0 : 安装docker时生成的网卡,,使用evth-pair技术,充当容器之前通信的路由器
数字网卡: 容器启动时会在服务器和容器内各生成一个虚拟网卡,比如下图中的82,83网卡( 通过网卡名称可以看出2个网卡是互相链接的)
容器网卡
数字网卡: 容器启动时生成,与服务器网卡链接
evth-pair: 通过虚拟设备接口,evth-pair可以充当一个桥梁,链接各种网络虚拟设备
Docker0网络通信原理
从下图中可以看出, 容器和宿主机通过虚拟网卡,网卡驱动使用bridge模式,互相通信;而容器与容器之间通过宿主机的docker0网络互相通信
搭建自定义网络
前面我们说过,Docker0网络使用的最大问题是,无法使用容器名进行容器之间的通信,而自定义网络可以解决这一问题
网络模式连接方式分类
docker有4中网络链接方式,我们一般只是用bridge
bridge: 桥接(docker默认)
none: 不配置网络
host: 和宿主机共享网络
container: 容器内网络连通
docker network命令
network常用命令记录如下,详细信息可以直接通过 –help查看帮助,非常有用
docker network ls # 查看网络列表
docker network inspect $network_id # 查看网络配置信息
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
# 创建一个docker网络 使用桥接模式 子网配置 网管配置 网络名称
docker network inspect $网络名/$网络id # 查看网络信息配置
docker network connect [OPTIONS] NETWORK CONTAINER # 连接容器与一个网络
# 底层逻辑: 给一个容器分配2个ip,分别放置在2个网络中(如docker0,mynet),就可以与2个网络中的所有容器进行通信
自定义网络
我们的自定义网络虽然也和Docker0一样使用bridge模式,但是Docker中的自定义网络会提供自动的DNS域名解析,即可以通过别名解析ip地址.所以通过自定义网络,我们就实现了容器之间使用容器名进行通信,避免使用频繁变动的ip地址
# 1.创建子网
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
# 2 创建容器,指定网络名称
docker run -d -P --name tomcat-net1 --net mynet fenylau/tomcat:ping
docker run -d -P --name tomcat-net2 --net mynet fenylau/tomcat:ping
# 此时如果查看mynet网络就会发现2个网络可以互相ping通
子网(subnet): 不要求准确性的情况下,和局域网是一个概念.docker配置子网时,主要是配置子网的网段,同一网段下的容器可以互相通信
网关(gateway)**: 即一个网络到另一个网络的”关口”,配置的ip地址,即局域网中网络请求出口的ip地址
子网间通信打通
核心命令docker connect
底层逻辑实际是通过给一个容器分配多个ip,使得此容器同时处于多个网络中,最终实现一个容器与多个子网中的容器通信
docker run -id --name tomcat02 fenylau/tomcat:ping # 创建容器不指定网络,此容器默认使用docekr0
docker network connect mynet tomcat02 # 连接网络mynet和toncat02容器
docker network inspect mynet # 查看mynet配置中是否出现容器tomcat2
>
...
"d625ce729bb480700dc803862594a1bc0ae4acb60a0f18d66320ce57b8e4bfef": {
"Name": "tomcat02",
"EndpointID": "543d367220b6608cddf80c75526dd23d531e2c55e9a59b0cdb9673b657cf671e",
"MacAddress": "02:42:c0:a8:00:04",
"IPv4Address": "192.168.0.4/16",
"IPv6Address": ""
}
...