Docker笔记:配置docker网络与不通网络之间的通信及跨主机通信

配置 docker 网络

1 ) Docker0 网络

  • 默认启动的所有容器,都会加入到这个网络中
  • 在有docker环境的 centos 中, 通过 $ ip addr 可以看到Docker0网络相关信息
  • 多个容器都在Docker0 网络中就属于同一个局域网了,就可以通信了
  • 启动三个容器,测试网络的互通
    • 1 ) $ docker run -itd --name centos1 centos /bin/bash
    • 2 ) $ docker run -itd --name centos2 centos /bin/bash
    • 3 ) $ docker run -itd --name centos3 centos /bin/bash
    • 在物理机上看 $ ip addr, 又多了 3 条
  • 进入第1个容器
    • $ docker exec -it centos1 ip addr 查看ip地址
  • 进入第2个容器
    • $ docker exec -it centos2 ip addr 查看ip地址
  • 进入第3个容器
    • $ docker exec -it centos3 ip addr 查看ip地址
  • 可以发现三个容器的ip地址在一个局域网内, 是可以互联的
  • 并且在物理机上,也是可以和上面三个容器通信

2 )通信原理

  • 每启动一个Docker容器,Docker就会给Docker容器分配一个ip
  • 我们只要安装了Docker,就会有一个网卡 docker0
  • docker0 使用的是桥接模式,使用的技术是 veth-pair 技术

3 )查看网络

  • $ docker network --h

    Flag shorthand -h has been deprecated, please use --helpUsage:  docker network COMMANDManage networksCommands:connect     Connect a container to a networkcreate      Create a networkdisconnect  Disconnect a container from a networkinspect     Display detailed information on one or more networksls          List networksprune       Remove all unused networksrm          Remove one or more networksRun 'docker network COMMAND --help' for more information on a command.
    
  • $ docker network ls

    • 这里需要启动docker服务或打开 docker desktop
      NETWORK ID     NAME      DRIVER    SCOPE
      1abcdbddaf9d   bridge    bridge    local
      64c08dba087e   host      host      local
      9b5e3b4957b1   none      null      local
      
    • 1abcdbddaf9d bridge bridge local 是docker0对应的网络
  • $ docker network inspect bridge

    • 可查看docker网络详细信息

4 )使用默认网络的问题

  • 没法实现网络隔离
    • 多个程序都跑在docker0网络里面,会很乱,不好管理
  • 没法使用计算机主机名实现通信
    • 参考下面微服务通信的问题

5 )关于微服务通信

  • 微服务中的通信是主机名之间的通信,不是ip地址之间的通信,因为ip地址会发生变化
  • 但是默认情况下的主机名是无法和另一台相通的
    • 假设 centos1 和 centos2 是启动状态
    • $ docker exec -it centos2 /bin/bash
      • $ ping centos1 发现ping不通

6 )解决方案

  • 要解决默认网络的问题,就需要自定义网络

  • 创建自己的网络

    • $ docker network create --help
      Usage:  docker network create [OPTIONS] NETWORKCreate a networkOptions:--attachable           Enable manual container attachment--aux-address map      Auxiliary IPv4 or IPv6 addresses used byNetwork driver (default map[])--config-from string   The network from which to copy the configuration--config-only          Create a configuration only network-d, --driver string        Driver to manage the Network (default "bridge")--gateway strings      IPv4 or IPv6 Gateway for the master subnet--ingress              Create swarm routing-mesh network--internal             Restrict external access to the network--ip-range strings     Allocate container ip from a sub-range--ipam-driver string   IP Address Management Driver (default "default")--ipam-opt map         Set IPAM driver specific options (default map[])--ipv6                 Enable IPv6 networking--label list           Set metadata on a network-o, --opt map              Set driver specific options (default map[])--scope string         Control the network's scope--subnet strings       Subnet in CIDR format that represents anetwork segment
      
  • 通过上述命令创建好网络后,启动容器并加入该网络

    • $ docker network create --driver bridge --subnet 192.168.1.0/24 --gateway 192.168.1.1 docker1 创建docker1网络
    • $ docker network create --driver bridge --subnet 192.168.2.0/24 --gateway 192.168.2.1 docker2 创建docker2网络
    • $ docker run -tid --name centos1 --net docker1 centos /bin/bash 将cenos1加入docker1网络
    • $ docker run -tid --name centos2 --net docker1 centos /bin/bash 将cenos2加入docker1网络
    • $ docker run -tid --name centos3 --net docker2 centos /bin/bash 将cenos3加入docker2网络
    • $ docker exec -it centos1 ping centos2 同一网络下的 centos1 和 centos2 两个容器可以 ping 通
    • $ docker exec -it centos1 ping centos3 不同网络下的 centos1 和 centos3 两个容器实现了网络隔离(ping 不通)
  • 关于 /16 和 /24

    • 192.168.0.0/16 的范围在 (192.168.0.1 ~ 192.168.255.255) 这个范围比较大
    • 192.168.1.0/24 的范围在 (192.168.1.1 ~ 192.168.1.255) 这个范围比较小
  • 上面创建网络时,需要制定网络类型,网络类型,有如下四种

