Docker 核心技术之网络管理
为什么需要Docker网络管理
- 容器的网络默认与宿主机、与其他容器都是相互隔离。
 - 容器中可以运行一些网络应用(如nginx、web应用、数据库等),如果要让外部也可以访问这些容器内运行的网络应用,那么就需要配置网络来实现。
 - 有可能有的需求下,容器不想让它的网络与宿主机、与其他容器隔离。
 - 有可能有的需求下,容器根本不需要网络。
 - 有可能有的需求下,容器需要更高的定制化网络(如定制特殊的集群网络、定制容器间的局域网)。
 - 有可能有的需求下, 容器数量特别多,体量很大的一系列容器的网络管理如何
 - ……
 
因此容器的网络管理是非常重要的
Docker中有哪些网络驱动模式
Docker有五种网络驱动模式
- bridge network 模式(网桥):默认的网络模式。类似虚拟机的nat模式
 - host network 模式(主机):容器与宿主机之间的网络无隔离,即容器直接使用宿主机网络
 - None network 模式:容器禁用所有网络。
 - Overlay network 模式(覆盖网络): 利用VXLAN实现的bridge模式
 - Macvlan network 模式:容器具备Mac地址,使其显示为网络上的物理设备
 
查看网络 – docker network ls
docker network -h

作用:
- 查看已经建立的网络对象
 
命令格式:
- docker network ls [OPTIONS]
 
