(十一) Docker network

news2024/10/5 23:30:33

Docker network

  • 一、概述
    • 1.1、简介
    • 1.2、常用基本命令
    • 1.2、作用
  • 二、网络模式
    • 2.1、四种模式介绍
    • 2.2、容器实例内默认网络IP生产规则
  • 三、模式说明
    • 1、bridge
    • 2、host
    • 3、none
    • 4、container
    • 5、自定义网络
      • 1、概念
      • 2、没有自定义网络时
      • 3、自定义网络
      • 4、Link
      • 5、自定义bridge网络与默认bridge网络之间的区别

前言

Linux的命令 ip addr

[root@Feng ~]# ip addr
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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:16:3e:06:78:3a brd ff:ff:ff:ff:ff:ff
    inet 172.21.129.9/20 brd 172.21.143.255 scope global dynamic eth0
       valid_lft 279126205sec preferred_lft 279126205sec
    inet6 fe80::216:3eff:fe06:783a/64 scope link 
       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:e3:f9:98:81 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:e3ff:fef9:9881/64 scope link 
       valid_lft forever preferred_lft forever
8: br-ac0fd4ae03e7: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:13:fa:43:42 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 scope global br-ac0fd4ae03e7
       valid_lft forever preferred_lft forever

这个命令显示了这台机器上所有的网卡信息。网卡都会有一个 IP 地址(也会不存在)

lo

网卡参数<>:
	LOOPBACK, 回环,指将电子信号、数据流等原样送回发送者的行为,它主要用于对通信功能的测试 。
	UP,表示网卡处于启动的状态。
	LOWER_UP物理连接正常,就是网卡已经上电(物理指的是物理层)。
mtu 65536: 最大传输单元MTU为65536,这是以太网的默认值。
qdist noqueue: 排队规则为noqueue。内核如果需要通过某个网络接口发送数据包,它都需要按照为这个接口配置的排队规则把数据包加入队列,noqueue表示无队列。
state UNKNOWN: 网络接口状态未知。
group default: 接口组为默认的。
qlen 1: 传输队列长度为1。
link/loopback: 接口的 MAC(硬件)地址是`00:00:00:00:00:00`。
brd: 广播地址`00:00:00:00:00:00`。
inet: 是IPV4的地址,scop host lo:本主机环回有效。
valid_lft forever: IPv4 地址的有效使用期限为无限
preferred_lft forever: IPv4 地址的首选生存期为无限
inet6: IPV6的地址,scop host本机有效。

eth0

宿主机网卡
BROADCAST: 表示这个网卡有广播地址,可以发送广播包
MULTICAST: 表示网卡可以发送多播包。
qdist  pfifo_fast: pfifo_fast规则的队列包括三个波段(band)。在每个波段里面,使用先进先出规则。  
state UP: 网络接口已启用。
link/ether fa:16:3e:c7:79:75 brd ff:ff:ff:ff:ff:ff  MAC地址,是一个网卡的物理地址。
scope global: 全局有效。
scop link: 仅在此设备上有效。

一、概述

1.1、简介

在Docker启动后,服务器网络会多一个 docker0 的虚拟网桥(就是通过这个来进行与主机或者其他容器进行网络通信的连接,理解为交换机,类似于将一台主机通过网线接入到物理交换机。当接收到数据时,Bridge 就会根据数据帧中的 MAC 地址进行广播、转发或过滤处理 )

在这里插入图片描述
lo代表127.0.0.1,即localhost,inet addr用来表示网卡的IP地址

在这里插入图片描述

1.2、常用基本命令

在这里插入图片描述

查看docker网络模式命令

默认创建3大网络模式

docker network ls

在这里插入图片描述

创建网络

docker network create XXX网络名字

查看网络的详细信息

docker network inspect  XXX网络名字

删除无法使用的网络

docker network prune

删除网络

docker network rm XXX网络名字

在这里插入图片描述

1.2、作用

