docker 的网络管理

docker应用自带了三种类型的网络,然后我们自己也能自定义网络

root@test-virtual-machine:~# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE 
4c3e28760cff   bridge    bridge    local
afd1493dc119   host      host      local
5f200e2eaf22   none      null      local
f0b44d02a999   redis     bridge    local
  • bridge: 桥接网络创建容器默认使用的网络,通过docker0给容器网络分配地址

  • host:和宿主机共用一套网络,不会额外再创建网络

  • none:容器不使用任何的网络资源,只会有环回的地址

  • container 新创建容器和指定的容器共用一套网络

  • redis:自定义的网络,默认使用bridge模式

1 bridge 模式

在该模式中,Docker 守护进程创建了一个虚拟以太网桥 docker0,新建的容器会自动桥接到这个接口,附加在其上的任何网卡之间都能自动转发数据包。

    默认情况下,守护进程会创建一对对等虚拟设备接口 veth pair,将其中一个接口设置为容器的 eth0 接口(容器的网卡),另一个接口放置在宿主机的命名空间中,以类似 vethxxx 这样的名字命名,从而将宿主机上的所有容器都连接到这个内部网络上。

    关于 bridge 网络模式的使用,只需要在创建容器时通过参数 --net bridge 或者 --network bridge 指定即可,当然这也是创建容器默认使用的网络模式,也就是说这个参数是可以省略的。

Bridge 桥接模式的实现步骤主要如下:

  • Docker Daemon 利用 veth pair 技术,在宿主机上创建一对对等虚拟网络接口设备,假设为 veth0 和 veth1。而 veth pair 技术的特性可以保证无论哪一个 veth 接收到网络报文,都会将报文传输给另一方。

  • Docker Daemon 将 veth0 附加到 Docker Daemon 创建的 docker0 网桥上。保证宿主机的网络报文可以发往 veth0。

  • Docker Daemon 将 veth1 添加到 Docker Container 所属的 namespace 下,并被改名为 eth0。如此一来,宿主机的网络报文若发往 veth0,则立即会被 Container 的 eth0 接收,实现宿主机到 Docker Container 网络的联通性;同时,也保证 Docker Container 单独使用 eth0,实现容器网络环境的隔离性。

1、运行一个容器使用默认的桥接模式

# 运行一个nginx容器
docker run -d --name my_nginx  nginx

2、查看IP信息

docker inspect my_nginx | grep -i ipaddress

3、查看宿主机的网络变化

ip address 

通过以上的比较可以发现,证实了之前所说的:守护进程会创建一对对等的虚拟设备接口 veth pair,将其中一个接口设置为容器的 eth0 接口,另一个接口放置在宿主机的命名空间中,以类似 vethxxx 这样的名字命名。

同时,守护进程还会从网桥 docker0 的私有地址空间中分配一个 ip 地址和子网给该容器,并设置 docker0ip 地址为容器的默认网关。

4、查看网络信息

docker inspect my_nignx

可以看到 Gateway网关地址为 docker0ip 地址 172.17.0.1,容器的ip地址为172.17.0.2

我们还可以通过 docker network inspect bridge 查看所有 bridge 网络模式下的容器,在 Containers 节点中可以看到容器名称。

2 host 网络模式

    host 网络模式需要在创建容器时通过参数 --net host 或者 --network host 指定。

    采用 host 网络模式的 Docker Container,可以直接使用宿主机的 ip 地址与外界进行通信,若宿主机的 eth0 是一个公有 ip,那么容器也拥有这个公有 ip。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行 NAT 转换。

    host 网络模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。

演示案例:

1、运行一个host模式的容器 查看容器的 ip 地址信息

# 运行一个host的容器
docker run -ti -d --name=my_host --net=host redislabs/redisinsight
# 进入容器
docker exec -ti my_host bash 
# 查看网络
ip adddress 

2、查看宿主机的 ip 地址信息

可以看到宿主机的ip地址信息跟上图的hostbox容器的ip地址信息是一模一样的

我们还可以通过 docker network inspect host 查看所有 host 网络模式下的容器,在 Containers 节点中可以看到容器名称。

