Docker网络与容器通信理论讲解与操作实例

网络类型

None网络

  • none网络就是什么都没有的网络。挂在这个网络下的容器出了lo,没有其他任何网卡。容器创建时,可以通过–network=none指定使用none网络。
    在这里插入图片描述

  • 应用场景:
    封闭隔离,对安全性要求高且不需要联网的应用可以使用none网络,比如某个容器的唯一作用是生成随机密码,我们就可以放到none网络中,避免密码被窃取。

Host网络

  • 容器自己不会创建网卡和IP等,使用的宿主机上面IP和端口。可以通过–network=host指定使用host网络。
    在这里插入图片描述

  • 应用场景:
    高性能,对网络传输效率要求较高,可以选择host。让容器可以直接配置host网络,跨网络解决方案。

  • 缺点:
    灵活性差,端口冲突

Bridge网络

  • Docker安装时会创建一个命名为docker0的Linux bridge,如果不指定–network,创建的容器默认都会挂到docker0上。
    在这里插入图片描述

    • 创建一个容器看看docker0有没有变化
      在这里插入图片描述

    • 此模式会为每个容器配置ip以及并将容器连接到虚拟网桥docker0上面,并通过docker0网桥以及nat转换与宿主机之间进行通信。
      subnet:172.17.0.0/16
      gateway:172.17.0.1

User-defined 网络

  • 用户可以根据业务需要创建user-defined网络。Docker提供三种user-defined网络驱动:bridge、overlay、macvlan。overlay与macvlan用于创建跨主机网络。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 新增网桥:br-acae5dcb5029。正好是新建网络my_net的短id。

docker network inspect my_net

在这里插入图片描述

  • 我们以自行指定IP网段。
    例如:
docker network create --driver bridge --subnet 172.23.24.0/24 --gateway 172.23.24.1 my_net2
docker network inspect my_net2

在这里插入图片描述

  • 容器需要使用新的网络,需要在启动时通过–network指定,可以通过–ip来指定静态IP。

  • 只有使用–subnet创建的网络才能指定静态IP。

  • 如何实现docker中两个不同网桥之间的跨网络通信?

  1. 我们先创建一个busybox test1使用my_net2网卡。
 docker run -it --name test1 --network=my_net2 busybox

在这里插入图片描述

  1. 再创建一个busybox test2 使用默认网卡
docker run -it --name test2 busybox

在这里插入图片描述

  • 两者相ping,发现ping不通
    在这里插入图片描述
  1. 查看host上的路由表
    在这里插入图片描述
  2. 查看路由转发功能在这里插入图片描述
  3. 查看iptables:iptables-save
    在这里插入图片描述
  • 从规则命名DOCKER-ISOLATION可知docker在设计上就是要隔离不同的network。
    如何让test1与test2通信?
  1. 我们可以用docker network connect 命令实现,在test2容器中添加一块my_net2的网卡。
    在这里插入图片描述
  2. 查看test2里的网卡
    在这里插入图片描述
  • 然后再ping一次,可以ping通
    在这里插入图片描述

容器间通信

  1. IP通信:
    两个容器要能通信,必须要有属于同一个网络的网卡,满足这个条件之后,容器可以通过IP交互了,可以通过docker network connect实现,上述实验已介绍。
  2. Docker DNS Server:
    Docker从1.10版本以后,docker daemon实现了一个内衬的DNS Server,使容器直接通过容器名通信,我们可以通过–name来指定容器名。
  3. joined容器:
    joined容器可以使两个或多个容器共享一个网络栈,网卡和配置信息,joined容器之间可以通过127.0.0.1直接通信。
    举例
    先创建个httpd容器,名为web1
    再创建busybox容器并通过–network=container:web1指定joined容器为web1
docker run -d -it --name=web1 httpd
docker run -it --network=container:web1 busybox

在这里插入图片描述
在这里插入图片描述

  • 可用通过127.0.0.1访问web1的http服务。
    joined容器适合以下场景:
    1. 不同容器中的程序希望通过loopback高效地通信,比如web server与app server
    2. 希望监控其他容器的网络流量,比如运行在独立容器中的网络监控程序。

容器与外部世界连接

容器访问外部世界

-进入容器,ping www.baidu.com
在这里插入图片描述

  • 容器默认能访问外网,主要是NAT技术。
    在这里插入图片描述
  • 通过tcpdump查看地址如何转换:
    在这里插入图片描述
    在这里插入图片描述
  • 访问过程
    在这里插入图片描述

外部世界访问容器

  • 端口映射
    docker可将容器对外提供服务的端口映射到host的某个端口,外网通过该端口访问容器,容器启动通过-p映射端口。
  • 默认映射
    在这里插入图片描述
  • 指定端口映射
    在这里插入图片描述
  • 每映射一个端口,host就会启动一个docker-proxy进程来处理访问容器的流量。
    在这里插入图片描述
  • 端口映射分析流程图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值