docker网络详解,自定义docker网络

news2024/11/24 19:28:39

文章目录

  • 一、初识docker网络
    • 1、docker0虚拟网桥
    • 2、docker网络常用基本命令
    • 3、docker网络可以解决的问题
  • 二、docker网络模式
    • 1、四种网络模式
    • 2、容器实例内默认网络IP生产规则
    • 3、bridge模式
    • 4、host模式
    • 5、none模式
    • 6、container模式
  • 五、自定义网络模式
    • 1、过时的docker link
    • 2、使用自定义网络前
    • 3、使用自定义网络
    • 4、总结

一、初识docker网络

1、docker0虚拟网桥

docker启动之后,在本机网络中会出现一个docker0的虚拟网桥,docker就是在这个网桥的基础上进行网络通讯的。

[root@localhost ~]# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:55ff:fe91:27de  prefixlen 64  scopeid 0x20<link>
        ether 02:42:55:91:27:de  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5  bytes 446 (446.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.56.10  netmask 255.255.255.0  broadcast 192.168.56.255
        inet6 fe80::a00:27ff:fedd:f690  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:dd:f6:90  txqueuelen 1000  (Ethernet)
        RX packets 24575  bytes 1971420 (1.8 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 20128  bytes 2203182 (2.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

2、docker网络常用基本命令

# 查看网络(安装docker会默认创建3大网络模式)
[root@localhost ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
ff578279c4c5   bridge    bridge    local
83c25282c4d8   host      host      local
6451c3243251   none      null      local

# 查看网络源数据
docker network inspect  XXX网络名字
# 查看 bridge 网络的详细信息
[root@localhost ~]# docker network inspect bridge


# 删除网络
docker network rm XXX网络名字

# 查看帮助
[root@localhost ~]# docker network --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

3、docker网络可以解决的问题

容器间的互联和通信以及端口映射。

容器IP变动时候可以通过服务名直接网络通信而不受到影响。

二、docker网络模式

1、四种网络模式

docker总共有四种网络模式:

bridge模式:使用--network  bridge指定,默认使用docker0
host模式:使用--network host指定
none模式:使用--network none指定
container模式:使用--network container:NAME或者容器ID指定
网路模式简介
bridge为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,默认为该模式
host容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口
none容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair和网桥连接,IP等
container新建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP,端口范围等

2、容器实例内默认网络IP生产规则

(1)我们分别启动两个ubuntu容器,并且使用ctrl + p + q退出使其后台运行

docker run -it --name u1 ubuntu bash
docker run -it --name u2 ubuntu bash

[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED              STATUS              PORTS     NAMES
6bb36da63758   ubuntu    "bash"    56 seconds ago       Up 55 seconds                 u2
ade32205d652   ubuntu    "bash"    About a minute ago   Up About a minute             u1

(2)我们分别查看u1和u2的网络情况

[root@localhost ~]# docker inspect u1 | tail -n 20
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "ff578279c4c58fa49282cbc08832a43eab6ce13d3490fb3c92be3d5d269559d1",
                    "EndpointID": "cdb142d2f794f59fdfb1ac3f43ce16875c9de5e6ede5507c0bb255caff5c4063",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]

[root@localhost ~]# docker inspect u2 | tail -n 20
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "ff578279c4c58fa49282cbc08832a43eab6ce13d3490fb3c92be3d5d269559d1",
                    "EndpointID": "10c4b59a121375c0345b5488148b18f0833f62f0726e9eec38482569ddc0e374",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:03",
                    "DriverOpts": null
                }
            }
        }
    }
]

我们可以看出,u1的ip是172.17.0.2,u2的ip是172.17.0.3,并且都使用bridge的模式。

(3)我们删掉u2,再启动一个u3

docker rm -f 6bb36da63758
docker run -it --name u3 ubuntu bash

[root@localhost ~]# docker inspect u3 | tail -n 20
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "ff578279c4c58fa49282cbc08832a43eab6ce13d3490fb3c92be3d5d269559d1",
                    "EndpointID": "9643672d66cd69ed297556f3b2345199eeff3d77e8af977d0946be67a52a82ee",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:03",
                    "DriverOpts": null
                }
            }
        }
    }
]

我们查看u3的网络,发现u3的网络和原来的u2是一样的,对于这种变化不定的网络,我们是需要进行配置的。

