Docker网络模式及通信

news2024/11/11 0:40:49

一、Docker默认的网络通信

1.1 Docker安装后默认的网络设置

Docker服务器安装完成之后,默认在每个宿主机会生成一个名称为docker0的网卡,其IP地址都是172.17.0.1/16

[root@ubuntu1804 ~]#apt -y install bridge-utils
[root@ubuntu1804 ~]#brctl show

另外会额外创建三个默认网络,用于不同的使用场景: 
root@docker-server1:~# docker network list
NETWORK ID NAME DRIVER SCOPE
438a9be14ef8 bridge bridge local #桥接网络,默认使用的模式,容器基于SNAT进行地址转换访问宿主机以外的环境
4c026356e4d1 host host local #host网络,直接使用宿主机的网络( 不创建net namespace),性能最好,但是容器端口不能冲突
8d70da095b8e none null local #空网络,容器不会分配有效的IP地址(只有一个回环网卡用于内部通信),用于离线数据处理等场景。

1.2 创建容器后的网络配置

 每次新建容器后:

        宿主机多了一个虚拟网卡,和容器的网卡组合成一个网卡,比如:11: vetha114b5a@if10,而在容器内的网卡名为:10: eth0@if11,可以看出和宿主机的网卡之间的关联。

        容器会自动获取一个172.17.0.0/16网段的随机地址,默认从172.17.0.2开始,第二次容器为172.17.0.3,以此类推。

        容器获取的地址并不固定,每次容器重启,可能会发生地址变化。

1.3 容器间的通信

默认情况下:同一个宿主机的不同容器可以相互通信

1.4 修改默认网络设置

新建容器默认使用docker0的网络配置,可以修改默认指向自定义的网桥网络

范例:用自定义的网桥代替默认的docker0

新建网桥:brctl addbr docker1

[root@Node2 ~]#:brctl addbr docker1
[root@Node2 ~]#:brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.0242ab0f8bd9	no		
docker1		8000.000000000000	no		
virbr0		8000.525400d20f75	yes		virbr0-nic

 仅仅是创建了一个网桥。然后给网桥设置一个IP地址:ip a a 192.168.115.1/24 dev docker1

[root@Node2 ~]#:ip a a 192.168.115.1/24 dev docker1
[root@Node2 ~]#:
[root@Node2 ~]#:ip a
......
12: docker1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether fa:da:9a:80:d4:5d brd ff:ff:ff:ff:ff:ff
    inet 192.168.115.1/24 scope global docker1
       valid_lft forever preferred_lft forever

这样就创建了一个网桥并设置了一个地址:192.168.115.1/24

我们启动容器,让容器使用docker1网桥:

需要修改service文件:vim /usr/lib/systemd/system/docker.service

[root@Node2 ~]#:vim /usr/lib/systemd/system/docker.service

修改了启动命令,在该行后添加-b docker1

重启后,运行一个容器,进入查看IP

 由于这里运行的系统容器,不要退出,否则容器关闭了,再开一个终端,查看:brctl show

如果运行的是一个nginx可以后台运行,直接查看网桥:

1.5 修改docker默认的网段

docker0是默认网桥,172.17.0.0/16是默认网段。我们可以指定docker0默认的网段。

这里还是修改docker的service文件。在启动后面添加-bip 192.168.200.1/24。指定IP。

vim /usr/lib/systemd/system/docker.service

在启动命令行加入:--bip 192.168.200.1/24

重新加载service文件,重启docker。

[root@Node2 ~]#:systemctl daemon-reload 
[root@Node2 ~]#:systemctl restart docker
[root@Node2 ~]#:ip a
......
5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:ab:0f:8b:d9 brd ff:ff:ff:ff:ff:ff
    inet 192.168.200.1/24 brd 192.168.200.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:abff:fe0f:8bd9/64 scope link 
       valid_lft forever preferred_lft forever
12: docker1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
    inet 192.168.115.1/24 scope global docker1
       valid_lft forever preferred_lft forever
    inet6 fe80::f8da:9aff:fe80:d45d/64 scope link 
       valid_lft forever preferred_lft forever