3 none 网络模式

    none 网络模式是指禁用网络功能,只有 lo 地址 (local 的简写),代表 127.0.0.1,即 localhost 本地回环地址。在创建容器时通过参数 --net none 或者 --network none 指定。

    none 网络模式即不为 Docker Container 创建任何的网络环境,容器内部就只能使用 loopback 网络设备,不会再有其他的网络资源。可以说 none 模式为 Docke Container 做了极少的网络设定,但是俗话说得好 “少即是多”,在没有网络配置的情况下,作为 Docker 开发者,才能在这基础做其他无限多可能的网络定制开发。这也恰巧体现了 Docker 设计理念的开放。

演示案例:

运行一个基于none网络类型的的容器并查看容器的 ip 地址信息

# 创建none类型的容器
docker run -it -d  --name=my_none --net none redislabs/redisinsight
# 进入容器
docker exec -ti my_none bash

可以看到nonebox容器有一个lo 本地回环地址

我们还可以通过 docker network inspect none 查看所有 none 网络模式下的容器,在 Containers 节点中可以看到容器名称。

4 container 网络模式

    Container 网络模式是 Docker 中一种较为特别的网络的模式。在创建容器时通过参数 --net container:已运行的容器名称|ID 或者 --network container:已运行的容器名称|ID 指定。

    处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用 localhost 高效快速通信。

Container 网络模式即新创建的容器不会创建自己的网卡,配置自己的 ip,而是和一个指定的容器共享 ip、端口范围等。 同样两个容器除了网络方面相同之外,其他的如文件系统、进程列表等还是隔离的。

演示案例:

1、运行一个基于bridge网络模式的my_container1 容器创建container网络模式的容器 my_container2,并查看容器的ip地址信息

# 启动my_container1  
docker run -ti -d --name=my_container1 redislabs/redisinsight
# 启动my_container2
docker run -ti -d --name=my_container2 --net=container:my_container1  redislabs/redisinsight

2、查看my_container1 容器的ip地址信息

# 进入容器1
docker exec -ti my_container1 bash
# 查看ip信息
ip address

3、查看my_container2 容器的ip地址信息

# 进入容器2
docker exec -ti my_container2 bash
# 查看ip信息
ip address

可以看到my_container1容器的ip地址信息跟上图的my_container1容器的ip地址信息是一模一样的

3、查看宿主机的ip地址信息

通过以上测试可以发现,Docker 守护进程只创建了一对对等虚拟设备接口用于连接 my_container1容器和宿主机,而containerbox 容器则直接使用了 mybox 容器的网卡信息。

这个时候如果将mybox容器停止,会发现宿主机为容器创建的网卡会消失

如果my_container1容器重启以后,宿主机就又可以获取到容器网卡信息了

5 自定义网络

    虽然 Docker 提供的默认网络使用比较简单,但是为了保证各容器中应用的安全性,在实际开发中更推荐使用自定义的网络进行容器管理,以及启用容器名称到 ip 地址的自动 DNS 解析。

    从 Docker 1.10 版本开始,docker daemon 实现了一个内嵌的 DNS server,使容器可以直接通过容器名称通信。方法很简单,只要在创建容器时使用 --name 为容器命名即可。

    但是使用 Docker DNS 有个限制:只能在 user-defined 网络中使用。也就是说,默认的 bridge 网络是无法使用 DNS 的,所以我们就需要自定义网络。

1 创建网络

1、通过 docker network create 命令可以创建自定义网络模式,查看 docker network create 命令使用详情,发现可以通过 -d 或者 --driver 指定网络模式且默认是 bridge 网络模式,命令提示如下:

2、创建一个基于 bridge 网络模式的自定义网络模式 my_network

# 创建自定义网络
docker network create my_network
​

3、通过 docker network ls 查看本地网络:

4、通过自定义网络模式 custom_network 创建容器:

# 创建容器并配置自定义网络
docker run -d -ti --name=my_network --net my_network redislabs/redisinsight

5、可以通过 docker inspect 容器名称|ID 查看容器的网络信息,在 NetworkSettings 节点中可以看到详细信息