3、bridge模式

Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信。

1 Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。

2 docker run 的时候,没有指定network的话默认使用的网桥模式就是bridge,使用的就是docker0。在宿主机ifconfig,就可以看到docker0和自己create的network(后面讲)eth0,eth1,eth2……代表网卡一,网卡二,网卡三……,lo代表127.0.0.1,即localhost,inet addr用来表示网卡的IP地址

3 网桥docker0创建一对对等虚拟设备接口一个叫veth,另一个叫eth0,成对匹配。
3.1 整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair);
3.2 每个容器实例内部也有一块网卡,每个接口叫eth0;
3.3 docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。
通过上述,将宿主机上的所有容器都连接到这个内部网络上,两个容器在同一个网络下,会从这个网关下各自拿到分配的ip,此时两个容器的网络是互通的。

在这里插入图片描述

我们分别启动两个容器,对网络进行验证,发现确实是容器中eth0和宿主机veth一一对应的。
在这里插入图片描述

4、host模式

host模式直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行NAT 网桥转换。

容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口。
在这里插入图片描述

# 使用host模式启动tomcat,如果仍然指定端口的话,会出现警告
docker run -d -p 8083:8080 --network host --name tomcat tomcat
# WARNING: Published ports are discarded when using host network mode

# 不需要指定端口
docker run -d --network host --name tomcat tomcat

# 使用host模式不会有端口映射
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED          STATUS          PORTS                                       NAMES
d8d2e6b0dd23   tomcat    "catalina.sh run"   2 seconds ago    Up 1 second     0.0.0.0:8083->8080/tcp, :::8083->8080/tcp   tomcat2
afca1328da50   tomcat    "catalina.sh run"   3 minutes ago    Up 3 minutes                                                tomcat

docker启动时指定–network=host或-net=host,如果还指定了-p映射端口,那这个时候就会有此警告,并且通过-p设置的参数将不会起到任何作用,端口号会以主机端口号为主,重复时则递增。

此时,不管是在宿主机还是容器中,使用ip addr显示的内容是一样的,因为都是使用的宿主机的网卡。

5、none模式

禁用网络功能,只有lo标识(就是127.0.0.1表示本地回环)

# 使用none模式
docker run -d -p 8084:8080 --network none --name tomcatnone tomcat

此时,进入容器之后,使用ip addr命令,只有127.0.0.1网络。

none模式几乎很少用。

6、container模式

新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。
在这里插入图片描述

# 启动一个unbutu
docker run -it --name u1 ubuntu bash

# 启动第二个
docker run -it --network container:u1 --name u2  ubuntu bash

我们分别在两个容器中使用ip addr查看网络,发现是一致的:
在这里插入图片描述
此时我们关闭u1容器,发现u2容器之后一个lo回环地址了,再启动u1也不会出现新的网络。

五、自定义网络模式

1、过时的docker link

官网提示,link模式在后续版本可能会被移除掉。
官网:https://docs.docker.com/network/links/
在这里插入图片描述

2、使用自定义网络前

# 启动一个unbutu,默认使用网桥模式bridge
docker run -it --name u1 ubuntu bash

# 启动第二个,默认使用网桥模式bridge
docker run -it --name u2  ubuntu bash

通过ip addr我们发现,u1的ip是172.17.0.2,u2的ip是172.17.0.3,使用ping命令可以互相ping通。
在这里插入图片描述
在这里插入图片描述
但是互相ping名字的话,会出现服务找不到的问题。
在这里插入图片描述

3、使用自定义网络

# 新建自定义桥接网络,自定义网络默认使用的是桥接网络bridge
[root@localhost /]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
ff578279c4c5   bridge    bridge    local
83c25282c4d8   host      host      local
6451c3243251   none      null      local
[root@localhost /]# docker network create my_network
a83033be4cba946e5bd8795401a0710aac368f71989e247bebe2a32b4b80e6a7
[root@localhost /]# docker network ls
NETWORK ID     NAME         DRIVER    SCOPE
ff578279c4c5   bridge       bridge    local
83c25282c4d8   host         host      local
a83033be4cba   my_network   bridge    local
6451c3243251   none         null      local
# 启动ubuntu容器,并指定自定义的网络
docker run -it --network my_network --name u3 ubuntu
docker run -it --network my_network --name u4 ubuntu
# ping ip 可以ping通
ping 172.19.0.2

