Docker中网络的使用和配置用法详解

news2024/11/23 21:41:59

一、单个物理机中docker网络

1.1 Docker默认网桥

        安装Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。

使用 docker network ls 命令查看:

Docker 安装时会自动在 host 上创建三个网络:none,host,和bridge。

接下来我们查看一下docker0 网桥:(brctl可以通过yum install bridge-utils安装)

使用docker network inspect指令查看bridge网络:其Gateway就是网卡/接口docker0的IP地址:172.17.0.1。  【里面包含了bridge的配置信息和容器信息】

[root@192 keepmoving]# docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "581adbbf78d32412c411c274bb65c339f496b24e9cef5ad69f8d038bcc371c1b",
        "Created": "2023-02-24T23:41:35.720677409+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "56657ecbb6763ce60e33232ba09b7f1ae68d9856b85ad61b52c581a47a896464": {
                "Name": "test_db",
                "EndpointID": "e66a48ecc3be4a0a1f8fce53035181d5ac3de64953c6d0bc4bc705c4b63d11f7",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            },
            "73a026235a47df3d0733429181406f9b2f58faa5f674b4aefef9811f82274395": {
                "Name": "web",
                "EndpointID": "36d59702812b5bc3fb716fc4dccbcb141fd07e3a56706f681881cd489ec86dec",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

1.2 容器创建时IP的分配

        为了理解容器创建时的IP分配,这里需要清理所有已经启动的环境,然后再启动容器,看前后对比。

1.2.1 首先清理掉docker中安装的所有容器:

1.2.2 查看docker中的网络配置:

[root@192 keepmoving]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
581adbbf78d3   bridge    bridge    local
869c7c8ca191   host      host      local
6c29ce5e0291   none      null      local
[root@192 keepmoving]# docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "581adbbf78d32412c411c274bb65c339f496b24e9cef5ad69f8d038bcc371c1b",
        "Created": "2023-02-24T23:41:35.720677409+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]
[root@192 keepmoving]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:83:f9:57 brd ff:ff:ff:ff:ff:ff
    inet 192.168.124.49/24 brd 192.168.124.255 scope global noprefixroute dynamic ens33
       valid_lft 82491sec preferred_lft 82491sec
    inet6 fe80::c890:8da3:b20c:a830/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:4c:33:99:1a brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:4cff:fe33:991a/64 scope link 
       valid_lft forever preferred_lft forever
[root@192 keepmoving]# brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.02424c33991a       no              

1.2.3 创建容器

Docker 在创建一个容器的时候,会执行如下操作:

  • 创建一对虚拟接口/网卡,也就是veth pair,分别放到本地主机和新容器中;
  • 本地主机一端桥接到默认的 docker0 或指定网桥上,并具有一个唯一的名字,如 vethxxxxx;
  • 容器一端放到新容器中,并修改名字作为 eth0,这个网卡/接口只在容器的名字空间可见;
  • 从网桥可用地址段中(也就是与该bridge对应的network)获取一个空闲地址分配给容器的 eth0,并配置默认路由到桥接网卡 vethxxxx。
[root@192 keepmoving]# docker run -d --name test_db training/postgres
92fa2114c8b74f739064e2b79d669ca8484686b471a1ea237d34b32c4316b50b
[root@192 keepmoving]# brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.02424c33991a       no              veth6f6298f
[root@192 keepmoving]# ip a | grep veth6f6298f
17: veth6f6298f@if16: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
[root@192 keepmoving]# docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "581adbbf78d32412c411c274bb65c339f496b24e9cef5ad69f8d038bcc371c1b",
        "Created": "2023-02-24T23:41:35.720677409+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "92fa2114c8b74f739064e2b79d669ca8484686b471a1ea237d34b32c4316b50b": {
                "Name": "test_db",
                "EndpointID": "98395df29096ab53f63bb6d44c1c28d0b949c992e9dcc3774e1826e6282e2d57",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

如果不指定--network,创建的容器默认都会挂到 docker0 上,使用本地主机上 docker0 接口的 IP 作为所有容器的默认网关。

当有多个容器创建后,容器网络拓扑结构如下:

1.3 容器和docker0的虚拟网卡的配对

        接下来来探究容器中的eth0是怎么和host中的虚拟网络进行配对的。

        可以看到host上17: veth6f6298f@if16对应着容器中16: eth0@if17; 即host中index=17的接口/网卡veth6f6298f的peer inferface index是16, container中index=16的网卡eth0的peer interface index是17。
注:host上17: veth6f6298f是创建容器时生成的(ip a)。

可以利用ethtool来确认这种对应关系:分别在host和container中运行指令ethtool -S <interface>:

ethtool -S veth6f6298f

docker exec -it 92fa2114c8b7 /bin/bash
ip a | grep 16

二、多个物理机中docker网络

        在公司内部或者使用多个物理机搭建集群时,需要将多个物理机的容器组到一个物理网络中来,这个时候需要将这个网桥桥接到指定的网卡上。

2.1 拓扑图

        主机 A 和主机 B 的物理网卡一都连接着物理交换机的同一个 vlan 101中,这样网桥一和网桥三就相当于在同一个物理网络中了,而容器一、容器三、容器四也在同一物理网络中了,他们之间可以相互通信,而且可以跟同一 vlan 中的其他物理机器互联。

2.2 Centos实例

        未完待续。。。

参考博文:

Docker基础 - Docker网络使用和配置 | Java 全栈知识体系

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

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

相关文章

初识猿如意开发工具

嗨&#xff0c;大家好&#xff0c;我是异星球的小怪同志 一个想法有点乱七八糟的小怪 如果觉得对你有帮助&#xff0c;请支持一波。 希望未来可以一起学习交流。 一、初遇猿如意 第一次听说猿如意开发工具&#xff0c;于是抱着试试的心态&#xff0c;开始下载尝试。 首先是…

算法导论23章最小生成树习题—23.2练习

23.2-1对于同一个输人图&#xff0c;Kruskal 算法返回的最小生成树可以不同。这种不同来源于对边进行排序时&#xff0c;对权重相同的边进行的不同处理。证明:对于图G的每棵最小生成树T&#xff0c;都存在一种办法来对G的边进行排序&#xff0c;使得Kruskal算法所返回的最小生成…

HTML+CSS+JS网页设计期末课程大作业——上海旅游景点(10页)web前端开发技术 web课程设计 网页规划与设计

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

离散化【带题讲解】

全文目录&#x1f914; 原理&#x1f615; 区间和&#x1f635;‍&#x1f4ab; 建立映射&#x1f635;‍&#x1f4ab; 查找映射的下标&#x1f635;‍&#x1f4ab; 代码&#x1f914; 原理 离散化&#xff0c;把无限空间中有限的个体映射到有限的空间中去&#xff0c;以此提…

NVIDIA 安装 CUDA

名词解释&#xff1a;CUDA 是一个架构 该架构使GPU能够解决复杂的计算问题 此实战使用电脑为联想Y9000P 显卡型号为 3060 在安装 CUDA 之前需要先打开 NVIDIA 控制面板 一、准备工作 如图我这个显卡需要安装 CUDA 11.7 的版本 二、下载软件 进入官网下载 CUDA NVIDIA Deve…

解放军军官军衔(不含士兵军衔)分为3等10级

军衔&#xff0c;是国家最高权力机关授予军人的一种衔称。不同的级别有不同的军衔。对于军衔的认识&#xff0c;一些朋友或许只有片面的认识&#xff0c;下面&#xff0c;笔者就给大家来科普一下中国的军衔。 为了纪念中国人民解放军建军93周年&#xff0c;弘扬爱国主义精神&a…

被迫毕业,面试 30 家公司,终于上岸了!

大家好&#xff0c;我是君哥。今天分享一个老弟&#xff0c;被“毕业”后的求职经历。 在老东家干了 6 年&#xff0c;发展一般&#xff0c;很想出去&#xff0c;但是一直没有合适的机会&#xff0c;只好一边准备面试一边学习。让我没有想到的是&#xff0c;突然收到了“毕业”…

(1-线性回归问题)线性回归(Linear regression)Lasso回归和Ridge回归的区别

回归分析是机器学习中的经典算法之一&#xff0c;用途广泛&#xff0c;在用实际数据进行分析时&#xff0c;可能会遇到以下两种问题 过拟合, overfitting欠拟合, underfitting 在机器学习中&#xff0c;首先根据一批数据集来构建一个回归模型&#xff0c;然后在用另外一批数据…

Vue 中 (moment)操作日期的加减与展示

目录 基本语法 &#xff1a; 展示效果如下&#xff1a; 使用方式&#xff1a; 1、首先在 pacaage.json 中引入依赖 "moment": "^2.29.4" 2、然后命令行 install 安装 &#xff1a; 3、最后&#xff0c;在使用的页面引入moment 4、data 中我定义了一个…

python的Django项目中常见命令以及常错点(Linux环境下)

USE 数据库名 --------------- 切换数据库更新virtualenv库&#xff08;用于创建虚拟环境&#xff09;&#xff1a;sudo pip install -U virtualenv创建虚拟环境&#xff1a;virtualenv -p python venv(虚拟环境的目录名)激活虚拟环境&#xff1a;source venv/b…

利用Python处理excel表格,panda合并表格、合并多个excel、多个sheet

前言 记录一下&#xff0c;在使用pandas处理excel表格表格时候&#xff0c;关于分割(切分)表格这一块儿的操作。 这个系列会有三篇左右文章&#xff0c;这是第二篇&#xff0c;excel表格合并 我们常说的 excel文件&#xff0c; 在广义上&#xff0c;是指以 xls 或 xlsx 为后缀…

[1173]regexp_replace()和regexp_substr()函数的用法

文章目录REGEXP_REPLACE的使用方法命令格式&#xff1a;regexp_replace(source, pattern, replace_string, occurrence)参数说明返回值常用案例其他案例正则符号释义regexp_substr()函数的用法REGEXP_REPLACE的使用方法 命令格式&#xff1a;regexp_replace(source, pattern, r…

PF-Net基于深度学习的点云补全网络

1. 论文和代码 论文&#xff1a;https://openaccess.thecvf.com/content_CVPR_2020/papers/Huang_PF-Net_Point_Fractal_Network_for_3D_Point_Cloud_Completion_CVPR_2020_paper.pdfhttps://openaccess.thecvf.com/content_CVPR_2020/papers/Huang_PF-Net_Point_Fractal_Netw…

微信小程序开发 开启

小程序和普通网页开发的区别 1.运行环境不同 小程序是运行在微信环境中&#xff0c;而网页是运行在浏览器环境中。 2.API不同 由于运行环境不同&#xff0c;所以小程序中&#xff0c;无法调用DOM和BOM的API。 但是&#xff0c;小程序中可以调用微信环境提供的各种API&#…

Vue框架常用组件的快速构建项目Ctrl+c Ctrl+a Ctrl+v第十四课)