可以运行一个容器查看ip:

这样就是我们指定的docker0的网段了。 

二、容器名称互联

新建容器时,docker会自动分配容器名称,容器ID和IP地址,导致容器名称,容器ID和IP都不固定,那么如何区分不同的容器,实现和确定目标容器的通信呢?解决方案是给容器起个固定的名称,容器之间通过固定名称实现确定目标的通信。

有两种固定名称:

容器名称

容器名称的别名

2.1 容器名称介绍

        即在同一个宿主机上的容器之间可以通过自定义的容器名称相互访问,比如:一个业务前端静态页面的使用nginx,动态页面使用的是tomcat,另外还需要负载均衡调度器,如:haproxy对请求调度至nginx和tomcat的容器,由于容器在启动的时候其内部IP地址是DHCP随机分配的,而给容器起个固定的名称,则是相对比较固定的,因此比较适用于此场景。

2.2 容器名称实现

docker run 创建容器,可以用--link选项实现容器名称的引用。

--link list                     #Add link to another container
格式:  
docker run --name <容器名称> #先创建指定名称的容器
docker run --link <目标通信的容器ID或容器名称>     #再创建容器时引用上面容器的名称

先建立一个自定义名字的容器:

再开一个终端,在该终端建立第二个容器和第一容器名字连接:

 

需要注意的是如果c1 容器发生改变 将无法改变  

三、Docker网络连接模式

3.1 网络模式介绍

Docker的网路支持5种网络模式:

none:没有网络只有一块回环网卡

bridge:网桥模式,默认的模式,nat地址转换

host:容器和真机共享网络,直连

container:容器和容器共享网络,两个容器共用一块网卡

network-name:自定义模式

查看默认的网络模式:

 

3.2 网络模式指定

默认新建的容器使用Bridge模式,创建容器时,docker run 命令使用以下选项指定网络模式

格式:

docker run --network <mode>
docker run --net=<mode>
<mode>: 可是以下值
none
bridge
host
container:<容器名或容器ID>
<自定义网络名称>

3.3 Bridge网络模式

可以和外部网络之间进行通信,通过SNAT访问外网,使用DNAT可以让容器被外部主机访问,所以此模式也称为NAT模式,此模式宿主机需要启动ip_forward功能。

bridge网路模式的特点:

网络资源隔离:不同宿主机的容器无法直接通信,各自使用独立网络

无需手动配置:容器默认自动获取172.17.0.0/16的IP地址,此地址可以修改

可访问外网:利用宿主机的物理网卡,SNAT连接外网

外部主机无法直接访问容器:可以通过配置DNAT接受外网的访问

低性能较低:因为通过NAT,网络转换带来更多的损耗

端口管理繁琐:每个容器必须手动指定唯一的端口,容器产生端口冲突。

修改默认的bridge模式网络配置:

vim /etc/docker/daemon.json

[root@Node2 data]#:vim /etc/docker/daemon.json

重新加载配置文件;重启:

[root@Node2 ~]#:systemctl daemon-reload 
[root@Node2 ~]#:systemctl restart docker

查看docker0的地址:

[root@Node2 ~]#:ip a
......
5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:dc:b6:08:41 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.100/24 brd 192.168.100.255 scope global docker0
       valid_lft forever preferred_lft forever

3.4 Host模式

host模式就是直接使用宿主机的IP地址,创建的容器如果指定host模式启动的容器,那么新创建的容器不会创建自己的虚拟网卡,而是直接使用宿主机的网卡和IP地址,因此在容器里面查看到的IP信息就是宿主机的信息,访问容器的时候直接使用宿主机IP+端口号即可,不过容器中内除了网络以外的其他资源,如:文件系统、系统进程等仍然和宿主机保持隔离。

此模式由于直接使用宿主机的网络无需切换,网络性能最高,但是各容器内使用的端口不能相同,适用于运行容器端口比较固定的业务。

Host网络模式特点:

