简单说说-docker网络类型

news2024/11/24 23:31:21

概述

容器网络是指容器之间或非 Docker 工作负载之间连接和通信的能力。容器默认启用网络,并且可以建立传出连接。容器不知道它所连接的网络类型,容器只能看到带有 IP 地址、网关、路由表、DNS 服务和其他网络详细信息的网络接口。也就是说,除非容器使用none网络驱动程序。

网络类型

driver

描述

bridge

默认网络驱动程序。当您的应用程序在需要与同一主机上的其他容器通信的容器中运行时,通常会使用桥接网络。

host

移除容器和 Docker 主机之间的网络隔离,直接使用主机的网络。

none

将容器与主机和其他容器完全隔离。

overlay

Overlay 将多个 Docker 守护进程连接在一起,并使 Swarm 服务和容器能够跨节点通信。此策略消除了进行操作系统级路由的需要。

ipvlan

IPvlan 网络提供对 IPv4 和 IPv6 寻址的完全控制。VLAN 驱动程序建立在其之上,使运营商能够完全控制第 2 层 VLAN 标记,甚至为对底层网络集成感兴趣的用户提供 IPvlan L3 路由。

macvlan

Macvlan 网络允许您为容器分配 MAC 地址,使其在网络上显示为物理设备。Docker 守护进程通过 MAC 地址将流量路由到容器。macvlan 在处理希望直接连接到物理网络而不是通过 Docker 主机的网络堆栈路由的遗留应用程序时,使用驱动程序有时是最佳选择。

具体说说

bridge

就 Docker 而言,bridge 网络使用软件桥接,让连接到同一 bridge 网络的容器进行通信,同时提供与未连接到该bridge网络的容器的隔离。Docker bridge 驱动程序会自动在主机中安装规则,以便不同桥接网络上的容器无法直接相互通信。

bridge 使用 Linux 网桥和 iptables 提供容器互联,Docker 在每台主机上创建一个名叫 docker0的网桥,通过 veth pair(一头连到 docker0网桥,一头 设置为容器的eth0) 来连接该主机的每一个 EndPoint.其流程如下:

在shell 执行 docker network ls 可以看到我们的网络(默认和我们创建的)

[root@linjian ~]# docker network ls
NETWORK ID     NAME           DRIVER    SCOPE
770ec16c3825   app-tier       bridge    local 
cec3414e2d8c   bridge         bridge    local
9c36c1f845a1   home_default   bridge    local
1ca06cf881dc   host           host      local
b13d98abb5f8   none           null      local

可以使用--network bridge 选项可以指定启用bridge模式,bridge 是默认的网络模式,所以一般不指定也可以

docker run -itd --name mycontainer --network bridge xxx

我们可以先拉起两个alpine 两个容器

docker run -dit --name alpine1 alpine ash
docker run -dit --name alpine2 alpine ash

通过docker ps | grep alpine 可以看到已经拉起了

[root@linjian ~]# docker ps | grep alpine
217da339a460   alpine                          "ash"                     32 seconds ago   Up 31 seconds                                                                             alpine2
0d2e33ce99ea   alpine                          "ash"                     33 seconds ago   Up 32 seconds 

检查bridge网络以查看有哪些容器连接到它。

进到容器可以看到,可以成功ping到对方的服务

Host

容器使用host网络模式,则该容器的网络堆栈不会与 Docker 主机隔离(容器共享主机的网络命名空间),并且容器不会分配自己的 IP 地址。例如,如果您运行绑定到端口 80 的容器并且使用host 网络,则该容器的应用程序可在主机 IP 地址的端口 80 上使用。

主机模式网络对于以下用例非常有用:

  • 优化性能
  • 在容器需要处理大范围端口的情况下

这是因为它不需要网络地址转换 (NAT),并且不会为每个端口创建“用户层代理”。

主机网络驱动程序仅适用于 Linux 主机,Docker Desktop for Mac、Docker Desktop for Windows 或 Docker EE for Windows Server 不支持。

拉起一个aline,并用--network 指定host。

[root@linjian ~]# docker run -itd -p 9561:9561  --network host --name alpine_host alpine
WARNING: Published ports are discarded when using host network mode
5b0e2d67fdb4d34a291f2357b4fde79522e568cc81b67a49f8c131a9d056a825

这里注意一个WARNING: 使用host网络模式,容器没有自己的 IP 地址 host, 端口映射不会生效,并且-p、--publish、-P和--publish-all选项将被忽略,而是产生警告。

进到容器 ping www.baidu.com,发现可以访问的了百度,已经和宿主机共享网络了

