当前位置: 首页 > news >正文

Docker网络模式及通信

一、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 1000link/ether fa:da:9a:80:d4:5d brd ff:ff:ff:ff:ff:ffinet 192.168.115.1/24 scope global docker1valid_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:ffinet 192.168.200.1/24 brd 192.168.200.255 scope global docker0valid_lft forever preferred_lft foreverinet6 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 1000link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ffinet 192.168.115.1/24 scope global docker1valid_lft forever preferred_lft foreverinet6 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:ffinet 192.168.100.100/24 brd 192.168.100.255 scope global docker0valid_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---

相关文章:

Docker网络模式及通信

一、Docker默认的网络通信 1.1 Docker安装后默认的网络设置 Docker服务器安装完成之后&#xff0c;默认在每个宿主机会生成一个名称为docker0的网卡&#xff0c;其IP地址都是172.17.0.1/16 [rootubuntu1804 ~]#apt -y install bridge-utils [rootubuntu1804 ~]#brctl show 另…...

类模板实现实现Qt click/hover自定义操作

一、场景 常常会需要实现点击/hover时修改图片&#xff0c;可能是一个QPushButton、QLabel、QToolButton…… 由于Qt bug&#xff0c;QIcon/QSS只能实现常规态、按下态的图标切换&#xff0c;hover态的图片设置无效。 解决思路无非是安装事件过滤器、自定义类并重实现事件。 …...

Arco Design:引领未来的Vue 3创意先锋,一键开启高效与美感并重的Web开发之旅!

Arco Design 是一个基于 Vue 3 的 UI 框架&#xff0c;它提供了丰富的组件和样式&#xff0c;可以帮助开发者快速构建高质量的 Web 应用程序。以下是 Arco Design 的一些详细特点&#xff1a; 完整的设计系统&#xff1a;Arco Design 提供了一套完整的设计系统&#xff0c;包括…...

【MySQL】Linux下用C/C++链接MySQL数据库

文章目录 一、准备工作二、验证库和接口的使用三、链接数据库四、对数据库进行增删查改增删改查 五、结尾 一、准备工作 要使用C链接数据库, 首先要去MySQL官网下载官网提供的库, MySQL 社区下载. 如图所示: 接着选择: 按需选择版本: 如果用的是云服务器, 那么在安装mysql时…...

Python金融量化专栏简介

量化分析实战 - 专栏大纲 👉👉👉 《玩转Python金融量化专栏》👈👈👈 订阅本专栏的可以下载对应的代码和数据集 专栏目标 本专栏旨在帮助读者全面掌握使用Python进行金融技术指标的计算与应用,从基础到高级,涵盖各种技术指标的实现、策略开发与回测等内容。通过…...

出行365:依托分布式数据库,让出行无忧 | OceanBase案例

*本文首发自“新华社环球”杂志&#xff0c;作者张海鑫 每年的暑期旅游旺季&#xff0c;都会触发一轮轮的文旅消费的热潮&#xff0c;对于互联网出行服务行业而言&#xff0c;这既是一场盛大的狂欢&#xff0c;也是对其综合实力的严峻考验。 然而&#xff0c;自去年暑假起&…...

【C语言】位段详解

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html &#x1f381;代码托管:黄灿灿 (huang-cancan-xbc) - Gitee.com ⚙️操作环境:Visual Studio 2022 目录 一、什么是位段&#xff1f; 二、…...

LVS集群实验

NAT模式 本质是多目标IP的DNAT&#xff0c;通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发RIP和DIP应在同一个IP网络&#xff0c;且应使用私网地址:RS的网关要指向DIP请求报文和响应报文都必须经由Direclor转发&#xff0c;Direclor易于成为系统瓶…...

在 Spring Boot 中使用适配器模式实现支付网关的统一接口

引言 在许多电子商务系统中&#xff0c;集成多个支付网关是常见的需求。不同的支付网关有着不同的接口和实现细节。适配器模式可以帮助我们以一种灵活的方式实现这些不同的支付网关接口。 适配器模式简介 适配器模式将一个类的接口转换为客户期望的另一个接口。适配器模式使…...