此模式的网络性能最高,但是各容器之间端口不能想同,适用于运行容器端口比较固定的业务。

使用参数--network host 指定

共享宿主机网络

网络性能无损耗

网络故障排除相对简单

各容器网络无隔离

网络资源无法分别统计

端口管理困难:容器产生端口冲突

不支持端口映射

例如:我们--network指定网络模式为host。那么就与宿主机共享网卡IP地址。 

两种方法都可以:--network host 与 --net=host

docker run -it --network host centos bash

docker run -it --net=host centos bash

 容器中查看ip a与宿主机中查看ip a是一样的,连主机名Node2都一样。

3.5 None模式

None模式就是无IP模式,在使用none模式后,Docker容器不会进行任何网络配置,没有网卡、没有IP也没有路由,因此默认无法与外界通信,需要手动添加网卡配置IP等,所以及少使用。

none模式特点:

使用参数:--network none 指定

默认无网络功能,无法和外部通信

指定模式:--net=none

这里只有一个本地地址。

3.6 Container模式

使用此模式创建的容器需指定和一个已经存在的容器共享一个网络,而不是和宿主机共享网络,新创建的容器不会创建自己的网卡也不会配置自己的IP,而是和一个被指定的已经存在的容器共享IP和端口范围,因此这个容器的端口不能和被指定的容器的端口冲突,除了网络之外的文件系统、进程信息等仍然保持相互隔离,两个容器的进程可以通过lo网卡进行通信。

Container模式特点:

使用参数--network container:名称或ID指定

与宿主机网络空间隔离

容器间共享网络空间

适合频繁的内容间的网络通信

直接使用对方的网络,较少使用。

3.7 建立容器时选择相应的网络模式

使用docker run 创建Docker容器时,可以用--net或--network选项指定容器的网络模式

1.host模式:使用--net=host指定。

2.none模式:使用--net=none指定

3.container模式:使用--net=container:[name or id]

4.bridge模式:使用--net=bridge指定,默认设置,可以省略。

Container模式即容器模式,使用参数--net=container:[目标容器名称/ID]指定,使用此模式创建的容器需指定和一个已经存在的容器共享一个网络namespace,而不会创建独立的namespace,即新创建的容器不会创建自己的网卡也不会配置自己的IP,而是和一个已经存在的被指定的目标容器共享对方的IP和端口范围,因此这个容器的端口不能和被指定的目标容器端口冲突,除了网络之外的文件系统、用户信息、进程信息等仍然保持相互隔离,两个容器的进程可以通过lo网卡及容器IP进行通信。

新建的容器,会有自己的网络命名空间。

查看网络命名空间:

查看操作 ip netns exec 命名空间id ip a

需要先做软链接:

[root@Node2 ~]#:mkdir /var/run/netns/
[root@Node2 ~]#:
[root@Node2 ~]#:ln -s /var/run/docker/netns/* /var/run/netns/

 查看操作:

删除容器后:

[root@Node2 ~]#:docker rm -f `docker ps -aq`
a52e268bee52
be21514503f5
32ac7ccb563b
[root@Node2 ~]#:
[root@Node2 ~]#:ls /var/run/docker/netns/
default

建立 container

[root@Node2 ~]#:docker run -it -d --name nc -p 80:80 nginx
0f6492fb549f43d3a57242fce985b046ab68c8b8f96c6f6a5a534f20f171c369
[root@Node2 ~]#:
[root@Node2 ~]#:docker run -it -d --name php-container --net=container:nc php
ace4841507790a8837ca1f08df426014d4d6adf6433f3e0011cc9d5444e2f458

查看命名空间只有一个

查看IP:

---end---

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

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

相关文章

2024年新SCI顶刊算法红嘴蓝鹊优化器RBMO优化Transformer模型的多变量时间序列预测

