为什么需要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网络的原理。(使用起来难度较大)

最新文章

  1. JS事件的三种方式
  2. Redhat环境下编译安装Google Bazel
  3. DOM 节点的克隆与删除
  4. CSS3点点滴滴
  5. Android -- FragmentActivity添加Fragment的序列图
  6. 34、Shiro框架入门三,角色管理
  7. 为边框应用图片 border-image
  8. iOS - 导航控制器
  9. Xcode 真机无法调试
  10. linux cross toolsChain 交叉编译 ARM(转)
  11. jquery 缓冲加载图片插件 jquery.lazyload
  12. STM32学习之路-SysTick的应用(时间延迟)
  13. Java_web学习(二) eclipse(tomcat)配置
  14. php header解决跨域问题
  15. JS实现购物商城商品放大
  16. 翻译 – CSS3 Backgrounds相关介绍——张鑫旭
  17. 常见MIME类型
  18. [Interview] 程序员如何制作一份漂亮的面试简历
  19. Java集合数据类型
  20. Android 6.0 如何添加完整的系统服务(app-framework-kernel)

热门文章

  1. 在Windows 10 + Python 3.6.5 中用 pip 安装最新版 TensorFlow v1.8 for GPU
  2. 使用ASP.NET Core支持GraphQL -- 较为原始的方法
  3. 机器学习——交叉验证,GridSearchCV,岭回归
  4. 前端笔记之移动端&响应式(下)默认样式&事件&惯性抛掷&swiper&loaction对象
  5. 研究windows下SVN备份及还原恢复方案
  6. javascript小记一则:今天在写VS2005——.NET程序时,写的一个JS图片示例案例
  7. 用bat批处理程序通过DOS命令行删除所有的空文件夹
  8. 【spring实战第五版遇到的坑】3.2中配置关系映射时,表名和3.1中不一样
  9. ideal中spring的xml文件没有提示的问题
  10. Android为TV端助力之WebView开发踩坑一