Docker 网络

简介: Docker 网络


网桥

在一台未经特殊网络配置的Ubuntu机器上安装完Docker之后,在宿主机上通过ifconfig命令可以看到多 了一块名为docker0的网卡。该网卡即是docker0网桥,网桥在这里的作用相当于交换机,为连接在其上的设备转发数据帧。网桥上的veth网卡设备相当于交换机上的端口,可以将多个容器或虚拟机连接其上,这些端口工作在二层,所以是不需要配置IP信息的。

CNM

CNM(Container Network Model)译为容器网络模型,定义了构建容器虚拟化网络的模型。该模型主 要包含三个核心组件 沙盒、端点、网络。

沙盒:一个沙盒包含了一个容器网络栈的信息。沙盒可以对容器的接口、路由和DNS设置进行管理。一个沙盒可以有多个端点和网络。

端点:一个端点可以加入一个沙盒和一个网络。一个端点只可以属于一个网络并且只属于一个沙盒。

网络:一个网络是一组可以直接互相联通的端点。一个网络可以包含多个端点。

libnetwork

libnetwork 实现了CNM 的Docker网络组件库。libnetwork内置了几种网络驱动。

bridge驱动。此驱动为Docker的默认设置,使用这个驱动的时候,libnetwork将创建出来的docker容器连接到Docker网桥上。作为最常规的模式,bridge模式已经可以满足docker容器最基本的使用需求了。

host驱动。使用这种驱动的时候,libnetwork将不为docker容器创建网络协议栈,即不会创建独立的 network namespace。Docker容器中的进程处于宿主机的网络环境中,相当于docker容器与宿主机共同使用一个network namespace,使用宿主机的网卡、IP和端口等信息。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

overlay驱动。通过网络虚拟化技术,在同一个物理网络上构建出一张或多张虚拟的逻辑网络。适合大规模的云计算虚拟化环境。

remote 驱动。这个驱动实际上并没有做真正的网络服务实现,而是调用了用户自行实现的网络驱动插 件,使libnetwork实现了驱动的可插件化,更好的满足了用户的多种需求。用户只要根据libnetwork提 供的协议标准,实现其所要求的各个接口并向Docker daemon进行注册。

null 驱动。使用这种驱动的时候,Docker容器拥有自己的network namespace,但是并不为Docker容 器进行任何网络配置。也就是说,这个Docker容器除了network namespace 自带的loopback网卡外, 没有其他任何网卡、ip、路由等信息,需要用户为Docker容器添加网卡、配置IP等。这种模式如果不进 行特定的配置是无法正常使用的,但有点也非常明显,它给了用户最大的自由度来定义容器的网络环 境。

实操

运行一个docker容器,查看CNM三个概念

// 运行一个容器

docker run -d -it --name myubuntu ubuntu /bin/bash

//查看容器详信息

docker inspect myubuntu

docker network常用命令

//连接一个容器到一个网络
docker network connect Connect a container to a network
//创建一个网络
docker network create Create a network
//将容器从一个网络中断开
docker network disconnect Disconnect a container from a network
//查看网络的详细信息
docker network inspect Display detailed information on one or more networks
//查看网络列表
docker network ls List networks
//移除所有为使用的网络
docker network prune Remove all unused networks
//移除一个或多个网络
docker network rm Remove one or more networks

查看docker0在内核路由表上的记录

假设docker0 IP地址为 172.17.0.1/16

route -n

通过以上命令可以找到一条静态路由,该路由表示所有目的IP地址为172.17.0.0/16的数据包都从 docker0网卡发出。

查看网络列表

1. 查看宿主机已有网络列表

docker network ls

docker 安装后默认创建了三个驱动的网络

//查看bridge 网络详细信息

docker network inspect bridge

默认情况下,我们启动的容器都接入到了默认的bridge 网络中,该网络以docker0为网关同外界交互

2. 运行两个容器,它们会加入默认网络,同时网桥上会多出两个无IP地址的网卡,作为端口让容器接入网桥

docker run -d -p 80:80 nginx

docker run -d -p 81:80 nginx

//查看bridge 网络有哪些容器被接入了

docker network inspect bridge

//通过brctl show 查看宿主机上网桥信息(需要安装bridge-utils软件包)

brctl show

可以看到网桥下面接入了很多虚拟网卡,这些网卡都没有ip地址,因为网桥是在链路层工作,是网 络第二层,通讯方式不是通过ip,所以这些虚拟网卡无需ip,而这些网卡充当了网桥上端口的角色,为 容器的接入提供支持。

//通过ifconfig可以查看宿主机上的网卡信息

ifconfig

3. 分别进入两个nginx容器尝试相互访问

//通过docker exec 进入容器

//通过docker inspect 查看容器IP