[root@linjian ~]# docker attach alpine_host 
/ # ping www.baidu.com
PING www.baidu.com (180.101.50.242): 56 data bytes
64 bytes from 180.101.50.242: seq=0 ttl=50 time=10.128 ms
64 bytes from 180.101.50.242: seq=1 ttl=50 time=10.086 ms
64 bytes from 180.101.50.242: seq=2 ttl=50 time=10.063 ms
ç64 bytes from 180.101.50.242: seq=3 ttl=50 time=10.077 ms

overlay

如果是多台机器之间的容器需要访问,就可以使用overlay 网络模式。

在使用 overlay 前我们需要在一台机器(master)执行 docker swarm init 创建 swarm manager.

创建swarm manager

docker swarm init

[root@linjian ~]# docker network create --driver overlay overlayNet

docker swarm join --token SWMTKN-1-xxxxxxx xxx.xx.xxx.xxx:xxx

[root@linjian ~]# docker network ls
NETWORK ID     NAME              DRIVER    SCOPE
feb2f19dd8b9   alpine-test       bridge    local
770ec16c3825   app-tier          bridge    local
cec3414e2d8c   bridge            bridge    local
b438a2ffeac8   docker_gwbridge   bridge    local
9c36c1f845a1   home_default      bridge    local
1ca06cf881dc   host              host      local
u3zrqntexbvi   ingress           overlay   swarm
egfaukedlf8g   overlayNet        overlay   swarm

创建网络

一台机器安装

docker run -itd   --network overlayNet   --name overlay-alpine01   alpine:latest ash

在另外一台机器安装

docker run -itd --name overlay-alpine02 --network overlayNet alpine:latest ash

测试

docker exec -it overlay-alpine02 ping overlay-alpine01 

none

如果你想完全隔离容器的网络堆栈,可以--network none在启动容器时使用该标志。在容器内,仅创建环回设备。

host 网络模型的时候我们可以看到容器的网络配置

我们创建一个网络类型 None的看看,只有一个lo回环网络

[root@linjian ~]# docker run --rm --network none --name no-net-alpine alpine:latest ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever

Macvlan

一些应用服务希望直接连接到物理网络,比如说核心应用程序或监控网络流量的应用程序。在这种情况下,您可以使用macvlan网络驱动程序为每个容器的虚拟网络接口分配一个MAC地址,使其看起来像是直接连接到物理网络的物理网络接口。需要在Docker主机上指定一个物理接口用于Macvlan,以及网络的子网和网关,甚至可以使用不同的物理网络接口隔离Macvlan网络。

创建一个macvlan 名为 的网络 my-macvlan-net

docker network create -d macvlan --subnet=<subnet> --gateway=<gateway> -o parent <physical_interface> <network_name>

subnet :一个可用于Macvlan网络的子网地址;

gateway:Macvlan网络的网关地址;

physical_interface:宿主机上用于连接到物理网络的接口名称; (这个可以通过ip addr show 查看)

network_name:Macvlan网络的名称。

[root@linjian ~]# docker network create -d macvlan \
>   --subnet=172.16.86.0/24 \
>   --gateway=172.16.86.1 \
>   -o parent=eth0 \
>   my-macvlan-net
78595591dbc064da42574e27fbd1ed9a2ebf5b4312fe391d645adf801eeb8099

通过docker network ls和docker network inspect my-macvlan-net 命令来验证网络是否存在my-macvlan-net 并且是一个macvlan网络

[root@linjian ~]# docker network ls | grep my-macvlan-net
78595591dbc0   my-macvlan-net   macvlan   local

[root@linjian ~]# docker network inspect my-macvlan-net
[
    {
        "Name": "my-macvlan-net",
        "Id": "78595591dbc064da42574e27fbd1ed9a2ebf5b4312fe391d645adf801eeb8099",
        "Created": "2023-12-28T17:33:18.259298162+08:00",
        "Scope": "local",
        "Driver": "macvlan",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.16.86.0/24",
                    "Gateway": "172.16.86.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "parent": "eth0"
        },
        "Labels": {}
    }
]

查看容器信息,docker inspect my-macvlan-alpine

启动一个容器并将其连接到my-macvlan-net网络, 查看网络信息

[root@linjian ~]# docker attach my-macvlan-alpine
/ # ip addr show eth0
30: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:10:56:02 brd ff:ff:ff:ff:ff:ff
    inet 172.16.86.2/24 brd 172.16.86.255 scope global eth0
       valid_lft forever preferred_lft forever

IPvlan