Docker 网络模式配置说明
host 模式--net=host容器和宿主机共享 Network namespace
container 模式--net=container:NAMEorID容器和另外一个容器共享 Network namespace。kubernetes中的pod就是多个容器共享一个Network namespace
none 模式--net=none容器有独立的Network namespace, 但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接,配置IP等
bridge 模式--net=bridge(默认为该模式)

不同网络的连接

  • 基于以上信息,docker0, docker1, docker2 属于不同的网络,没法直接通信
  • 上面 centos1, centos2 都在 docker1网络中,可以直接通信; centos3 在docker2网络中,这样实现了网路隔离
  • 现在要求,centos2 需要连接上 centos 3,实现 centos2既能连接centos1, 又能连接centos3
  • 这样,可以把 centos2 再加入到 docker2 网络中,就实现了上述要求
  • $ docker network connect --help
    Usage:  docker network connect [OPTIONS] NETWORK CONTAINERConnect a container to a networkOptions:--alias strings           Add network-scoped alias for the container--driver-opt strings      driver options for the network--ip string               IPv4 address (e.g., "172.30.100.104")--ip6 string              IPv6 address (e.g., "2001:db8::33")--link list               Add link to another container--link-local-ip strings   Add a link-local address for the container
    
  • $ docker network connect docker2 centos2 把centos2容器加入docker2网络中
  • $ docker exec -it centos2 ping centos3 发现ping通

docker 容器跨主机通信

  • 在多台服务器上部署 docker 容器,实现跨主机通信
  • 主机1, hostIP: 192.168.220.110
    • c1 容器
  • 主机2, hostIP: 192.168.220.111
    • c2 容器
  • 可见,主机1和主机2在同一个网段,两台主机是可以互通的,主机1和c1容器是互通的,主机2与c2容器是互通的
  • 但是,默认情况,c1 和 c2 是无法通信的,即使主机在同一个网段也是隔离的
  • 要给 c1 和 c2 分配不同的子网
    • 主机1上 : $ docker network create --driver bridge --subnet 192.168.1.0/24 --gateway 192.168.1.1 dockerNet1
    • 主机2上 : $ docker network create --driver bridge --subnet 192.168.2.0/24 --gateway 192.168.2.1 dockerNet2
    • c1 加入 dockerNet1: $ docker run -it --name c1 --net dockerNet1 centos /bin/bash
    • c2 加入 dockerNet2: $ docker run -it --name c2 --net dockerNet2 centos /bin/bash
  • 之后,要达到 1.0 的网段和 2.0 的网段进行通信,就需要在linux上配置 路由表了
  • 在主机1上演示, $ route 可查看路由表
  • 在主机1上访问 192.168.2.0 网段时,转发到主机2的服务器
    • $ route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.220.111
    • 这样,在主机1访问 192.168.2.0 网段时,会转发到主机2上
  • 在主机2上访问 192.168.1.0 网段时,转发到主机1的服务器
    • $ route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.220.110
    • 这样,在主机1访问 192.168.1.0 网段时,会转发到主机1上
  • 在两台主机上执行,$ route 发现多了路由的规则
  • 接着,需要配置 iptables 规则
    • 主机1上: $ iptables -t nat -I PREROUTING -s 192.168.1.0/24 -d 192.168.2.0/24 -j DNAT --to 192.168.1.1
    • 主机2上: $ iptables -t nat -I PREROUTING -s 192.168.2.0/24 -d 192.168.1.0/24 -j DNAT --to 192.168.2.1
    • 说明
      • -s 本主机配置的网段
      • -d 目标主机的网段
      • -j 地址转换
      • --to 本主机网关
  • 测试在主机1的c1 ping 主机2的c2容器
    • $ docker exec -it c1 ping c2 可以畅通
  • 测试在主机2的c2 ping 主机1的c1容器
    • $ docker exec -it c2 ping c1 可以畅通
  • 至此,c1 和 c2 已经顺利连通
  • 基于此,可配置N台主机进行互相连通

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/229129.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ripro后台登录后转圈和图标不显示的原因及解决方法

最近,好多小伙伴使用ripro主题的小伙伴们都发现,登录后台后,进入主题设置就转圈,等待老半天后好不容易显示页面了,却发现图标不显示了,都统一显示为方框。 这是因为后台的js、css这类静态资源托管用的是js…

2312llvm,使用llvm的示例

原文 介绍 除此外,LLVM是编译器编写者的平台.因为其异常干净和小巧的IR(中间表示),使用LLVM编写编译器比其他系统容易得多. 作为证明,栈机的作者在大约四天内编写了整个编译器(语言定义,词法解析器,解析器,代码生成器等)!了解这一点很重要,因为它显示了使用LLVM时,可多快地获…

力扣刷题-二叉树-找树左下角的值

513 找树左下角的值 给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 示例 2: 思路 层序遍历 直接层序遍历,因为题目说了是最底层,最左边的值&a…

紫光FPGA DDR3 IP使用和注意事项(axi4协议)