【书生·浦语大模型实战营】第三期 入门岛作业

入门岛作业 Linux闯关任务&#xff1a;完成 SSH 连接与端口映射并运行 hello_world.py。配置vscode作业内容 可选任务1&#xff1a;将Linux基础命令在开发机上完成一遍作业内容 可选任务 2&#xff1a;使用 VSCODE 远程连接开发机并创建一个conda环境作业内容 可选任务 3&#…...

Redis的String类型常用命令总结

1. set 设置一个键的值。 set key value示例&#xff1a; set username "alice"2. get 获取一个键的值。 get key示例&#xff1a; get username3. getset 设置键的值&#xff0c;并返回键的旧值。 getset key value示例&#xff1a; getset username "…...

河南萌新联赛2024第(四)场:河南理工大学

A 思路&#xff1a; B 思路&#xff1a;有一种贪心的写法&#xff0c;将整个数组排序以后比较两个相邻数的同或值&#xff0c;取 m a x max max&#xff0c;不会证明 int th(int x, int y, int z) {int res 0;for (int i z - 1; i > 0; i --) {int dx (x >> i &…...

Linux中临时使用账号提权进行业务操作

普通账号提权 su&#xff1a;永久提权 Switching users with su sudo&#xff1a;临时提权 Running commands as root with sudo 1&#xff09;su切换账号 需要对方的密码 示例&#xff1a;切换到超级管理员 su - root 建议用-这个 su root 普通用户需要执行特殊指令&…...

lwip 3. 网线拔掉后 lwip_recvfrom不能返回

当网线被拔掉后&#xff0c;‌LWIP的lwip_recvfrom函数无法返回&#xff0c;‌这通常意味着网络连接已经断开&#xff0c;‌而LWIP没有自动检测到这种断开并进行相应的处理。具体卡在这个地方&#xff1a; ret xQueueReceive(mbox->mbx, &(*msg), portMAX_DELAY); //具…...

Linux环境安装Docker Engine

Docker是一个开源的应用容器引擎&#xff0c;由Go语言开发&#xff0c;基于Linux内核技术。Docker通过将应用及其依赖打包到可移植的容器中&#xff0c;实现了应用的快速部署和高效管理。Docker容器具有轻量级、快速启动、可移植性强等特点&#xff0c;能够显著提升资源利用率和…...

大厂面试题分享

大厂面试题分享 Redis持久化方式AOF优缺点RDB优缺点 如何保证Redis和Myql的一致性索引下推输入url到浏览器发生了什么ReentranLock底层原理SpringBoot 的启动流程 Redis持久化方式 Redis提供了两种主要的持久化机制&#xff0c;分别是AOF&#xff08;Append-Only File&#xf…...

FPGA面试问题整理

1. 逻辑设计中竞争与冒险概念&#xff0c;如何识别和消除&#xff1f; 竞争&#xff1a;在组合逻辑电路中&#xff0c;信号经过多条路径到达输出端&#xff0c;每条路径经过的逻辑门不同存在时差&#xff0c;在信号变化的瞬间存在先后顺序。这种现象叫竞争。 冒险&#xff1a;由…...

3Done学习笔记

一、基本操作 1、旋转视角 使用左下角立方体选择&#xff1b; 右键可以拖动视角&#xff1b; 中间滑轮按住拖动整个舞台界面。 2、平移和旋转 右键选择移动&#xff0c;有两种方式。 第一种选择起始点&#xff0c;按照起始点位置移动到终止点&#xff08;边、角、中心点…...

AI学习指南深度学习篇-卷积层详解

AI学习指南深度学习篇-卷积层详解 一、引言 随着人工智能技术的不断发展&#xff0c;深度学习作为人工智能领域的热门分支之一&#xff0c;正在逐渐成为各个领域的核心技术。而在深度学习中&#xff0c;卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN…...

2024年TI杯E题-三子棋游戏装置方案分享-jdk123团队-第二弹 手搓机械臂