IPvlan 驱动程序让用户可以完全控制 IPv4 和 IPv6 寻址。Linux实现非常轻量级,因为它们不是使用传统的Linux网桥进行隔离,而是与Linux以太网接口或子接口相关联,以强制分离网络和物理网络的连接。

IPvlan 与 Macvlan 类似,但不为容器分配唯一的 MAC 地址,而是通过虚拟的MAC地址来访问网络。在使用IPvlan需要注意 Linux 内核 v4.2+(uname -r 查看)

ipvlan 有两种不同的模式:L2 和 L3。

L2

和 macvlan bridge 模式工作原理类似,父接口作为交换机来转发子接口的数据。同一个网络的子接口可以通过父接口来转发数据,而如果想发送到其他网络,报文则会通过父接口的路由转发出去。

L3

IPvlan 将要求将路由分发到每个端点。驱动程序仅构建 IPvlan L3 模式端口并将容器附加到接口。整个集群的路由分布超出了这个单一主机范围驱动程序的初始实现。在 L3 模式下,Docker 主机非常类似于在容器中启动新网络的路由器。

创建ipvlan网络

docker network create -d ipvlan \
    --subnet=192.168.1.0/24 \
    --gateway=192.168.1.1 \
    -o ipvlan_mode=l2 \
    -o parent=eth0 db_net

  • -d ipvlan 指定网络驱动程序为Ipvlan
  • --subnet 指定网络子网
  • --gateway 指定网络网关
  • -o parent 指定网络接口
  • -o ipvlan_mode 设置 IPvlan 工作模式。可以是以下之一:l2, l3,l3s (默认bridgel2)
  • ipvlan-network 是网络的名称
  • ipvlan_flag 设置 IPvlan 模式标志。可以是以下之一:bridge, private,vepa(默认bridge)

拉起alpine容器并使用ipvlan网络

docker run --net=db_net -it --rm alpine /bin/sh

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

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

相关文章

【Docker与微服务】基础篇

1 Docker简介 1.1 docker是什么 1.1.1 问题&#xff1a;为什么会有docker出现&#xff1f; 假定您在开发一个项目&#xff0c;您使用的是一台笔记本电脑而且您的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。您正在开发的应用依赖于您当前的配置且还要依…

ElementUI Data:Table 表格

ElementUI安装与使用指南 Table 表格 点击下载learnelementuispringboot项目源码 效果图 el-table.vue&#xff08;Table表格&#xff09;页面效果图 项目里el-table.vue代码 <script> export default {name: el_table,data() {return {tableData: …

基于微信小程序的医保行政执法案件管理系统

本系统设计的是一个医保行政执法的网站&#xff0c;此网站使用户实现了不需出门就可以在手机或电脑前进行网上查询需求信息等。 用户在注册登陆后&#xff0c;在客户端可以实现&#xff1b;案件信息、结案归档、我的等。然而管理员则可以在服务端直接管理&#xff1b;个人中心、…

学成在线:采用XXL-JOB任务调度方案使用FFmpeg处理视频转码业务

分片技术方案 概述 XXL-JOB并不直接提供数据处理的功能&#xff0c;它只会给所有注册的执行器分配好分片序号&#xff0c;在向执行器下发任务调度的同时携带分片总数和当前分片序号等参数 设计作业分片方案保证多个执行器之间不会查询到重复的任务,保证任务不会重复执行 任…

如何标准化地快速编辑文档

介绍个公文类的文档技巧吧&#xff0c;尤其在国企、机关、有ISO管理体系内控要求的会议记录、公文写作等&#xff0c;要求大同小异&#xff0c;一般都是中规中矩的【GB/T 9704—2012】&#xff0c;其实国标本身就是经过长期检验&#xff0c;证明是最规范合理&#xff0c;阅读效…

交友系统---让陌生人变成熟悉人的过程。APP小程序H5三端源码交付,支持二开。

随着社交网络的发展和普及&#xff0c;人们之间的社交模式正在发生着深刻的变革。传统的线下交友方式已经逐渐被线上交友取而代之。而同城交友正是这一趋势的产物&#xff0c;它利用移动互联网的便利性&#xff0c;将同城内的人们连接在一起&#xff0c;打破了时空的限制&#…

uniapp基于Android的环境保护环保商城系统生活垃圾分类 小程序_rsj68

本环境保护生活App是为了提高用户查阅信息的效率和管理人员管理信息的工作效率&#xff0c;可以快速存储大量数据&#xff0c;还有信息检索功能&#xff0c;这大大的满足了用户和管理员这两者的需求。操作简单易懂&#xff0c;合理分析各个模块的功能&#xff0c;尽可能优化界面…