docker inspect my_network

创建自定义的网络会自动分配一个新的网络,和docker0的网段不相同

2 连接网络

1、通过 docker network connect 网络名称 容器名称 为容器连接新的网络模式,这里我们为add_network容器添加my_network网络

# 创建
docker run -d -ti --name=add_network  redislabs/redisinsight
# 给容器添加网络
docker network connect my_network add_network
 

2、通过 docker inspect 容器名称|ID 查看容器的网络信息,可以看到add_network容器多增加了my_network网络

docker inspect add_network

3 断开网络

1、通过 docker network disconnect 网络名称 容器名称 命令断开网络

# 断开新添加的网络
docker network disconnect my_network add_network

2、通过 docker inspect 容器名称|ID 再次查看容器的网络信息,发现只剩下默认的 bridge网络了

docker inspect add_network

4 移除网络

可以通过 docker network rm 网络名称 命令移除自定义的网络,网络移除成功则会返回自定义的网络名称

# 移除网络my_network
docker network rm my_network

提示:如果某个自定义网络模式被创建的容器使用了,则该网络模式无法被删除。

6、容器间的网络通信

接下来我们通过所学的知识实现容器间的网络通信。首先明确一点,容器之间要想互相通信,必须要有属于同一个网络的网卡。

1、我们先创建两个基于默认的 bridge 网络模式的容器

# 创建容器my_contain1
docker run -di --name=my_contain1 redislabs/redisinsight
# 创建容器my_contain2
docker run -di --name=my_contain2 redislabs/redisinsight

2、通过 docker network inspect bridge 查看两容器的具体 ip 信息

可以看到容器my_contain1的 ip 地址为172.17.0.2,容器my_contain2ip地址为172.17.0.3

3、然后测试两容器间是否可以进行网络通信

# my_contain1 ping my_contain2
docker exec -it my_contain1 ping -c3 172.17.0.3
​
# my_contain2 ping my_contain1
docker exec -it my_contain2 ping -c3 172.17.0.2

经过测试,从结果得知两个属于同一个网络的容器是可以互相进行网络通信的,但是由于容器经常会被删除和创建,其 IP 地址经常会发生变化,是不固定的。那容器内所有通信的 IP 地址也需要进行更改,那么能否使用固定的容器名称进行网络通信呢?我们接着继续测试

经过测试,从结果得知使用容器名称进行网络通信是不行的,那怎么实现这个功能呢?

前面说过,从 Docker 1.10 版本开始,docker daemon 实现了一个内嵌的 DNS server,使容器可以直接通过容器名称通信。方法很简单,只要在创建容器时使用 --name 为容器命名即可。

但是使用 Docker DNS 有个限制:只能在 user-defined 网络中使用。也就是说,默认的 bridge 网络是无法使用 DNS 的,所以我们就需要自定义网络。

4、我们先基于 bridge 网络模式创建自定义网络 my_network,然后创建两个基于my_network自定义网络模式的容器

# 创建自定义网络
docker network create  my_network
# 将my_contain1容器连接my_network网络中
docker network connect my_network my_contain1
# 将my_contain2容器连接my_network网络中
docker network connect my_network my_contain2

5、通过 docker network inspect my_network 查看两容器的具体 ip 信息

# 查看自定网络中年的设备
docker network inspect my_network

6、然后测试两容器间是否可以通过网络名称进行网络通信,分别使用具体 ip 和容器名称进行网络通信

# my_contain1 通过ip ping my_contain1
docker exec -it my_contain1 ping -c3 172.19.0.3
​
# my_contain2 通过ip my_contain1
docker exec -it my_contain2 ping -c3 172.19.0.2
​
# my_contain1 通过容器名称 ping my_contain2
docker exec -it my_contain1 ping -c3 my_contain2
​
# my_contain2 通过容器名称 my_contain1
docker exec -it my_contain2 ping -c3 my_contain1

经过测试,从结果得知两个属于同一个自定义网络的容器是可以进行网络通信的,并且可以使用容器名称进行网络通信。