# ping服务名,也可以ping通!
ping u4

4、总结

自定义网络本身就维护好了主机名和ip的对应关系(ip和域名都能通)

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

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

相关文章

【英语】大学英语CET考试,词汇语法导学方法论笔记(50h+)

文章目录1、谭剑波-词汇直播课1-2&#xff08;词汇学习3个关键&#xff09;1.1 看不懂句子的原因&#xff08;词汇的重要性&#xff09;1.2 记不住单词的原因&#xff08;死记硬背70%&#xff09;1.3 理解单词的本质&#xff08;词根词缀&#xff0c;26字母&#xff0c;联想辅助…

D3D11和D3D12共享资源

最近碰到个伪需求: 游戏串流。 游戏引擎用D3D12渲染&#xff0c; 再把游戏画面做视频编码&#xff0c; 通过网络发送到远端做解码显示。 第一反应就是走全GPU的流程&#xff0c; 不要用CPU把显存里的数据拷来拷去。 所以先获取渲染完的D3D12的frame buffer&#xff0c; 然后送给…

进程管理 - 银行家算法

文章目录1 概述2 银行家算法2.1 原理2.2 例题1 概述 #mermaid-svg-7QKAqjQpckpStO9Q {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-7QKAqjQpckpStO9Q .error-icon{fill:#552222;}#mermaid-svg-7QKAqjQpckpStO9Q .e…

android framework-PackageManagerService(PKMS)包管理服务

一、概述 Android系统启动过程中&#xff0c;会启动一个包管理服务PackageManagerService(PKMS)&#xff0c;这个服务主要负责扫描系统中指定目录&#xff0c;找出里面以apk结尾的文件&#xff0c;通过对这些文件进行解析&#xff0c;得到应用程序的所有信息并完成应用程序的安…

算法学习day59

算法学习day591.力扣503.下一个更大元素II1.1 题目描述1.2 分析1.3代码2.力扣42. 接雨水2.1 题目描述2.2 分析2.3 代码3.参考资料1.力扣503.下一个更大元素II 1.1 题目描述 题目描述&#xff1a; 给定一个循环数组&#xff08;最后一个元素的下一个元素是数组的第一个元素&a…

【大数据Hadoop】HDFS3.3.1-Namenode-租约管理

租约管理前言LeaseManager.LeaseLeaseManager添加租约 - addLease租约检查 - FsNamesystem.checkLease租约更新 - renewLease删除租约 - removeLease租约检查 - Monitor 线程租约恢复 - Monitor 线程发起租约恢复 - 其他方式发起前言 我们知道 HDFS 文件是 write-once-read-man…

CloudCompare插件开发之点云如何创建、保存并显示?

文章目录0.引言1.创建插件工程2.代码编写3.显示点云4.保存点云0.引言 CloudCompaer是一款优秀的开源软件&#xff0c;在点云处理时可以根据实际要求开发合适的插件&#xff0c;在实际使用中&#xff0c;创建点云、保存点云、显示点云的操作较为基础&#xff0c;为了使这些操作得…

施工组织设计合集

