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服务器安装完成之后,默认在每个宿主机会生成一个名称为docker0的网卡,其IP地址都是172.17.0.1/16 [rootubuntu1804 ~]#apt -y install bridge-utils [rootubuntu1804 ~]#brctl show 另…...
类模板实现实现Qt click/hover自定义操作
一、场景 常常会需要实现点击/hover时修改图片,可能是一个QPushButton、QLabel、QToolButton…… 由于Qt bug,QIcon/QSS只能实现常规态、按下态的图标切换,hover态的图片设置无效。 解决思路无非是安装事件过滤器、自定义类并重实现事件。 …...
Arco Design:引领未来的Vue 3创意先锋,一键开启高效与美感并重的Web开发之旅!
Arco Design 是一个基于 Vue 3 的 UI 框架,它提供了丰富的组件和样式,可以帮助开发者快速构建高质量的 Web 应用程序。以下是 Arco Design 的一些详细特点: 完整的设计系统:Arco Design 提供了一套完整的设计系统,包括…...

【MySQL】Linux下用C/C++链接MySQL数据库
文章目录 一、准备工作二、验证库和接口的使用三、链接数据库四、对数据库进行增删查改增删改查 五、结尾 一、准备工作 要使用C链接数据库, 首先要去MySQL官网下载官网提供的库, MySQL 社区下载. 如图所示: 接着选择: 按需选择版本: 如果用的是云服务器, 那么在安装mysql时…...
Python金融量化专栏简介
量化分析实战 - 专栏大纲 👉👉👉 《玩转Python金融量化专栏》👈👈👈 订阅本专栏的可以下载对应的代码和数据集 专栏目标 本专栏旨在帮助读者全面掌握使用Python进行金融技术指标的计算与应用,从基础到高级,涵盖各种技术指标的实现、策略开发与回测等内容。通过…...

出行365:依托分布式数据库,让出行无忧 | OceanBase案例
*本文首发自“新华社环球”杂志,作者张海鑫 每年的暑期旅游旺季,都会触发一轮轮的文旅消费的热潮,对于互联网出行服务行业而言,这既是一场盛大的狂欢,也是对其综合实力的严峻考验。 然而,自去年暑假起&…...

【C语言】位段详解
🦄个人主页:小米里的大麦-CSDN博客 🎏所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html 🎁代码托管:黄灿灿 (huang-cancan-xbc) - Gitee.com ⚙️操作环境:Visual Studio 2022 目录 一、什么是位段? 二、…...

LVS集群实验
NAT模式 本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发RIP和DIP应在同一个IP网络,且应使用私网地址:RS的网关要指向DIP请求报文和响应报文都必须经由Direclor转发,Direclor易于成为系统瓶…...
在 Spring Boot 中使用适配器模式实现支付网关的统一接口
引言 在许多电子商务系统中,集成多个支付网关是常见的需求。不同的支付网关有着不同的接口和实现细节。适配器模式可以帮助我们以一种灵活的方式实现这些不同的支付网关接口。 适配器模式简介 适配器模式将一个类的接口转换为客户期望的另一个接口。适配器模式使…...

【书生·浦语大模型实战营】第三期 入门岛作业
入门岛作业 Linux闯关任务:完成 SSH 连接与端口映射并运行 hello_world.py。配置vscode作业内容 可选任务1:将Linux基础命令在开发机上完成一遍作业内容 可选任务 2:使用 VSCODE 远程连接开发机并创建一个conda环境作业内容 可选任务 3&#…...
Redis的String类型常用命令总结
1. set 设置一个键的值。 set key value示例: set username "alice"2. get 获取一个键的值。 get key示例: get username3. getset 设置键的值,并返回键的旧值。 getset key value示例: getset username "…...
河南萌新联赛2024第(四)场:河南理工大学
A 思路: B 思路:有一种贪心的写法,将整个数组排序以后比较两个相邻数的同或值,取 m a x max max,不会证明 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:永久提权 Switching users with su sudo:临时提权 Running commands as root with sudo 1)su切换账号 需要对方的密码 示例:切换到超级管理员 su - root 建议用-这个 su root 普通用户需要执行特殊指令&…...
lwip 3. 网线拔掉后 lwip_recvfrom不能返回
当网线被拔掉后,LWIP的lwip_recvfrom函数无法返回,这通常意味着网络连接已经断开,而LWIP没有自动检测到这种断开并进行相应的处理。具体卡在这个地方: ret xQueueReceive(mbox->mbx, &(*msg), portMAX_DELAY); //具…...

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

大厂面试题分享
大厂面试题分享 Redis持久化方式AOF优缺点RDB优缺点 如何保证Redis和Myql的一致性索引下推输入url到浏览器发生了什么ReentranLock底层原理SpringBoot 的启动流程 Redis持久化方式 Redis提供了两种主要的持久化机制,分别是AOF(Append-Only File…...
FPGA面试问题整理
1. 逻辑设计中竞争与冒险概念,如何识别和消除? 竞争:在组合逻辑电路中,信号经过多条路径到达输出端,每条路径经过的逻辑门不同存在时差,在信号变化的瞬间存在先后顺序。这种现象叫竞争。 冒险:由…...

3Done学习笔记
一、基本操作 1、旋转视角 使用左下角立方体选择; 右键可以拖动视角; 中间滑轮按住拖动整个舞台界面。 2、平移和旋转 右键选择移动,有两种方式。 第一种选择起始点,按照起始点位置移动到终止点(边、角、中心点…...
AI学习指南深度学习篇-卷积层详解
AI学习指南深度学习篇-卷积层详解 一、引言 随着人工智能技术的不断发展,深度学习作为人工智能领域的热门分支之一,正在逐渐成为各个领域的核心技术。而在深度学习中,卷积神经网络(Convolutional Neural Network,CNN…...

2024年TI杯E题-三子棋游戏装置方案分享-jdk123团队-第二弹 手搓机械臂
第一弹赛题的选择与前期方案的准备 opencv调用摄像头bug的解决 机械臂的组装 采用三个舵机,组成一个三自由度的机械臂。 并且利用电磁吸盘的方式,完成对棋子的抓取工作,后面的事实证明,在预算不足的情况下,队友手搓…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...

Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...