因为在之前都是在单机的Docker上的,实际工作中肯定会有很多个Docker实例。还可能在不同的服务器上,肯定需要对Docker之间的通信进行管理。所以需要Docker网络的设置

  • 容器间的互联和通信以及端口映射
  • 容器IP变动时候可以通过服务名直接网络通信而不受到影响(因为容器的IP可能会变动,比如重启重新分配IP,然后通过服务名就不会发生变动)

二、网络模式

2.1、四种模式介绍

在这里插入图片描述

  • bridge模式:使用 --network bridge 指定,默认使用 docker0
  • host模式:使用 --network host 指定
  • none模式:使用 --network none 指定
  • container模式:使用–network container:NAME或者容器ID指定

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

  1. 先启动两个ubuntu容器实例

    在这里插入图片描述

  2. 查看这两个实例的详细情况
    使用 docker inspect 命令查看实例信息,最后的有网络情况
    U1的是172.17.0.2
    在这里插入图片描述
    U2的是172.17.0.3
    在这里插入图片描述

  3. 关闭u2实例,新建u3,查看ip变化

    发现这个172.17.0.3分配给U3了

    在这里插入图片描述

结论:显然容器的内部的ip是有可能会发生改变的,这是很危险的,因为服务IP的变化很有可能在原有IP的请求会失效,这是不可取的

三、模式说明

1、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……代表网卡一,网卡二,网卡三……
  3. 网桥docker0创建一对对等虚拟设备接口一个叫veth,另一个叫eth0,成对匹配。
    • 整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair);
    • 每个容器实例内部也有一块网卡,每个接口叫eth0;
    • docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。

通过上述,将宿主机上的所有容器都连接到这个内部网络上,两个容器在同一个网络下,会从这个网关下各自拿到分配的ip,此时两个容器的网络是互通的。

docker0和宿主机的eth0是桥接的关系,而上面的容器实例与docker0是相当于同一网关的不同路由,也就是同一网段,理解docker0是交换机就行,做虚拟网桥的作用,将不同实例在同一网关下可以相互通信

实践说明

在上述的理论中,因为docker0做交换机桥接的作用,而每一个实例的eth0都会有一个veth一一匹配,也就是按照这种理论,每一个实例运行后其网卡都可以在宿主机进行一一匹配

运行两个实例

docker run -d -p 8081:8080   --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080   --name tomcat82 billygoo/tomcat8-jdk8

在这里插入图片描述
将宿主机的网卡情况与实例的进行对比展示,发现对应上了

在这里插入图片描述

bridge在不暴露端口的情况下,那么就是使用路由方式,在通过docker0网桥。使得宿主机和docker容器网络中的容器进行通信
bridge模式在暴露端口的情况下,那么就是使用路由+nat(网络地址转换) 的方式,在通过docker0网桥,使得宿主机的端口和docker容器网络中的容器暴露的端口进行映射。

2、host

概述

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

容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口

在这里插入图片描述

运行测试

docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8

会有警告

在这里插入图片描述

上述警告原因

docker启动时指定--network=host或-net=host,如果还指定了-p映射端口,那这个时候就会有此警告,

并且通过-p设置的参数将不会起到任何作用,端口号会以主机端口号为主,重复时则递增。也就是他会直接使用宿主机的端口,设置端口映射会失效,也就是直接使用默认启动端口,假设多个,他就会让端口递增,比如第一个tomcat是8080,第二个就是8081,所以在使用host模式的时候不需要指定端口映射

在这里插入图片描述

查看实例信息,发现没有网关以及IP,因为使用的是宿主机的、

在这里插入图片描述

宿主机的网卡信息与实例内部的是一样的

宿主机

在这里插入图片描述
实例

在这里插入图片描述

3、none

概述

在none模式下,并不为Docker容器进行任何网络配置。
也就是说,这个Docker容器没有网卡、IP、路由等信息,只有一个lo(回环地址也急就是127.0.0.1)
需要我们自己为Docker容器添加网卡、配置IP等。

禁用网络功能

实践测试

docker run -d -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8

实例内部

在这里插入图片描述

外部查看实例信息

在这里插入图片描述

4、container

概述

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

在这里插入图片描述

