Docker网络原理

docker中的桥接模式介绍

桥接模式:用于连接两个不同网络段的设备,使他们能够共享通信的一种方式

桥接设备:工作在OSI模型的第二层,数据链路层,转发数据帧(根据mac地址)。

类似于交换机,交换机只能转发同一网段,通过泛洪广播来找目标设备的mac地址。

docker的网络就是基于桥接模式实现的

1.虚拟网络桥:安装开启docker之后,docker进程就会自动创建一个虚拟网络桥(docker0),是一个虚拟网设备,类似于物理网络设备的交换机

2.分配唯一的IP地址,每次运行一个容器,docker进程都会分配一个唯一的且未被其他容器占用的IP地址给容器。

这个IP地址在桥接模式网络的子网当中

3.容器和主机通信:通过桥接模式,容器可以与主机直接通信,容器可以访问主机上的运行服务。主机也可以通过桥接网络docker:0来访问容器内部的进程(iptables的nat地址转换。在主机上做了地址转换)

问题:docker的网桥是宿主机虚拟出来的,并不是一个真正的网络设备,外部网络无法寻址找到。外部网络无法直接访问docker:0。

每创建完的docker都会生成一个虚拟网卡---docker0

举个例子,我们用nginx:1.22.0去创建

docker run -itd --name test1 -P nginx:1.22.0 /bin/bash
-P:在创建容器时,在宿主机和容器之间做一个端口映射。-P随机分配一个端口给宿主机,容器端口是不变的
-P 32768开始-P----随机指定
-p----指定端口,人为设置固定的端口映射进入容器开启一下服务。
实际上,docker是在宿主机和容器之间做了个iptables的NAT地址转换宿主的32768端口去映射容器的80端口

以上是随机分配口,桥接模式也可以自定义端口去创建

docker run -itd --name test2 -p 4300:80 nginx:1.22.0 /bin/bashdocker ps

接下来进入容器

docker exec -it test2 bashsevice restart nginxnginx//启动nginx
cd /usr/share/nginx/html/

docker的网络模式

网络模式配置说明
bridge//桥接模式-network bridge容器拥有独自的网络命名空间,且拥有独立的IP,端口,路由等,使用veth pair 连接docker0 网桥,并以docker0网桥为网关(docker默认模式)
host//主机模式-network host容器将不会虚拟出自己的网卡,也没有自己的IP地址。全部使用宿主机的IP地址和端口
container//容器模式-network container:容器的id或者名字容器和宿主之间公用一个IP和端口
none//无网络模式-network none 

docker容器有自己的network-space,但是这个容器没有任何网络设置。和host一样,没有网卡,同时也没有IP,没有路由,只有lo的回环网络。在none模式下,容器不可以联网。

工作中一般用于测试,测试定制好的容器的功能

自定义网络network create网段可以自定义

bridge--桥接模式

bridge模式是docker的默认网络模式,不用--net参数,就是bridge模式。

相当于Vmware中的 nat模式,容器使用独立.network Namespace,并连接到docker)虚拟网卡。通过dockerO网桥以及iptables

nat表配置与宿主机通信,此模式会为每一个容器分配hetwork Mamespace、设置等,并将一个主机上的 Docker容器连接到一个虚拟网桥上。

 (1)当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Dokcer容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

(2)从docker0子网中分配一个IP给容器使用,并设置dockerO的I地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来、因此,veth设备常用来连接两个网络设备。

(3) 使用docker run -p 时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。

docker run -itd --name test2 -p 4300:80 nginx:1.22.0 /bin/bashdocker ps


 

host---主机模式

相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离 文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、iptable规则等都与其他的Network Namespacel隔离。一个Docker容器一 般会分配一个独立的Network. Namespace。

但如果启动容器的时候使用host模式, 那么这个容器将不会获得一 个独立的Network Namespace,而是和宿主机共用一个Network Namespace。 容器将不会虚拟出自己的网卡、配置自己的IP等,而是使用宿主机的IP和端口。

容器和宿主机共享网络命名空间,但没有独立IP地址,使用宿主机的IP地址,和宿主机共享端口范围,例如宿主机使用了80端口,那么容器不能使用80端口。这种模式比较方便,但不安全。 

#创建容器web1,指定网络模式为 host#容器和宿主机共享网络命名空间,但没有独立IP地址。使用宿主机的IP,和宿主机共享端口范围。
docker run -itd --name test1 --network host nginx /bin/bash​#访问宿主机的ip和80端口,则可以访问到tt1的nginx服务curl http://20.0.0.20:80

container模式

这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。 新创建的容器不会创建自己的网卡,配置自己的Ie,而是和一个指定的容器共享re、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。

新创建的B容器和A容器共享命名空间。假如A容器使用了80端口,B容器就不能使用80端口。 
两个容器公用一个端口,但不能同时用

docker run -itd --name mysql1 --network=container mysql /bin/bashdocker psdocker exec -it mysql1 bash

none模式

使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个locker容器没有网卡、iP、路由等信息。这种网络模式下容器只有lo回环网络,没有其他网卡、这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。
 

自定义网络

默认是172.17.0.1

但我们可以自定义他的网段。

在使用默认docker:0网桥时,创建容器是不能指定IP地址的,只能由docker网桥自动分配。

除非用户自定义的网络才可以给容器自定义IP地址。

所以得先创建自定义网络,才能创建容器

docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork--opt "com.docker.network.bridge.name"="docker1"
可以不加,但是网卡名称比较难以识别mynetwork:自定义网络的名称//创建一个 docker1 的虚拟网卡