//容器内部相互curl访问http://IP:80端口

加入网络

docker network connect br0 jovial_proskuriakova

断开网路

docker network disconnect br0 jovial_proskuriakova

网络隔离效果展示

1. 创建两个bridge网络

docker network create backend

docker network create frontend

2. 通过一些命令展示创建后的网络的一些属性,以及计算机上的变化

//查看宿主机网卡变化

ifconfig

//查看网络属性

docker network ls

docker network inspect backend

docker network inspect frontend

//查看路由规则

route -n

3. 运行两个nginx 容器,分别指定到两个网络

docker run -d -p 83:80 --name mynginx1 --net backend nginx

docker run -d -p 84:80 --name mynginx2 --net frontend nginx

//通过docker exec 进入容器

//通过docker inspect 查看容器IP

//容器内部相互curl访问http://IP:80端口

上述操作,表明两个不再一个网络的两个容器间是无法相互访问的。那么我们增加一个网络,将两个容器接入到新增的网络中

docker network create middle

docker network connect middle mynginx1

docker network connect middle mynginx2

//查看容器详细信息,关注网络部分

从容器详情可以看出,容器多了一个网卡。容器每接入一个网络,就会生成一个对应的网卡。那么 我们不难想象到,我们每新建一个容器,会产生两个网卡,第一个是容器内部的网卡用来与网桥通讯的;第二个是网桥上的无IP网卡,用来充当网桥端口的,供容器接入的。

4. 通过共同网络去实现容器间相互访问

//通过docker exec 进入容器

//通过docker inspect 查看容器IP

//容器内部相互curl访问http://IP:80端口

创建host驱动网络,向网络添加容器,演示网卡数,容器网络等情况

1. 创建host驱动的网络实例,注意:一个宿主机只允许有一个host驱动的网络实例

//创建一个host驱动的网络实例

docker network create --driver host host1

2.运行一个基于host的网络实例的nginx容器

//运行容器

docker run -d --net host nginx

//访问本机80端口

curl http://localhost

3. 查看各种信息

//ifconfig 查看宿主机网卡,并没有应为创建了host网络上的容器而增加网卡信息

ifconfig

//查看host 网络实例信息

docker network inspect host

//查看容器网络信息

docker inspect <容器ID>

容器在接入host网络后,已经不具备独立的IP地址了。甚至于运行容器 -p 参数都被禁用了。我们可 以尝试运行一个nginx 指定-p参数,并查看容器运行日志

目录
相关文章
|
19天前
|
Docker 容器
docker swarm启动服务并连接到网络
【10月更文挑战第16天】
20 5
|
19天前
|
调度 Docker 容器
docker swarm创建覆盖网络
【10月更文挑战第16天】
13 5
|
20天前
|
负载均衡 网络协议 关系型数据库
docker swarm 使用网络启动服务
【10月更文挑战第15天】
19 4
|
21天前
|
应用服务中间件 nginx Docker
docker swarm创建覆盖网络
【10月更文挑战第14天】
16 3
|
20天前
|
数据安全/隐私保护 Docker 容器
docker swarm创建网络
【10月更文挑战第15天】
10 1
|
21天前
|
Docker 容器
docker swarm 在服务中使用网络
【10月更文挑战第14天】
17 2
|
5天前
|
Docker 容器
【赵渝强老师】Docker的None网络模式
Docker容器在网络方面实现了逻辑隔离,提供了四种网络模式:bridge、container、host和none。其中,none模式下容器具有独立的网络命名空间,但不包含任何网络配置,仅能通过Local Loopback网卡(localhost或127.0.0.1)进行通信。适用于不希望容器接收任何网络流量或运行无需网络连接的特殊服务。
|
5天前
|
Docker 容器
【赵渝强老师】Docker的Host网络模式
Docker容器在网络环境中是隔离的,可通过配置不同网络模式(如bridge、container、host和none)实现容器间或与宿主机的网络通信。其中,host模式使容器与宿主机共享同一网络命名空间,提高性能但牺牲了网络隔离性。
|
5天前
|
Kubernetes Docker 容器
【赵渝强老师】Docker的Container网络模式
Docker容器在网络环境中彼此隔离,但可通过配置不同网络模式实现容器间通信。其中,container模式使容器共享同一网络命名空间,通过localhost或127.0.0.1互相访问,提高传输效率。本文介绍了container模式的特点及具体示例。
|
5天前
|
Linux Docker 容器
【赵渝强老师】Docker的Bridge网络模式
本文介绍了Docker容器的网络隔离机制及其四种网络模式:bridge、container、host和none。重点讲解了默认的bridge模式,通过示例演示了如何创建自定义bridge网络并配置容器的网络信息。文中还附有相关图片和视频讲解,帮助读者更好地理解Docker网络的配置和使用方法。