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 --help
    
    Usage:  docker network COMMAND
    
    Manage networks
    
    Commands:
      connect     Connect a container to a network
      create      Create a network
      disconnect  Disconnect a container from a network
      inspect     Display detailed information on one or more networks
      ls          List networks
      prune       Remove all unused networks
      rm          Remove one or more networks
    
    Run '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] NETWORK
      
      Create a network
      
      Options:
            --attachable           Enable manual container attachment
            --aux-address map      Auxiliary IPv4 or IPv6 addresses used by
                                  Network 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 a
                                  network 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 CONTAINER
    
    Connect a container to a network
    
    Options:
          --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.mfbz.cn/a/242603.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

模块一——双指针:202.快乐数

文章目录 题目描述简单证明补充知识算法原理代码实现 题目描述 题目链接:202.快乐数 为了方便叙述,将对于⼀个正整数,每⼀次将该数替换为它每个位置上的数字的平方和这⼀个操作记为x操作; 题目告诉我们,当我们不断重…

RHEL8_Linux使用podman管理容器

本章主要介绍使用 podman 管理容器 了解什么是容器,容器和镜像的关系安装和配置podman拉取和删除镜像给镜像打标签导出和导入镜像创建和删除镜像 1.了解容器及和镜像的关系 对于初学者来说,不太容易理解什么是容器,这里举一个例子。想象一下…

Leetcode69 x的平方根

x的平方根 题解1 袖珍计算器算法题解2 二分查找题解3 牛顿迭代 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符&…

KubeKey 离线部署 KubeSphere v3.4.1 和 K8s v1.26 实战指南

作者:运维有术 前言 知识点 定级:入门级了解清单 (manifest) 和制品 (artifact) 的概念掌握 manifest 清单的编写方法根据 manifest 清单制作 artifactKubeKey 离线集群配置文件编写KubeKey 离线部署 HarborKubeKey 离线部署 KubeSphere 和 K8sKubeKey…

DBSCAN聚类算法学习笔记

DBSCAN聚类算法学习笔记 一些概念名词 MinPts:聚类在一起的点的最小数目,超过这一阈值才算是一个族群 核心点:邻域内数据点超过MinPts的点 边界点:落在核心点邻域内的点称为边界点 噪声点:既不是核心点也不是边界点的…

【Spring】01 Bean 介绍

文章目录 1. 定义2. 特性1)可重用性2)可配置性3)可管理性 3. 生命周期1)实例化2)属性设置3)初始化4)使用5)销毁 4. 配置方式1)XML配置2)注解配置3&#xff09…

docker-compose Install gitea

gitea 前言 Gitea 是一个轻量级的 DevOps 平台软件。从开发计划到产品成型的整个软件生命周期,他都能够高效而轻松的帮助团队和开发者。包括 Git 托管、代码审查、团队协作、软件包注册和 CI/CD。它与 GitHub、Bitbucket 和 GitLab 等比较类似。 Gitea 最初是从 Gogs 分支而来…

【揭秘】企业自建社群商城:小程序自主经营的成功秘诀!

在当今这个数字化的时代,社群电商已经成为了商业领域的一个重要趋势。社群电商是指通过社交媒体平台,将具有共同兴趣、需求或价值观的人们聚集在一起,形成一个社群,然后通过提供产品或服务来满足这些人的需求。这种商业模式不仅可…

脚本测试postman快速导出python接口测试过程示例

Postman的脚本可以导出多种语言的脚本,方便二次维护开发。 Python的requests库,支持python2和python3,用于发送http/https请求 使用unittest进行接口自动化测试 01、环境准备 1、安装python(使用python2或3都可以)…

自学编程推荐一个容易学的中文编程工具,构件箱之单选框组简介

一、前言: 零基础自学编程,中文编程工具下载,中文编程工具构件之扩展系统菜单构件教程 编程系统化教程链接https://jywxz.blog.csdn.net/article/details/134073098?spm1001.2014.3001.5502 给大家分享一款中文编程工具,零基础轻…

dialog 在xml文件进行了自适应宽,但是失效了

如下图 讲述了为什么已经设置好了dialog的宽高 到了显示的时候就会失效的原因 解决方式 : 在自定的dialog中的onstart()方法中进行重新设置宽高 Window window getWindow();WindowManager.LayoutParams lp window.getAttributes();lp.height LinearLayout.La…

springboot使用EasyExcel导入数据

springboot使用EasyExcel导入数据 1. 引入依赖 <!-- Easy Excel --> <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.2.1</version> </dependency>2. 建立对应实体类 假如…

Visual Studio使用Web Deploy发布.NET Web应用到指定服务器的IIS中

前言 今天要讲的是在Window 2008 R2版本的服务器下如何配置Web Deploy&#xff0c;和Visual Studio使用Web Deploy发布.NET Web应用到指定服务器的IIS中。 因为历史原因项目只能使用这个版本的服务器&#xff0c;当然使用其他服务器版本配置流程也是一样的。 Web Deploy介绍 …

Oracle数据库对SAP的支持

其实有时候&#xff0c;很多信息都已经整理好了&#xff0c;你只需要知道他在哪里就好&#xff0c;无需自己整理。 Oracle数据库对SAP的支持&#xff0c;可以从这个网页快速了解。 看前面的概述&#xff1a; Oracle 数据库是全球 SAP 客户中排名第一的数据库&#xff0c;拥有…

插入算法(C语言)

#include<cstdio> #include<iostream> #define N 9 using namespace std; int main() {int arr[N1] { 1,4,7,13,16,19,22,25,280 }; int in,i,j;//要插入的数字//打印要插入数字的数组所有元素printf("插入前的数组: ");for ( i 0; i <N; i){print…

设计模式——单例模式(创建型)

引言 单例模式是一种创建型设计模式&#xff0c; 让你能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。 问题 单例模式同时解决了两个问题&#xff0c; 所以违反了单一职责原则&#xff1a; 保证一个类只有一个实例。 为什么会有人想要控制一个类所…

回归预测 | MATLAB实现CHOA-BiLSTM黑猩猩优化算法优化双向长短期记忆网络回归预测 (多指标,多图)

回归预测 | MATLAB实现CHOA-BiLSTM黑猩猩优化算法优化双向长短期记忆网络回归预测 &#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现CHOA-BiLSTM黑猩猩优化算法优化双向长短期记忆网络回归预测 &#xff08;多指标&#xff0c;多图&#xff09;效果…

YOLOv8改进 | 2023主干篇 | EfficientViT替换Backbone(高效的视觉变换网络)

一、本文介绍 本文给大家带来的改进机制是EfficientViT&#xff08;高效的视觉变换网络&#xff09;&#xff0c;EfficientViT的核心是一种轻量级的多尺度线性注意力模块&#xff0c;能够在只使用硬件高效操作的情况下实现全局感受野和多尺度学习。本文带来是2023年的最新版本…

是谁,在参与数十亿美元的量子市场?

量子技术是最不为人们所了解、但却最有希望在未来几年颠覆商业和产业的进步技术之一。 很少有像量子信息科学市场这样小的市场能引起如此热烈的讨论。上周&#xff0c;根据Hyperion Research在圣克拉拉举行的Q2B硅谷会议上发布的年度量子计算&#xff08;QC&#xff09;市场更新…

【开源软件】最好的开源软件-2023-第23名 Apache Druid

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…
最新文章