Tomcat 镜像测试会报错i,因为两个实例公用同一个ip以及端口,会造成端口冲突

docker run -d -p 8085:8080                                     --name tomcat85 billygoo/tomcat8-jdk8

docker run -d -p 8086:8080 --network container:tomcat85 --name tomcat86 billygoo/tomcat8-jdk8

错误结果

在这里插入图片描述

使用 Alpine 进镜像测试

Alpine操作系统是一个面向安全的轻型 Linux发行版,这个就不会有端口的冲突

docker run -it                                                    --name alpine1  alpine /bin/sh

docker run -it --network container:alpine1 --name alpine2  alpine /bin/sh

在这里插入图片描述

进入容器查看网卡信息

两者网络配置是一样的

在这里插入图片描述

假设先存在的容器挂了,那剩下的这个 alpine2 会怎样

在这里插入图片描述

发现alpine2的原有共享网卡没有了

在这里插入图片描述

假设停掉 apline2 会怎么样

在这里插入图片描述
停掉共享的是不会影响原有被共享的

在这里插入图片描述

5、自定义网络

1、概念

其实就是自定义的bridge网络

2、没有自定义网络时

启动两个实例

docker run -d -p 8081:8080   --name tomcat81 billygoo/tomcat8-jdk8

docker run -d -p 8082:8080   --name tomcat82 billygoo/tomcat8-jdk8

在这里插入图片描述
上述成功启动并用docker exec进入各自容器实例内部

按照IP地址ping是可以的
在这里插入图片描述

按照服务名ping结果

是失败的

在这里插入图片描述

因为容器实例的ip是会变化的,所以根据IP来进行通信显然是不可取的,所以就需要用自定义网络实现通过容器名通信

3、自定义网络

自定义桥接网络,自定义网络默认使用的是桥接网络bridge

新建自定义网络

docker network create tomcat_network

查看网络列表

docker network ls

在这里插入图片描述

新建容器加入上一步新建的自定义网络

# 删除原有的 81,82 再重新启动
#命令实现停用还有删除容器
docker stop $(docker ps -q)

docker rm $(docker ps -aq)

docker run -d  --network tomcat_network --name tomcat81 billygoo/tomcat8-jdk8


docker run -d --network tomcat_network --name tomcat82 billygoo/tomcat8-jdk8

此时进入tomcat81中,使用ping命令测试连接tomcat82容器名,发现可以正常连通

在这里插入图片描述

4、Link

原来用的是 docker link ,但是这个过时了,所以不多探究,示例如下

# 启动一台mysql容器
# --name 为容器指定一个别名
docker run --name mysql-matomo -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.28

# 启动另一个容器,通过--link连接到mysql容器
# --link 容器名称:本容器连接对方时的别名
docker run -d -p 8888:80 --link mysql-matomo:db --name matomo matomo:4.9.0

# 此时,在matomo容器中,便可以通过 db 这个hostname连接到mysql-matomo容器,而无须再通过ip
# 连接地址:db:3306

5、自定义bridge网络与默认bridge网络之间的区别

默认bridge网络自定义bridge网络
连通性相互之间需要通过-p或者–publish选项指明开放的端口,即使是两个容器连接在相同的默认bridge网络之上不需要-p与–publish选项,相互之间的端口全部开放
域名解析默认网桥上的容器只能通过IP地址相互访问,使用名称通信时需要指定–link选项,这种方式已过时并且不容易调试无需特别指定选项,可直接通过名称与别名通信
热插拔需要停止容器的执行并重新创建容器才能离开或者加入默认bridge网络,因为容器的改变会影响其他容器实例支持随时加入与离开某个用户自定义bridge网络,它是不影响的
灵活性系统中只能存在一个默认网络,牵一发而动全身可定义多个用户自定义网络,每个可单独配置
共享环境变量不支持通过–link选项的方式共享环境变量,更高级的共享环境变量的方式:data volume、docker-compose、docker-configs。支持通过–link选项的方式共享环境变量
  • 用户定义的桥接器可在容器化应用程序之间提供更好的隔离和互操作性。
  • 用户定义的桥接器在容器之间提供自动DNS解析。
  • 容器可以在运行中与用户定义的网络连接和分离。
  • 每个用户定义的网络都会创建一个可配置的网桥。
  • 默认桥接网络上的链接容器共享环境变量。

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

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