34-6 施工组织设计02017-年亲曼旗大镇市政道路及广场公园园林绿化工程(第一.A1-1五中教学楼施工组织设计A2施工组织设计(方案) 报审表hasuploaded-中建施|组织设计 (22P)安徽大包庄125万吨疏铁矿斜坡道施工组织设计 (修改)宝山万科四季花城施T组织设计 (126P)对税信息培训中心装…

软件测试,月薪还没过万的进来看

目录 前言 一、技能提升 二、多语言掌握 三、团队协作 四、持续学习 五、提高测试效率 六、质量保障 七、职业发展 八、总结 前言 在当今IT行业中&#xff0c;软件测试是一个不可或缺的环节。随着互联网和移动应用的发展&#xff0c;对软件质量的要求也越来越高。因此…

前后端分离架构

前后端分离架构介绍 前后端分离已成为互联网项目开发的业界标准使用方式&#xff0c;将前端和后端的开发进行解耦。并且前后端分离会为以后的大型分布式架构、微服务架构、多端化服务&#xff08;各种客户端&#xff0c;比如浏览器、车载终端、安卓、IOS等&#xff09;打下坚实…

[Netty] FastThreadLocal (十四)

文章目录1.FastThreadLocal介绍2.FastThreadLocal分析3.FastThreadLocal结构分析4.FastThreadLocal方法分析4.1 FastThreadLocal.get()4.2 FastThreadLocal.set()1.FastThreadLocal介绍 FastThreadLocal是Netty中常用的一个工具类, FastThreadLocal所使用的InternalThreadLoca…

[架构之路-159]-《软考-系统分析师》-10-系统分析-6-现有业务流程分析, 系统分析最核心的任务

目录 第 10章 现有系统 分 析 1 0 . 6 现有业务流程分析 10.6.1 业务流程分析槪述 1 . 业务流程分析的步骤 2 . 业务流程分析的方法 10.6.2 业务-流程图TFD 1. T F D 的基本符号 2. TFD的绘制 10.6.3 业务 - 活动图 10.6.4 业务流程建模BPM 1. B P M 概述 2 . 标杆…

Pytest自动化测试框架一些常见的插件

Pytest拥有丰富的插件架构&#xff0c;超过800个以上的外部插件和活跃的社区&#xff0c;在PyPI项目中以“ pytest- *”为标识。 本篇将列举github标星超过两百的一些插件进行实战演示。 插件库地址&#xff1a;http://plugincompat.herokuapp.com/ 1、pytest-html&#xff1…

python机器学习决策树和SVM向量机算法实现红酒分类

1、红酒数据介绍 经典的红酒分类数据集是指UCI机器学习库中的Wine数据集。该数据集包含178个样本&#xff0c;每个样本有13个特征&#xff0c;可以用于分类任务。 具体每个字段的含义如下&#xff1a; alcohol&#xff1a;酒精含量百分比 malic_acid&#xff1a;苹果酸含量&a…

中科大ChatGPT学术镜像小白部署教程,全民都可以拥抱AI

docker…不会用…python不会用…服务器默认python版本3.6不会升级…代理也不会配置…各种命令不会用… 那么下面就是最简单办法&#xff0c;点点点即可【希望有帮助&#xff1f;】 文章目录一、体验镜像地址二、 基本配置2.1 config.py文件2.2 main.py文件三、下载项目四、项目…

FRP内网穿透配置

FRP内网穿透&#xff08;WIN&#xff09; 官方文档&#xff1a;点击进入 1.下载地址&#xff1a;点击进入 2.linux 压缩命令&#xff1a;tar -zxvf 包名&#xff0c;即可&#xff01; 3.linux配置服务端&#xff08;frps&#xff09; [common] bind_addr0.0.0.0 # frp监听的…

【NLP实战】基于Bert和双向LSTM的情感分类【下篇】

文章目录前言简介第一部分关于pytorch lightning保存模型的机制关于如何读取保存好的模型完善测试代码第二部分第一次训练出的模型的过拟合问题如何解决过拟合后记前言 本文涉及的代码全由博主自己完成&#xff0c;可以随意拿去做参考。如对代码有不懂的地方请联系博主。 博主…

TCP协议与UDP协议

1.TCP协议特点 1.1连接的建立与断开 TCP协议提供的是&#xff1a;面向连接、可靠的、字节流服务。使用TCP协议通信的双发必须先建立连接&#xff0c;然后才能开始数据的读写。双方都必须为该连接分配必要的内核资源&#xff0c;以管理连接的状态和连接上数据的传输。TCP连接是全…

从C语言到C++(第一章_C++入门_下篇)内联函数+auto关键字(C++11)+范围for +nullptr

目录 1. 内联函数 1.1 内联函数的概念 1.2 内联函数的特性 1.3 宏的优缺点和替代方法 2. auto关键字&#xff08;C11&#xff09; 2.1 改版前的auto 2.2 改版后的auto 2.3 auto 的使用场景 2.3.1处理很长的数据类型 2.3.2 auto 与指针结合起来使用&#xff1a; 2.4…

第2章 数据的类型

第2章 数据的类型 文章目录第2章 数据的类型2.2 为什么要进行区分2.3 结构化数据和非结构化数据案例&#xff1a;数据预处理字数/短语数特殊符号文本相对长度文本主题2.4 定量数据和定性数据2.4.1 案例&#xff1a;咖啡店数据2.4.2 案例&#xff1a;世界酒精消费量2.4.3 更深入…