上一章:Docker搭建私有仓库-CSDN博客 

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

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

相关文章

政安晨:【Keras机器学习实践要点】(六)—— 使用内置方法进行训练和评估

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras实战演绎机器学习 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 本文涵盖使用内置 API 进行训练和验证&#…

01-DBA自学课-安装部署MySQL

一、安装包下载 1,登录官网 MySQL :: MySQL Downloads 2,点击社区版下载 3,找到社区服务版 4,点击“档案”Archives 就是找到历史版本; 5,选择版本进行下载 本次学习,我们使用MySQL-8.0.26版本…

机器学习 | 期望最大化(EM)算法介绍和实现

在现实世界的机器学习应用中,通常有许多相关的特征,但只有其中的一个子集是可观察的。当处理有时可观察而有时不可观察的变量时,确实可以利用该变量可见或可观察的实例,以便学习和预测不可观察的实例。这种方法通常被称为处理缺失…

vue2高德地图选点

<template><el-dialog :title"!dataForm.id ? 新建 : isDetail ? 详情 : 编辑" :close-on-click-modal"false" :visible.sync"show" class"rv-dialog rv-dialog_center" lock-scroll width"74%" :before-close&q…

Vue.js概述

一、概述 数据驱动的响应式框架&#xff0c;我们只关注Vue对象里面设置的数据即可&#xff0c;数据发生改变时&#xff0c;页面自动重新渲染 最典型的MVVM框架 二、挂载点 什么是“挂载点”&#xff1f;一个标签 作用&#xff1a;被Vue实例接收后&#xff0c;实例中设置的各…

boot整合xfire

最近换了项目组&#xff0c;框架使用的boot整合的xfire&#xff0c;之前没使用过xfire&#xff0c;所以写个例子记录下&#xff0c;看 前辈的帖子 整理下 pom文件 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot…

Python爬虫入门:从网站爬取文章内容并保存到本地文件

目录 前言 准备工作 简单爬虫实现 注意事项 爬虫伦理与合法性 总结 前言 在互联网时代&#xff0c;数据是宝贵的资源。然而&#xff0c;当需要从海量网站中抓取数据时&#xff0c;手动操作显然不切实际。这时&#xff0c;爬虫技术应运而生&#xff0c;成为我们获取数据的…

OSG编程指南<二十一>:OSG视图与相机视点更新设置及OSG宽屏变形

1、概述 什么是视图?在《OpenGL 编程指南》中有下面的比喻,从笔者开始学习图形学就影响深刻,相信对读者学习场景管理也会非常有帮助。 产生目标场景视图的变换过程类似于用相机进行拍照,主要有如下的步骤: (1)把照相机固定在三脚架上,让它对准场景(视图变换)。 (2)…

【爬虫基础】第4讲 GET与POST请求

GET请求 GET请求是一种HTTP方法&#xff0c;用于向服务器获取&#xff08;或读取&#xff09;数据。它是Web开发中最常用的请求方式之一。对于GET请求&#xff0c;客户端向服务器发送一个HTTP请求&#xff0c;服务器返回请求的资源。GET请求通常用于获取静态资源&#xff0c;比…

记录关于智能家居的路程的一个bug___Segmentation fault(段错误)

前言 其实发生段错误的情况有很多&#xff1a; 其实在项目的开发中最有可能的错误就是①和②&#xff0c;考虑到本项目数组用的比较少&#xff0c;所以主要是考虑错误①指针的误用。 有时候错误就是那么离谱&#xff0c;声音也算是一种设备&#xff1f;&#xff1f;&#xff…

35.HarmonyOS App(ArkUI)使用父组件@Builder装饰的方法初始化子组件@BuilderParam报错

HarmonyOS App(ArkUI)使用父组件Builder装饰的方法初始化子组件BuilderParam报错 Type void is not assignable to type () > void. <tsCheck> 去掉括号()就可以了 装饰器&#xff1a; 用于装饰类、结构、方法以及变量&#xff0c;并赋予其特殊的含义。如上述示例中En…

SpringBoot实现RabbitMQ的简单队列(SpringAMQP 实现简单队列)