相关文章

寒假每日一题W2D1——选数异或

题目描述 给定一个长度为 n 的数列 A1,A2,⋅⋅⋅,An 和一个非负整数 x&#xff0c;给定 m 次查询&#xff0c;每次询问能否从某个区间 [l,r] 中选择两个数使得他们的异或等于 x。 输入输出格式及数据范围 输入输出样例 思路 ①对于两个数的异或值为x&#xff0c;可以化简为&…

RHCE第二天之chrony服务部署详解

文章目录一、chrony服务器介绍二、安装与配置三、chrony服务部署四、chronyc 的常见命令五、chronyc sources 输出结果解析一、chrony服务器介绍 ①Chrony是一个开源自由的网络时间协议 NTP 的客户端和服务器软软件。它能让计算机保持系统时钟与时钟服务器&#xff08;NTP&…

谈谈如何在简历筛选中尽可能 “存活下来“, 如何在面试过程中 “游刃有余“

本文只是个人学习总结出来的技巧, 仅供参考 如果有不认同的地方, 也不必太较真, 因人而异 目录 1. 为什么要做简历 1.2 好简历与差简历的区别 2. 如何做一份好的简历 2.1 知己知彼 2.2 构思内容 2.3 模板的选择 2.4 填充内容 2.5 不断的更新迭代 2.6 其他注意事项 3…

Wondershare Recovery - 万兴数据恢复专家,恢复你 Mac 上的重要文件

Wondershare Recovery - 万兴数据恢复专家&#xff0c;恢复你 Mac 上的重要文件 Wondershare Recoverit 是恢复被删除文件最有效的软件之一。计算机用户面临的一个主要问题是失去机密信息。我们可能是误删除了数据和文件&#xff0c;或者可能是由于病毒袭击、操作系统故障或硬盘…

LaoCat带你认识容器与镜像(二【二章】)

系列二章二小节&#xff0c;发现概念性的知识看得人并不多&#xff0c;csdn的一篇解决问题的博文&#xff0c;却涨粉近400&#xff0c;有点意思~ 本章内容 操作Docker容器 本文实操全部基于Ubuntu 20.04 同样&#xff0c;容器也是Docker重要的核心成员之一&#xff0c;Docker容…

如何与沃尔格林Walgreens建立EDI连接?

沃尔格林Walgreens从1901年芝加哥一个家庭作坊式的小店开始&#xff0c;经历了百年沧桑&#xff0c;如今已经拥有4000多家连锁药店&#xff0c;在自己100多年的发展历史中年年赢利&#xff0c;创造了连续100多年的赢利神话。 与沃尔格林Walgreens建立合作&#xff0c;一个重要环…

C++:函数指针进阶(三):Lambda函数详解(二)

一&#xff1a;Lambda表达式概述 Lambda表达式是现代C在C11和更高版本中的一个新语法糖&#xff0c;在C11&#xff0c;C14&#xff0c;C17和C20中Lambda表达的内容还在不断更新。Lambda表达式&#xff08;也称为lambda函数&#xff09;是在调用或作为函数参数传递的位置处定义…

记自己开发的淘宝客优惠券

目录 1.首页 1.1详情 1.2口令 1.3分类 1.4搜索 1.5个人中心 2.API开发教程 2.1什么是淘宝客 组成模式 2.2API申请 2.3SDK下载 2.3后台管理 闲暇时间浏览网站时&#xff0c;看到有关淘宝优惠券推广的文章&#xff0c;就想着能不能自己也做一个微信小程序。 但是&…

论文投稿指南——中文核心期刊推荐(化学 2)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

Java里一个线程调用了Thread.interrupt()到底意味着什么?