第一弹赛题的选择与前期方案的准备 opencv调用摄像头bug的解决 机械臂的组装 采用三个舵机&#xff0c;组成一个三自由度的机械臂。 并且利用电磁吸盘的方式&#xff0c;完成对棋子的抓取工作&#xff0c;后面的事实证明&#xff0c;在预算不足的情况下&#xff0c;队友手搓…...

如何在Java、C、Ruby语言中使用Newscatcher API

Newscatcher 世界实时新闻聚合API 一款强大的数据服务工具&#xff0c;它通过先进的网络爬虫技术&#xff0c;实时从全球超过70,000个新闻源聚合新闻内容。这个API能够提供全面、多角度的新闻报道&#xff0c;包括但不限于标题、作者、发布日期、全文内容以及媒体资源链接。它使…...

集合: Collection的成员方法和相关实现类

Collection: - List(有序【指的是存储和取出的顺序是一致的】且可以发生重复&#xff0c;且有索引的概念) - ArrayList&#xff1a; 底层数据结构是数组&#xff0c;查询快&#xff0c;增删慢&#xff0c;线程不安全的&#xff0c;效率高。 - …...

过滤器与监听器:深入了解 Java Web 开发中的核心概念

在 Java Web 开发中&#xff0c;过滤器&#xff08;Filter&#xff09;和监听器&#xff08;Listener&#xff09;是两个重要的组件&#xff0c;它们帮助开发者在请求处理的各个阶段进行预处理和后处理。这篇博客将深入探讨这两个概念&#xff0c;并展示它们如何在实际应用中发…...

【Linux学习】动静态库从原理到制作

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f351;动静态库&#x1f41f;动静态库的制作与使用&#x1f680;生成静态库&#x1f512;生成动态库 &#x1f98c;动态库的查…...

WPF篇(10)-Label标签+TextBlock文字块+TextBox文本框+RichTextBox富文本框

Label标签 Label控件继承于ContentControl控件&#xff0c;它是一个文本标签&#xff0c;如果您想修改它的标签内容&#xff0c;请设置Content属性。我们曾提过ContentControl的Content属性是object类型&#xff0c;意味着Label的Content也是可以设置为任意的引用类型的。 案…...

JavaFX对话框控件-ChoiceDialog

JavaFX对话框控件-ChoiceDialog 常用属性titlecontentTextinitOwnergraphicheaderTextdefaultValuechoicesdialogPane 常用事件显示事件setOnShowing显示事件setOnShown弹框按钮点击 综合案例自定义下拉框内容 与Alert大部分功能类似按钮不可以自定义多一个下拉框 常用属性 …...

一文了解BTC中的二层协议中Nervos network,CKB,RGB++,UTXO stack 之间的关系

注&#xff1a;该内容不构成投资建议&#xff0c;有些内容摘抄其他地方&#xff0c;如侵权&#xff0c;请联系删除。 Nervos network Nervos Network 是一个开源的区块链生态项目&#xff0c;该项目提供一套解决方案来应对区块链扩展性和互操作性的问题。 Nervos Network 成立…...

Oracle(47)如何创建和使用集合?

在PL/SQL中&#xff0c;集合&#xff08;Collection&#xff09;是一种复合数据类型&#xff0c;用于存储一组相关的数据项。集合主要有三种类型&#xff1a;关联数组&#xff08;Associative Arrays&#xff09;、嵌套表&#xff08;Nested Tables&#xff09;和可变数组&…...

SpringIOC和SpringAOC

lombok插件 XML<!-- 加载资源文件 --><context:property-placeholder location"classpath:jdbc.properties"></context:property-placeholder><!-- 注入数据源 --><bean id"dataSource" class"com.mchange.v2.c3p0.ComboP…...

static关键字详解

文章目录 static使用示例static底层原理静态初始化顺序静态与线程安全 static static是Java中的一个关键字&#xff0c;用于定义类级别的成员&#xff0c;类级别的成员是指那些属于整个类&#xff0c;而不是特定对象实例的成员。在Java中&#xff0c;类级别的成员包括静态变量…...