matlab R2024a以上 一、数据集 二、2024年新SCI顶刊算法红嘴蓝鹊优化器RBMO 红嘴蓝鹊优化算法(Red-billed blue magpie optimizer, RBMO)是一种新型的元启发式算法&#xff08;智能优化算法&#xff09;&#xff0c;灵感来源于红嘴蓝鹊的合作、高效的捕食行为。 该成果由Shen…

005集——运算符和循环——C#学习笔记

C# 提供了许多运算符。 其中许多都受到内置类型的支持&#xff0c;可用于对这些类型的值执行基本操作。 这些运算符包括以下组&#xff1a; 算术运算符&#xff0c;将对数值操作数执行算术运算比较运算符&#xff0c;将比较数值操作数布尔逻辑运算符&#xff0c;将对 bool 操作…

基于医院临床数据中心而建立的ADR药品智能监测上报系统,源码支持二次开发

ADR监测上报系统是基于医院临床数据中心而建立&#xff0c;运用信息技术实现药品不良反应的智能监测、报告管理、知识库查询、统计分析等功能。 系统自动提取不良反应报告数据&#xff0c;主动实时监测临床发生的不良反应&#xff0c;第一时间反馈到ADR监测组&#xff0c;及时…

邀请函 I 松下信息和望繁信科技邀您参加「数智时代下大数据应用的“道”与“术”」闭门会议

在数字化浪潮席卷全球的今天&#xff0c;大数据与智能化的结合成为企业成功的关键。为了深入探讨这一重要议题&#xff0c;松下信息系统&#xff08;上海&#xff09;有限公司&#xff08;简称“松下信息”&#xff09;与上海望繁信科技有限公司&#xff08;简称“望繁信科技”…

2024年最新AI算力厂商排名!

随着人工智能技术的飞速发展&#xff0c;AI算力已成为衡量一个国家或企业在AI领域竞争力的重要指标。2024年&#xff0c;全球AI算力领域再度迎来新的突破与变革&#xff0c;不仅体现在技术创新的深度和广度上&#xff0c;更在应用场景和市场价值上展现出巨大的潜力。 众厂商排名…

扩展01:企业级Nginx+Keepalived双主架构实战

NginxKeepalived主备架构总是会有一台服务器处于空闲状态&#xff0c;这样会造成资源的浪费&#xff0c;所以为了能够将两台服务器都利用起来&#xff0c;我们需要借助NginxKeepalived双主架构来实现。即是对外两个VIP地址&#xff0c;同时接收请求。 一&#xff1a;Nginxkeep…

生成订单幂等性(防止订单重复提交)

订单唯一性(防止重复下单)方案 重复下单产生原因&#xff1a; 客户端原因&#xff1a; 比如下单的按键在点按之后&#xff0c;在没有收到服务器请求之前&#xff0c;按键的状态没有设为已禁用状态&#xff0c;还可以被按。又或者&#xff0c;在触摸屏下&#xff0c;用户手指…

15秒完成作文自动批阅!璞公英与恩施三中正式签约试点,AI 大模型自动批阅+精准教学助力学校教育升级!

在国家大力推动教育数字化战略行动的浪潮中&#xff0c;通过科技创新赋能教育&#xff0c;促进教育公平与质量双提升的重要签约仪式&#xff0c;于恩施市第三高级中学隆重举行。一直以来&#xff0c;恩施市第三高级中学积极寻求创新与突破&#xff0c;引入璞公英的先进教育技术…

MyBatis动态SQL标签2

4.choose (when, otherwise)标签是使用举例 类似switch...case&#xff0c;从上到下匹配&#xff0c;找到匹配的条件&#xff0c;就结束匹配其他的&#xff01; 5.set标签是使用举例 set这个标签是用在更新操作上的 set标签代替sql中的set关键字&#xff0c;可以把set语句后多…

DC-8靶机渗透测试

DC-8靶机 文章目录 DC-8靶机信息收集web渗透获取权限权限提升靶机总结 信息收集 1.nmap扫描出主机IP为192.168.78.156 开放80和22端口&#xff0c;没扫出来什么漏洞&#xff0c;但是发现robots.txt文件&#xff0c;给出了后台登录地址/usr/login web渗透 1.登陆到主页发现是…