命令参数(OPTIONS):
- -f, --filter filter 过滤条件(如 'driver=bridge’)
 - --format string 格式化打印结果
 - --no-trunc 不缩略显示
 - -q, --quiet 只显示网络对象的ID
 
注意:
- 默认情况下,docker安装完成后,会自动创建bridge、host、none三种网络驱动
 
命令演示
docker network ls
DRIVER 表示网络模式 SCOPE 表示使用的范围,local 表示当前宿主机 ID 表示当前网络的指纹

创建网络 – docker network create
docker network create -h

作用:
- 创建新的网络对象
 
命令格式:
- docker network create [OPTIONS] NETWORK
 
命令参数(OPTIONS):
- -d, --driver string 指定网络的驱动(默认 "bridge")
 - --subnet strings 指定子网网段(如192.168.0.0/16、172.88.0.0/24)
 - --ip-range strings 执行容器的IP范围,格式同subnet参数
 - --gateway strings 子网的IPv4 or IPv6网关,如(192.168.0.1)
 
注意:
- host和none模式网络只能存在一个
 - docker自带的overlay 网络创建依赖于docker swarm(集群负载均衡)服务
 - 192.168.0.0/16 等于 192.168.0.0~192.168.255.255
 - 172.88.0.0/24 等于 172.88.0.0~172.88.0.255
 
命令演示
docker network create -d bridge my-bridge docker network ls

网络删除 – docker network rm
docker network rm -h

作用:
- 删除一个或多个网络
 
命令格式:
- docker network rm NETWORK [NETWORK...]
 
命令参数(OPTIONS):
- 无
 
命令演示
docker network rm 6a95

查看网络详细信息 – docker network inspect
docker network inspect -h

作用:
- 查看一个或多个网络的详细信息
 
命令格式:
- docker network inspect [OPTIONS] NETWORK [NETWORK...]
 - 或者 docker inspect [OPTIONS] NETWORK [NETWORK...]
 
命令参数(OPTIONS):
- -f, --format string 根据format输出结果
 
命令演示
docker network inspect -f '{{json .Name}}' 466c8e986b0b

使用网络 – docker run --network
作用:
- 为启动的容器指定网络模式
 
命令格式:
- docker run/create --network NETWORK
 
命令参数(OPTIONS):
- 无
 
注意:
- 默认情况下,docker创建或启动容器时,会默认使用名为bridge的网络
 
在运行一个容器的时候指定网络
命令演示
创建一个容器,为其指定一个网络,默认指定的是 bridge 的网络
docker run --network my-bridge --name centos-net -dti centos bash docker images -a

bridge 和 host 的网络模式,默认都是可以连接外网的,所以可以在容器内测试
docker exec 6dca ping www.baidu.com

网络连接与断开 – docker network connect/disconnect
作用:
- 将指定容器与指定网络进行连接或者断开连接
 
命令格式:
- docker network connect [OPTIONS] NETWORK CONTAINER
 - docker network disconnect [OPTIONS] NETWORK CONTAINER
 
命令参数(OPTIONS):
- -f, --force 强制断开连接(用于disconnect)
 
命令演示 (查看一个容器的网络信息)
docker inspect 6dca

断开该网络
docker network disconnect bridge 6dca docker inspect 6dca

一个容器可以多个网络并存
docker network connect my-bridge 6dca docker inspect 6dca

注意:
- none 和 bridge 网络不能同时存在
 - Overlay 和 host 网络不能进行connet 和disconnet
 
bridge 网络模式(一)
特点:
- 宿主机上需要单独的bridge网卡,如默认docker默认创建的docker0。
 - 容器之间、容器与主机之间的网络通信,是借助为每一个容器生成的一对veth pair虚拟网络设备对,进行通信的。一个在容器上,另一个在宿主机上。
 - 每创建一个基于bridge网络的容器,都会自动在宿主机上创建一个veth**虚拟网络设备。
 - 外部无法直接访问容器。需要建立端口映射才能访问。
 - 容器借由veth虚拟设备通过如docker0这种bridge网络设备进行通信。
 - 每一容器具有单独的IP
 

docker 安装后默认有 3 种网络模式
docker network ls

查看网卡可以看到 docker0 是我们安装完 docker 后默认的网卡 ,它的ip地址是 172.17.0.1

查看 bridge 网络信息
docker inspect bridge

可以发现网关和 docker0 的 ip 地址一致
创建一个 mybridge 的网络,默认是 bridge 网络
docker network create my-bridge docker inspect my-bridge


可以看到创建了一个 bridge 的网络后,宿主机又增加了一个网卡,IP地址和新创建的 网关一致
使用 mybridge 网络创建一个容器
docker run -dti --network my-bridge centos docker exec eb4 yum install -y net-tools docker exec eb4 ifconfig
创建一个容器后,宿主机多了一个 veth** 的网络设备

容器中的 etho 的网卡与宿主机上的 veth* 进行匹配,就可以实现容器与容器之间,容器与宿主机之间通信
 
创建一个定制的桥接网络 custom-bridge (IP 地址的范围必须早子网掩码的范围内,gateway 在 iprange的范围内)
docker network create --subnet 192.168.0.0/16 --ip-range 192.168.8.0/24 --gateway 192.168.8.254 custom-bridge
查看 custom-bridge 网络信息
docker inspect custom-bridge

使用 custom-bridge 网络
docker run -dti --network custom-bridge centos
 
查看新创建容器的网络
docker inspect 66d23

bridge 网络模式(二) – 端口映射
作用:
- 启动的容器时,为容器进行端口映射
 
命令格式:
- docker run/create -P …
 - 或者 docker run/create –p …
 
命令参数(OPTIONS):
- -P, --publish-all 将容器内部所有暴露端口进行随机映射
 - -p, --publish list 手动指定端口映射
 
注意:
- -p [HOST_IP]:[HOST_PORT]:CONTAINER_PORT
 - 如:-p ::80 将容器的80端口随机(端口)映射到宿主机任意IP
 - -p :8000:6379 将容器的6379端口映射到宿主机任意IP的8000端口
 - -p 192.168.5.1::3306 将容器的3306端口随机(端口)映射到宿主机的192.168.5.1IP上
 

将容器内部所有暴露端口进行映射到宿主机随机端口上
docker pull redis docker run -dti -P redis docker ps -a
可以看到把宿主机的32768的端口映射到容器6379端口
 
-p, --publish list 手动指定端口映射(-p [HOST_IP]:[HOST_PORT]:CONTAINER_PORT 中括号内可以不写,指的是所有宿主机上的IP和端口都可以访问容器 )
docker run -dti -p 127.0.0.1:6379:6379 centos

host 网络模式
特点:
- 容器完全共享宿主机的网络。网络没有隔离。宿主机的网络就是容器的网络。
 - 容器、主机上的应用所使用的端口不能重复。例如:如果宿主机已经占用了8090端口,那么任何一个host模式的容器都不可以使用8090端口了;反之同理。
 - 外部可以直接访问容器,不需要端口映射。
 - 容器的IP就是宿主机的IP
 

运行容器时指定 host 网络
docker run --network host -dti redis docker inspect 245
这时外部可以通过宿主机的 IP 加上 redis容器暴露的端口 6279 就可以访问 redis 容器了

特殊host 网络模式(Container网络模式)
Container网络模式,其实就是容器共享其他容器的网络。
相当于该容器,,在网络层面上,将其他容器作为“主机”。它们之间的网络没有隔离。
这些容器之间的特性同host模式。
使用方法:
- Docker run/create --network container:CONTAINER …
 


使用 container 网络 运行一个容器
docker run --network container:245 -dti centos

docker exec 245 yum install -y net-tools docker exec ee00 yum install -y net-tools docker exec 245 ifconfig docker exec ee00 ifconfig
可以发现 ee00 的容器的 IP 地址和 容器 245 的IP一致
none 网络模式
特点:
- 容器上没有网络,也无任何网络设备。
 - 如果需要使用网络,需要用户自行安装与配置。
 - 应用场景
 - 该模式适合需要高度定制网络的用户使用。
 
overlay 网络模式(一)
Overlay 网络,也称为覆盖网络。
Overlay 网络的实现方式和方案有多种。Docker自身集成了一种,基于VXLAN隧道技术实现。
Overlay 网络主要用于实现跨主机容器之间的通信。
应用场景:需要管理成百上千个跨主机的容器集群的网络时。
overlay 网络模式(二)- 了解TCP/IP协议栈

overlay 网络模式(三)- 实现原理
IP隧道网络原理


macvlan 网络模式
macvlan网络模式,最主要的特征就是他们的通信会直接基于mac地址进行转发。
这时宿主机其实充当一个二层交换机。Docker会维护着一个MAC地址表,当宿主机网络收到一个数据包后,直接根据mac地址找到对应的容器,再把数据交给对应的容器。
容器之间可以直接通过IP互通,通过宿主机上内建的虚拟网络设备(创建macvlan网络时自动创建),但与主机无法直接利用IP互通。
应用场景:由于每个外来的数据包的目的mac地址就是容器的mac地址,这时每个容器对于外面网络来说就相当于一个真实的物理网络设备。因此当需要让容器来的网络看起来是一个真实的物理机时,使用macvlan模式

备忘
重点掌握:
- bridge网络、host网络、Container网络模式的原理和使用(应用得较多,且host网络性能最优)。
 - docker network命令的使用
 
了解:
- none网络的效果
 - overlay网络、macvlan网络的原理。(使用起来难度较大)
 
Docker 核心技术之网络管理的更多相关文章
- Docker 核心技术与实现原理
		
提到虚拟化技术,我们首先想到的一定是 Docker,经过四年的快速发展 Docker 已经成为了很多公司的标配,也不再是一个只能在开发阶段使用的玩具了.作为在生产环境中广泛应用的产品,Docker 有 ...
 - Docker核心技术
		
Docker核心技术 1.cgroup 即controller group,其重要概念是子系统,首先挂载子系统,然后才有control group.例如cpu子系统,挂载至系统之后,创建一个cgrou ...
 - 深入浅出Docker(一):Docker核心技术预览
		
Docker是PaaS供应商dotCloud开源的一个基于LXC 的高级容器引擎,源代码托管在 GitHub 上, 基于Go语言开发并遵从Apache 2.0协议开源.Docker提供了一种在安全.可 ...
 - 后端技术杂谈10:Docker 核心技术与实现原理
		
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
 - docker核心技术(2)
		
鸟瞰容器生态系统 一谈到容器,大家都会想到 Docker. Docker 现在几乎是容器的代名词.确实,是 Docker 将容器技术发扬光大.同时,大家也需要知道围绕 Docker 还有一个生态系统. ...
 - 【转】Docker 核心技术与实现原理
		
转自:https://draveness.me/docker 提到虚拟化技术,我们首先想到的一定是 Docker,经过四年的快速发展 Docker 已经成为了很多公司的标配,也不再是一个只能在开发阶段 ...
 - Docker进阶之六:网络管理
		
一.默认网络 安装Docker时会自动创建三个网络:docker network ls 列出网络: # docker network ls NETWORK ID NAME DRIVER SCOPE 5 ...
 - Docker 核心技术之Docker Compose
		
Docker Compose 简介 Docker Compose是什么? Docker Compose是一个能一次性定义和管理多个Docker容器的工具. 详细地说: Compose中定义和启动的每一 ...
 - Docker 核心技术之Dockerfile
		
Dockerfile 简介 什么是Dockerfile Dockerfile其实就是根据特定的语法格式撰写出来的一个普通的文本文件 利用docker build命令依次执行在Dockerfile中定义 ...
 
随机推荐
- jquery mobile 建wap站
			
使用jquery mobile 建手机wap站: 几篇比较好的文章 http://wap.yesky.com/dev/225/30974725.shtml http://tech.it168.com/ ...
 - Docker 查看镜像信息
			
欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 资深架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 文章首发个人网站: https://ww ...
 - JS中some()和every()和join()和concat()和pop(),push(),shift(),unshfit()和map()和filter()
			
一.Array 1.some()和every() some()是对数组中每一项运行指定函数,如果该函数对任一项返回true,则返回true. every()是对数组中的每一项运行给定函数,如果该函数对 ...
 - java基础(十八)----- java动态代理原理源码解析
			
关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 静态代理 1.静态代理 静态代理:由程序员创建或特定工 ...
 - springboot~configserver里对重要信息进行RSA加密
			
简介 参考:https://springcloud.cc/spring-cloud-dalston.html#_encryption_and_decryption_2 RSA非对称加密有着非常强大的安 ...
 - Celery异步调度框架(一)基本使用
			
介绍 之前部门开发一个项目我们需要实现一个定时任务用于收集每天DUBBO接口.域名以及TOMCAT(核心应用)的访问量,这个后面的逻辑就是使用定时任务去ES接口抓取数据存储在数据库中然后前台进行展示. ...
 - 痞子衡嵌入式:恩智浦i.MXRT系列微控制器量产神器RT-Flash用户指南
			
RT Flash English | 中文 1 软件概览 1.1 介绍 RT-Flash是一个专为基于NXP i.MX RT系列芯片的产品量产而设计的工具,其功能与官方MfgTool2工具类似,但是解 ...
 - 文件输入输出流工具: IOUtils使用总结
			
序言 以前写文件的复制很麻烦,需要各种输入流,然后读取line,输出到输出流...其实apache.commons.io里面提供了输入流输出流的常用工具方法,非常方便.下面就结合源码,看看IOUTil ...
 - 【Oracle学习笔记】游标
			
1. 分类 常见的游标可分为显示游标.隐式游标.静态游标和动态游标四大类: 1.1 显示游标 显式是相对与隐式cursor而言的,就是有一个明确的声明的cursor.显式游标的声明类似如下: delc ...
 - MyBatis基本要素---核心配置文件
			
今天就简单的叙述下MyBatis的核心配置文件吧~~ configuration 配置 properties 可以配置在java属性配置文件中 settings 修改Mybatis在运行时的行 ...