不管前方的路有多苦&#xff0c;只要走的方向正确&#xff0c;不管多么崎岖不平&#xff0c;都比站在原地更接近幸福。 在学习技术的道路上&#xff1a;落后又要被挨打。这是现实 常用到的组件库:下面的网站在自己空闲时间去看看 下面的资源只需要ctrlc ctrla ctrv Border 边框…

业务:财务软件之会计六要素

一、引言 会计六要素是资产、负债、所有者权益、收入、费用、利润。资产随处可见&#xff0c;比如房屋、机器设备、运输工具、仓库里的货物等。负债确认必须具备以下条件&#xff1a;负债是企业承担的现时义务&#xff1b;负债预期会导致经济利益流出企业&#xff1b;负债是由…

[附源码]计算机毕业设计JAVA学生宿舍设备报修

[附源码]计算机毕业设计JAVA学生宿舍设备报修 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

MobileOne实战:使用MobileOne实现图像分类任务(二)

文章目录训练导入项目使用的库设置全局参数图像预处理与增强读取数据设置模型定义训练和验证函数训练函数验证函数调用训练和验证方法再次训练再次训练的模型为什么只保存model.state_dict()关于加入EMA后验证集不得分的问题测试总结在上一篇文章中完成了前期的准备工作&#x…

C# 反射(一)基础概念

一、C# 反射&#xff08;refection&#xff09;基础概念 反射指程序可以访问、检测和修改它本身状态或行为的一种能力。 程序集包含模块&#xff0c;而模块包含类型&#xff0c;类型又包含成员。 反射则提供了封装程序集、模块和类型的对象。 您可以使用反射动态地创建类型…

Spring框架(七):Spring的Web配置应用

Spring的Web配置应用引子JavaWeb的三大组件模拟Spring的web开发组件spring-webSpring的web开发组件spring-web引子 痛定思痛&#xff0c;主要问题出现在自己雀氏不熟悉框架底层、一些面试题&#xff0c;以及sql的一些情况淡忘了。 本章节的开始是对于过去的重新回顾&#xff0…