紫光DDR3 IP使用 对于紫光ddr3 IP核的使用需要注意事情。 阅读ddr ip手册: 1、注意:对于写地址通道,axi_awvalid要一直拉高,axi_awready才会拉高。使用的芯片型号时PG2L100H-6FBG676,不同的型号IP核接口和axi的握手协…

IDEA2020关于Cannot resolve symbol ‘servlet‘报错

刚开始也配置了tomcat,但是依然报错,后来查找资料解决了 在项目下面创建一个libs文件夹,然后将tomcat / lib文件夹中的servlet-api.jar复制了过来,然后再添加到library。 具体操作步骤:

Code automatic processing

自动化处理没啥用的代码,测试下,还不错的感觉

Elasticsearch的使用总结

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。 put/post请求:http://localhost:9200/索引库名称 {"settings":{"index":{"number_of_shards":1, # 分片数量…

Axure的交互样式和情形

Axure的交互样式和情形 交互样式 Axure是一个流行的原型设计工具,它允许您创建交互式原型,模拟应用程序或网站的功能和用户界面。在Axure中,您可以设置各种交互样式来使原型更加生动和真实。 链接触发器:通过给一个元素添加链接…

风速预测(三)EMD-LSTM-Attention模型

目录 1 风速数据EMD分解与可视化 1.1 导入数据 1.2 EMD分解 2 数据集制作与预处理 2.1 先划分数据集,按照8:2划分训练集和测试集 2.2 设置滑动窗口大小为7,制作数据集 3 基于Pytorch的EMD-LSTM-Attention模型预测 3.1 数据加载&#…

记错vue3+ts require 报错

在main.js 中使用require 报错 ‘require’ is not defined 事先声明 ,可能是版本不一样,所以解决办法不一样,报错的原因是Pack.json 文件中type值不同,解决办法有两种。 目前有什么弊端,因为时间比较紧,还…

现代C++的多线程开发

前言 早期的C进行多线程编程,往往需要根据不同的系统编写不同的代码,但是在C11之后,std中已经提供了多线程的支持,所以对于不同操作系统只需要编写一次代码即可。 本文记录一次多线程开发过程中,使用的C新特性&#…

uniapp怎么获取微信步数

微信步数获取的背景 微信步数是指用户在微信运动中记录的步数数据。微信提供了开放能力,允许第三方应用获取用户授权后的微信步数数据,以便进行进一步的数据分析和展示。使用时报错:fail api scope is not declared in the privacy agreemen…

【华为机试】2023年真题B卷(python)-洞穴探险

一、题目 题目描述: 某探险队负责对地下洞穴进行探险。探险队成员在进行探险任务时,随身携带的记录器会不定期地记录自身的坐标,但在记录的间隙中也会记录其他数据。探索工作结束后,探险队需要获取到某成员在探险过程中相对于探险…

libevent服务GET/POST的简单使用

目录 1、前言2、测试demo2.1、目录结构2.2、 测试源码2.2.1、http_server.cpp2.2.2、 http_server.h 2.3、 编译2.4、 运行结果2.4.1、测试POST2.4.2 、测试GET请求 1、前言 项目开发中经常需要使用到私有协议和Qt,Android等GUI前端通信,比较常用的使用POST和GET方式…

计算机操作系统-第十八天

目录 进程调度时机 补充知识 进程调度的方式 非剥夺调度方式 剥夺调度方式 进程的切换与过程 本节思维导图 进程调度时机 进程调度(低级调度),即按照某种算法从就绪队列中选择一个进程为其分配处理机。 共有两种需要进行进程调度与…

基于junit4搭建自定义的接口自动化测试框架

随着业务的逐步稳定,对于接口的改动也会逐渐变少。更多的是对业务逻辑的优化,功能实现的完善。对于测试来说,重复繁琐的功能测试不仅效率低下,而且耗费一定的人力资源。笔者支持的信息流业务下的一个图文管理平台就是一个功能较为…

Lambda表达式的简单理解

1. 初识lambda表达式 Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。 Lambda 表达式(Lambda exp…

网络基础试题选择题——附答案

选择题 OSI模型中,表示层的作用是? A) 数据链路B) 数据传输C) 数据格式转换D) 物理连接 IP地址的IPv4版本中,一般由几个十进制数构成? A) 2B) 4C) 6D) 8 在HTTP协议中,常用的请求方法是? A) GETB) POSTC) P…

微信scroll-view小程序实现上拉加载下拉刷新

在使用微信小程序时避免不了查询列表实现分页功能&#xff0c;在这里分享下使用croll-view实现上拉加载下拉刷新功能,如有不足请指出 创建commonPagination组件 wxml文件 <scroll-view class"scroll" style"{{style}}" scroll-top"{{scrollTop}}…

广州华锐互动:VR煤矿特殊工种作业实训帮助提高矿工的操作技能和安全意识

VR煤矿特殊工种作业实训系统为煤矿企业培训提供了全方位的支持&#xff0c;帮助提高矿工的操作技能和安全意识&#xff0c;促进煤矿企业的安全生产。 首先&#xff0c;VR煤矿特殊工种作业实训系统可以提供逼真的虚拟操作环境&#xff0c;使矿工能够身临其境地感受各种工种的作业…