文章目录 1. 前言2. Basic Queue 简单队列模型2.1 父工程导入依赖2.2 消息发送2.2.1 消息发送方必要的配置2.2.2 发消息 3. 消息接收3.1 消息接收方必要的配置3.2 接收消息 1. 前言 SpringAMQP 是基于 RabbitMQ 封装的一套模板&#xff0c;并且还利用 SpringBoot 对其实现了自…

2024.3.26学习总结

一&#xff0c;正则匹配 正则匹配是用来搜索&#xff0c;匹配&#xff0c;替换的一种字符串模式&#xff0c;使用正则匹配可以让搜索匹配的语句更加简洁&#xff0c;在php中会使用一些函数来处理正则匹配 常用的语法&#xff1a; 字符类 [abc]: 匹配单个字符a、b或c[^abc]: 匹…

DevSecOps平台架构系列-互联网企业私有化DevSecOps平台典型架构

目录 一、概述 二、私有化DevSecOps平台建设思路 2.1 采用GitOps公有云建设 2.2 采用GitOps私有云建设 2.3 总结 三、GitOps及其生态组件 3.1 采用GitOps的好处 3.1.1 周边生态系统齐全 3.1.2 便于自动化的实现 3.1.3 开发人员属性GitOps 3.2 GitOps部分生态组件介绍…

搜维尔科技【应急推演】虚拟仿真技术的发展为煤炭矿井的安全生产找到新的出口

煤炭矿井的安全生产一直是我国关注的重大事项&#xff0c;保证煤炭矿井的安全生产&#xff0c;减少人员伤亡等不可逆的损失成为重中之重。虚拟仿真技术的发展为煤炭矿井的安全生产找到了新的出口。依托虚拟仿真技术&#xff0c;对煤炭矿井进行实时的生产监测&#xff0c;对矿井…

华为昇腾asend

昇腾Ascend C编程语言 Ascend C原生支持C/C编程规范&#xff0c;通过多层接口抽象、并行编程范式、孪生调试等技术&#xff0c;极大提高了算子的开发效率&#xff0c;帮助AI 参考文章 手把手教你在昇腾平台上搭建PyTorch训练环境 - 哔哩哔哩 (bilibili.com)https://www.bilibi…

科普 | Runes 预挖矿概念

作者&#xff1a;Jacky X/推&#xff1a;zxl2102492 关于 Runes 协议的前世今生&#xff0c;可以点击阅读这篇文章 &#x1f447; 《简述 Runes 协议、发展历程及最新的「公开铭刻」发行机制的拓展讨论》 什么是传统预挖矿概念 这轮比特币生态爆发之前&#xff0c;预挖矿&…

2024 MCM数学建模美赛2024年A题复盘,思路与经验分享:资源可用性与性别比例 | 性别比例变化是否对生态系统中的其他生物如寄生虫提供优势(五)

审题 第四问让我们探究性别比例变化是否对生态系统中的其他生物如寄生虫提供优势。这里我们可以把问题简化一下&#xff0c;只探究性别比例会不会对寄生虫提供优势。因为考虑太多生物&#xff0c;会使模型更复杂&#xff0c;我这个水平处理不了这么复杂的问题&#xff0c;是我…

Healix Protocol 的 HLX 通证预售:医疗领域的未来展望

Healix Protocol推出 HLX 通证预售&#xff0c;将带来医疗领域的重要变革。通过其区块链技术&#xff0c;Healix Protocol致力于重新定义医疗服务的可及性与负担性&#xff0c;成为医疗行业的希望之光。该项目旨在增强透明度、可及性和效率&#xff0c;推动医疗体系向更加公平和…

ripro子主题wori-child集成后台美化包(适用于设计素材站+资源下载站等)

新内容如下 1、子主题独立运行,彻底摆脱覆盖原主题文件 2、下载信息插件升级优化 3、细节优化 V1.0更新内容如下 1、同步暗黑美化、手机端美化 2、新增菜单合成幻灯片&#xff08;后台自行设置&#xff09; 3、新增公告统计 &#xff08;后台自行设置&#xff09; 4、新增…