interrupted()是Java提供的一种中断机制&#xff0c;要把中断搞清楚&#xff0c;还是得先系统性了解下什么是中断机制。 什么是中断&#xff1f; 在Java中没有办法立即停止一条线程&#xff0c;然而停止线程却显得尤为重要&#xff0c;如取消一个耗时操作。因此&#xff0c;Ja…

zig语言代替C语言进行裸机开发的尝试-2023年笔记

接触rust的时候&#xff0c;无意中认识了zig&#xff0c;目前版本是zig 0.10.0&#xff0c;还没有正式的1.0版本。 初步使用的感受&#xff1a; 1). 用zig写出的代码更防崩&#xff0c;不会像C那样出现很多内存非法访问的情况 (比如这些情形&#xff1a;栈保护、整数溢出、…

pyqt5中QGraphicsView弹出菜单

QPainter与Graphics View 架构的区别PyQt5 提供了两种绘图方法。一种是使用 QPainter 类在 QWidget 类提供的画布上画图&#xff0c;可以 绘制点、线、圆等各种基本形状&#xff0c;从而组成自己需要的图形。所有界面组件都是 QWidget 的子类&#xff0c; 界面上的按钮、编辑框…

74、【哈希表】leetcode——18. 四数之和(C++版本)

题目描述 原题链接&#xff1a;18. 四数之和 解题思路 思路与三数之和&#xff1a;15. 三数之和&#xff0c;区别之处在于&#xff1a; 1、多一层for循环&#xff0c;用于多加一个数。 四数之和就是在三数之和多加一个数&#xff0c;用前两个数相加&#xff0c;后面两个数继…

Hadoop之MapReduce

一、概述 MapReduce 核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的 分布式运算程序&#xff0c;并发运行在一个 Hadoop 集群上。 1、优缺点&#xff1a;优点&#xff1a;1&#xff09;MapReduce 易于编程 它简单的实现一些接口&#xff0c;就可以完成一个…

(day2)自学java综合练习

目录 1.卖飞机票 2.找质数 3.开发验证码 4.数组元素的复制 5.评委打分 6.数字加密 7.数字解密 8.抢红包 9.模拟双色球 10.二维数组 1.卖飞机票 机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。按照如下规则计算机票价格&#xff1…

推荐两个好用的虚拟机、SSH 终端开源工具(Virtual Box、WindTerm)

笔者最近因一些变故&#xff0c;加上阳了&#xff0c;停更了一段时间&#xff0c;并提前回老家过年了。因并没有带笔记本电脑回去&#xff0c;故在折腾了一番老家电脑后&#xff0c;选择拥抱开源&#xff0c;使用一些开源的工具&#xff0c;而非习惯的 VMware Workstation 和 S…

Python3,区区10行代码,批量把图片插入Excel指定单元格中,省下时间去烫头发。

这里写目录标题1、引言2、代码实战2.1 代码示例2.2 遇到问题及处理方案2.2.1 遇到问题2.2.2 解决方案3、总结1、引言 小屌丝&#xff1a;鱼哥&#xff0c; 想请教你个问题。 小鱼&#xff1a;啥问题呢&#xff1f; 小屌丝&#xff1a;我想把图片插入到excel里面 小鱼&#xff…

AVS3变换之ISP和ISTS

ISP&#xff08;Implicit Selected Transform&#xff09;是AVS3中新增的针对intra块的变换工具&#xff0c;IST对intra块提供了两种可分离的变换核&#xff0c;编码器根据RDO选择最优的变换核&#xff0c;但是对于选中的变换核不在码流中传输其索引&#xff0c;而是将其索引隐…

今天给大家介绍一篇医院医疗管理系统的设计与实现(源码+论文)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

Java开发学习(三十七)----SpringBoot多环境配置及配置文件分类

一、多环境配置 在工作中&#xff0c;对于开发环境、测试环境、生产环境的配置肯定都不相同&#xff0c;比如我们开发阶段会在自己的电脑上安装 mysql &#xff0c;连接自己电脑上的 mysql 即可&#xff0c;但是项目开发完毕后要上线就需要该配置&#xff0c;将环境的配置改为…