docker run -itd --name nginx1 --network mynetwork --ip 172.18.0.10 nginx:latest /bin/bashdocker exec -it nginx1 bash

总结

docker的网络模式:

1.bridge模式:桥接模式,也是docker的默认模式,创建时无需指定

2.host模式:容易不会有自己的网络设备,但是可以和宿主机共享IP和端口

3.container模式:容器和容器之间共享IP和端口

4.none模式:也没有自己的网络设备,也没有网卡,没有IP。只有一个回环地址--127.0.0.1,不能够联网。相当于飞行模式(一般用于测试容器的功能)

5.自定义网络:创建容器时,默认使用docker0网桥时是无法给容器定义IP地址的,只能自动分配。自定义网络在创建容器时,可以给容器指定IP

docker如何在创建容器时指定端口映射:

-P:随即指定

-p:自定义指定

32768:80

前面是宿主机,后面是容器端口

docker logs 容器名/容器ID

docker logs -f

dockers logs --tail=10 test1

dockers logs --tail=10 -f test1

--tail=10 从尾部开始,只看最近10条

-f 动态查看

/bin/bash就是为了让容器在后台有一个运行程序,保证容器不会退出

-d:表示后台守护运行,时间一长,容器可能会自动掉

/bin/bash就是容器的标准输出,docker logs捕获的是cmd 和 entrypoint的标准输出。/bin/bash和捕获日志会冲突

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

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

相关文章

兰州电力博物馆 | OLED透明展示台:创新展示,增强互动体验

产品:8片55寸OLED透明屏 应用场景:OLED透明屏利用其高透明度的特点,可以叠加在文物展示台上面,这种展示方式既让观众看到了文物原貌,又能了解其内部结构和细节特点,打破空间的束缚。 项目时间&#xff1a…

linux之buildroot(3)配置软件包

Linux之buildroot(3)配置软件包 Author:Onceday Date:2023年11月30日 漫漫长路,才刚刚开始… 全系列文章请查看专栏: buildroot编译框架_Once_day的博客-CSDN博客。 参考文档: Buildroot - Making Embedded Linux Easymdev.t…

Linux 系统渗透提权-Server2204-(解析)

B-3:Linux 系统渗透提权 任务环境说明: 服务器场景:Server2204(关闭链接) 用户名:hacker 密码:123456 1.使用渗透机对服务器信息收集,并将服务器中 SSH 服务端口号作为 flag 提 交; Flag:2283/tcp

LeetCode 1038. 从二叉搜索树到更大和树:(反)中序遍历

【LetMeFly】1038.从二叉搜索树到更大和树:(反)中序遍历 力扣题目链接:https://leetcode.cn/problems/binary-search-tree-to-greater-sum-tree/ 给定一个二叉搜索树 root (BST),请将它的每个节点的值替换成树中大于…

为什么出海企业需要呼叫中心?

随着现代商业世界的发展,企业面临着越来越多的挑战和机遇。为了提高客户服务水平、客户满意度、企业形象和销售业绩,呼叫中心已成为越来越多企业的首选。那么,为什么出海企业需要呼叫中心呢? 1. 提高客户服务质量 首先&#xff…

赛事回顾 | 首届“智航杯“全国无人机智能算法竞赛落幕

11月28日,首届“智航杯”全国无人机智能算法竞赛实物赛在海南省三亚市成功落下帷幕。此次竞赛自2023年4月启动以来,共有来自全国145所高等院校和50多所企事业单位的1253支团队、3655人报名参赛,最终有6支队伍脱颖而出,入围了实物赛…

虚拟网络技术:bond技术

网卡bond也称为网卡捆绑,就是将两个或者更多的物理网卡绑定成一个虚拟网卡。 bond的作用: 1.提高网卡的吞吐量 2.增加网络的高可用,实现负载均衡。 一、bond简介 bond技术即bonding,能将多块物理网卡绑定到一块虚拟网卡上&…

LeetCode刷题--- 计算布尔二叉树的值

个人主页:元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏:http://t.csdnimg.cn/ZxuNL http://t.csdnimg.cn/c9twt 前言:这个专栏主要讲述递归递归、搜索与回溯算法,所以下面题目主要也是这些算法做的 我讲述…

python + mongodb使用入门

最近用了下mongodb ,简单做个记录: 1.启动系统mongo服务 mongod -f mongod.conf其中 mongod.conf 是配置文件,示例如下: dbpath/youpath/data/db #数据库保存位置 logpath/youpath/data/mongod.log #日志 logappendtrue fo…

echarts 柱状图 定时自动轮播(非提示框轮播)

看了很多文档都是实现提示框轮播的,而我要实现的功能是:柱状图有多条数据时,轮播展示其中几条,比如我有100条数据,不能全部展示,设置轮播5条或者10条,依次显示数据,并形成闭环。 &a…

MySQl int(1)、int(20) 的区别到底在哪里

MySQl int(1)、int(20) 的区别到底在哪里 常思一二,便得自然… int(1)数据类型介绍 在MySQL中,INT(1) 是一种定义整数类型的数据字段,其中的数字表示显示宽度而不是存储范围。具体说,INT(1) 中的数字 1 表示显示宽度&#xff0…

Tap虚拟网卡

1 概述 Tap设备通常用于虚拟化场景下,其驱动代码位于drivers/net/tun.c,tap与tun复用大部分代码, 注:drivers/net/tap.c并不是tap设备的代码,而是macvtap和ipvtap; 下文中,我们统一称tap&#…