Java有哪些数据类型?

Java有哪些数据类型 1. 基本数据类型 2. 引用数据类型 3. 总结 &#x1f388;边走、边悟&#x1f388;迟早会好 Java 中的数据类型分为两大类&#xff1a;基本数据类型&#xff08;primitive types&#xff09;和引用数据类型&#xff08;reference types&#xff09;。 …

代发考生战报:8月6号 西安 ,HCIE存储H13-629考试通过

代发考生战报&#xff1a;8月6号 西安 &#xff0c;HCIE存储H13-629考试通过&#xff0c;目前这个考试变题了&#xff0c;我找客服买的包过服务&#xff0c;有老师指导&#xff0c;考试通过了&#xff0c;里面的新题我看了&#xff0c;我是一点也不会&#xff0c;自己考的还是不…

Java代码混淆加密之Xjar

使用背景 代码安全性需求&#xff1a;在交付给客户或第三方时&#xff0c;保护源代码不被泄露或反编译是许多企业的核心需求。尤其是在竞争激烈的市场中&#xff0c;代码泄露可能导致严重的经济损失。 传统工具的局限性&#xff1a;虽然有很多混淆和加密工具&#xff0c;比如 …

【学习笔记】用线段树维护区间计数问题

前言 简单的区间计数问题可能直接推式子就行了。 但有些问题必须要数据结构维护。线段树就是一个比较好的处理区间的数据结构。 Gym102222L 思路 满足条件的区间特征&#xff1a; max ⁡ { a i } − min ⁡ { a i } 1 − c n t 0 \max\{a_i\}-\min\{a_i\}1-cnt0 max{ai​}…

uniapp离线打包热更新失败-AndroidStudio离线打包apk后无法下载打开-热更新失败-plus.runtime.install失败

效果图 仅安卓 前言 1.plus.runtime.install一直fail(20240808), uni.openDocument可以打开本地apk文件 2.权限问题需小心 跑通前提 1.先确定apk地址有效&#xff0c;浏览器中手动下载可安装 2.确保已添加离线打包AndroidStudio的“android.permission.INSTALL_PACKAGES”权…

初识自然语言处理NLP

文章目录 1、简介2、自然语言处理的发展简史3、语言学理论句法学&#xff08;Syntax&#xff09;语义学&#xff08;Semantics&#xff09;语用学&#xff08;Pragmatics&#xff09;形态学&#xff08;Morphology&#xff09; 4、统计与机器学习方法n-gram 模型隐马尔可夫模型…

JNPF快速开发平台赋能数字办公方式转变

随着信息技术的飞速发展&#xff0c;数字化转型已成为各行各业提升效率、优化流程的重要手段。JNPF快速开发平台正是在这样的背景下应运而生&#xff0c;它通过简化开发流程&#xff0c;使得非技术人员也能参与到应用的构建中来&#xff0c;从而加速了数字办公方式的转变。 数字…

解决r2dbc连mysql时timestamp字段的时区问题

现象&#xff1a; 在两个mysql库用相同SQL都建了某表&#xff0c;都有created_at字段&#xff1a; created_at timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, 。但是在往此表insert记录时&#xff0c;B库的created_at字段比当前时间慢了8个小时&#xff0c;而A…

MySQL学习(19):锁

1.什么是锁 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中&#xff0c;数据是供许多用户共享的资源&#xff0c;数据库必须保证数据并发访问的一致性、有效性&#xff0c;这就要靠锁来协调实现。 MySOL中的锁&#xff0c;分为以下三类&#xff1a; &am…

深度学习基础 - 向量投影

深度学习基础 - 向量投影 flyfish 给定两个向量 a \mathbf{a} a 和 b \mathbf{b} b&#xff0c;我们想要计算 a \mathbf{a} a 在 b \mathbf{b} b 上的投影。 点乘 (Dot Product) 点乘是一个标量&#xff0c;表示两个向量在相同方向上的程度。公式为&#xff1a; a ⋅ b …