SpringBoot整合Flowable最新教程(一)Flowable介绍

一、Flowable 入门介绍 代码实现文章&#xff1a;SpringBoot整合Flowable最新教程&#xff08;二&#xff09; 官网地址&#xff1a;https://www.flowable.org/   Flowable6.3中文教程&#xff1a;中文教程地址   可以在官网下载对应的jar包在本地部署运行&#xff0c;官方…

STM32L4学习

STM32L4系列是围绕Cortex-M4构建&#xff0c;具有FPU和DSP指令集&#xff0c;主频高达80MHz。 STM32CubeL4简介 STM32Cube 是 ST 提供的一套性能强大的免费开发工具和嵌入式软件模块&#xff0c;能够让开发人员在 STM32 平台上快速、轻松地开发应用。它包含两个关键部分&…

VS2017+Qt运行打开黑窗口

右键工程属性&#xff0c;找到链接器->系统->改为控制台即可

【5G SA流程】5G SA下终端完整注册流程介绍

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客内容主要围绕: 5G/6G协议讲解 …

09.领域驱动设计:深入学习6本经典推荐书籍

目录 前言 1、《领域驱动设计&#xff1a;软件核心复杂性应对之道》 1.作者简介 2.内容简介 3.推荐理由 4.豆瓣链接 ​编辑 2、《实现领域驱动设计》 1.作者简介 2.内容简介 3.推荐理由 4.豆瓣链接 ​编辑 3、《领域驱动设计精粹》 1.作者简介 2.内容简介 3.推…

缓存的概念

文章目录 一、系统缓存buffer与cachecache 的保存位置cache 的特性 二、用户层缓存DNS缓存 三、浏览器缓存过期机制最后修改时间Etag标记过期时间 expires混合使用和缓存刷新缓存刷新 cookie和session 四、CDN缓存什么是CDN用户请求CDN流程利用 302 实现转发请求重定向至最优服…

C语言实现跳表(附源码)

最近在刷一些链表的题目&#xff0c;在leetcode上有一道设计跳表的题目&#xff0c;也是通过查阅各种资料&#xff0c;自己实现出来&#xff0c;感觉这是种很神奇的数据结构。 一.简介 跳表与红黑树&#xff0c;AVL树等&#xff0c;都是一种有序集合&#xff0c;那既然是有序…

Maven打包常用插件介绍与问题分析

文章目录 简介创建测试项目maven-jar-plugin打可执行包依赖在哪里&#xff1f; maven-assembly-pluginmaven-shade-pluginspring-boot-maven-pluginmvn打包一个比较坑的问题打包问题排查 简介 很多时候我们不太会关心maven是如何打包的&#xff0c;因为maven的确做得很棒&…

4个最佳的免费全磁盘加密程序,总有一款适合你

全磁盘加密软件加密整个驱动器,而不仅仅是几个文件或文件夹。加密计算机的驱动器可以使你的私人数据免受窥探,即使你的计算机被盗。 你也不仅仅局限于一个硬盘驱动器。闪存驱动器和外部硬盘驱动器等外部设备也可以通过磁盘加密软件进行加密。 注意:Windows和macOS都集成了…

3. 状态管理 vuex 状态管理库

目录 3.1 vuex 介绍 3.2 使用方式 3.1 vuex 介绍 vuex 是一个专为 Vue.js 应用程序开发的状态管理库 vuex 可以在多个组件之间共享数据&#xff0c;并且共享的数据是响应式的&#xff0c;即数据的变更能及时渲染到模板 vuex 采用集中式存储管理所有组件的状态 每一个 Vuex…

【Android】RxJava系列01-基本概述和基本用法

少年啊&#xff0c;要永远相信美好的事情即将发生 【Android】RxJava系列01-基本概述和基本用法 1.RxJava的概述2.RxJava的作用3.观察者和被观察者4.背压5.RxJava的基本用法步骤一&#xff0c;创建Observer&#xff08;观察者&#xff09;步骤二&#xff0c;创建Observable&…

【C++】类和对象之运算符重载(三)

前言&#xff1a;在前面我们知道在类和对象中有六个默认成员函数&#xff0c;并学习了其中三个构造函数、析构函数、拷贝构造函数&#xff0c;今天我们将进一步的学习.赋值运算符重载。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:高质…

UnityShader 边缘光效果

效果&#xff1a; 代码实现&#xff1a; Shader "MyShader/Sim" {Properties{_MainTex("主贴图",2D)"white"{}_MainColor("主贴图颜色",color)(1,1,1,1)_InnerSimPower("内描边强度",Range(-1.0,3.0))0.0_InnerSimColor(&…