Docker网络


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网络通信示意图

搭建自定义网络

前面我们说过,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": ""
            }
...

子网间通信示意图

Reference

主教程: 【狂神说Java】Docker最新超详细版教程通俗易懂_哔哩哔哩_bilibili


Author: Feny Lau
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Feny Lau !
  TOC