【Docker】Docker网络及容器间通信详解
目录
背景
默认网络
1、bridge 网络模式
2、host 网络模式
3、none 网络模式
4、container 网络模式
自定义网络
容器间网络通信
IP通信
Docker DNS server
Joined容器
前言
本实验通过docker DNS server和joined 容器两种方法实现Docker容器间的通信。Docker容器间通信可用于监控其他容器的网络流量、不同容器中程序如web server和app server的高效通信等场景。通过实验进一步熟悉Docker的架构和基本操作,了解Docker容器间通信的方式。
背景
当项目大规模使用 Docker 时,容器通信的问题也就产生了。要解决容器通信问题,必须先了解很多关于网络的知识。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,也有着很多不完善的地方,网络方面就是 Docker 比较薄弱的部分。因此,我们有必要深入了解 Docker 的网络知识,以满足更高的网络需求。
默认网络
安装 Docker 以后,会默认创建三种网络,可以通过 docker network ls 查看。
我们有必要先来了解一下这几种网络模式都是什么意思。
网络模式 | 参数 | 说明 |
---|---|---|
host模式 | -net=host | 容器和宿主机共享 Network namespace。 |
container模式 | –net=container:NAME_or_ID | 容器和另外一个容器共享 Network namespace。 kubernetes 中的pod就是多个容器共享一个 Network namespace。 |
none模式 | –net=none | 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接,配置IP等。 |
bridge模式 | –net=bridge | 默认为该模式,通过 -p 指定端口映射。 |
1、bridge 网络模式
在该模式中,Docker 守护进程创建了一个虚拟以太网桥 docker0,新建的容器会自动桥接到这个接口,附加在其上的任何网卡之间都能自动转发数据包。
默认情况下,守护进程会创建一对对等虚拟设备接口 veth pair,将其中一个接口设置为容器的 eth0 接口(容器的网卡),另一个接口放置在宿主机的命名空间中,以类似 vethxxx 这样的名字命名,从而将宿主机上的所有容器都连接到这个内部网络上。
比如运行一个基于 busybox 镜像构建的容器 bbox01,查看 ip addr:
busybox是一个软件工具箱,集成了linux中几百个常用的linux命令以及工具。
docker run -it --name bbox01 busybox
其中:
-i:以交互模式运行容器,通常与 -t 同时使用,表示开启了input功能
-t:为容器重新分配一个伪输入终端,通常与-i同时使用,表示开启了连接容器里的terminal(终端)
-d:指定容器在后台运行
然后宿主机通过 ip addr 可以发现:守护进程会创建一对对等虚拟设备接口 veth pair,将其中一个接口设置为容器的 eth0 接口(容器的网卡),另一个接口放置在宿主机的命名空间中,以类似 vethxxx 这样的名字命名。
同时,守护进程还会从网桥 docker0 的私有地址空间中分配一个 IP 地址和子网给该容器,并设置 docker0 的 IP 地址为容器的默认网关。也可以安装 yum install -y bridge-utils 以后,通过 brctl show 命令查看网桥信息。
yum install -y bridge-utils
对于每个容器的 IP 地址和 Gateway 信息,我们可以通过 docker inspect 容器名称|ID 进行查看,在 NetworkSettings 节点中可以看到详细信息。
我们可以通过 docker network inspect bridge 查看所有 bridge 网络模式下的容器,在 Containers 节点中可以看到容器名称。
docker network inspect bridge
关于 bridge 网络模式的使用,只需要在创建容器时通过参数 --net bridge 或者 --network bridge 指定即可,当然这也是创建容器默认使用的网络模式,也就是说这个参数是可以省略的。
Bridge 桥接模式的实现步骤主要如下:
-
Docker Daemon 利用 veth pair 技术,在宿主机上创建一对对等虚拟网络接口设备,假设为 veth0 和 veth1。而veth pair 技术的特性可以保证无论哪一个 veth 接收到网络报文,都会将报文传输给另一方。
-
Docker Daemon 将 veth0 附加到 Docker Daemon 创建的 docker0 网桥上。保证宿主机的网络报文可以发往 veth0;
-
Docker Daemon 将 veth1 添加到 Docker Container 所属的 namespace 下,并被改名为 eth0。如此一来,宿主机的网络报文若发往 veth0,则立即会被 Container 的 eth0 接收,实现宿主机到 Docker Container 网络的联通性;同时,也保证 Docker Container 单独使用 eth0,实现容器网络环境的隔离性。
2、host 网络模式
-
host 网络模式需要在创建容器时通过参数 --net host 或者 --network host 指定;
-
采用 host 网络模式的 Docker Container,可以直接使用宿主机的 IP 地址与外界进行通信,若宿主机的 eth0 是一个公有 IP,那么容器也拥有这个公有 IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行 NAT 转换;
-
host 网络模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。
比如我基于 host 网络模式创建了一个基于 busybox 镜像构建的容器 bbox02,查看 ip addr:
docker run -it --name bbox02 --net host busybox
然后宿主机通过 ip addr 查看信息如下:
返回信息一模一样,我们可以通过 docker network inspect host 查看所有 host 网络模式下的容器,在 Containers 节点中可以看到容器名称。
docker network inspect host
3、none 网络模式
none 网络模式是指禁用网络功能,只有 lo 接口 local 的简写,代表 127.0.0.1,即 localhost 本地环回接口。在创建容器时通过参数 --net none 或者 --network none 指定;
none 网络模式即不为 Docker Container 创建任何的网络环境,容器内部就只能使用 loopback 网络设备,不会再有其他的网络资源。可以说 none 模式为 Docke Container 做了极少的网络设定,但是俗话说得好“少即是多”,在没有网络配置的情况下,作为 Docker 开发者,才能在这基础做其他无限多可能的网络定制开发。这也恰巧体现了 Docker 设计理念的开放。
比如基于 none 网络模式创建了一个基于 busybox 镜像构建的容器 bbox03,查看 ip addr:
docker run -it --name bbox03 --net none busybox
我们可以通过 docker network inspect none 查看所有 none 网络模式下的容器,在 Containers 节点中可以看到容器名称。
docker network inspect none
4、container 网络模式
Container 网络模式是 Docker 中一种较为特别的网络的模式。在创建容器时通过参数 --net container:已运行的容器名称|ID 或者 --network container:已运行的容器名称|ID 指定;
处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用 localhost 高效快速通信。
Container 网络模式即新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样两个容器除了网络方面相同之外,其他的如文件系统、进程列表等还是隔离的。
基于容器 bbox01 创建了 container 网络模式的容器 bbox04,查看 ip addr:
docker run -it --name bbox04 --net container:bbox01 busybox
容器 bbox01 的 ip addr 信息如下:
宿主机的 ip addr 信息如下:
通过以上测试可以发现,Docker 守护进程只创建了一对对等虚拟设备接口用于连接 bbox01 容器和宿主机,而 bbox04 容器则直接使用了 bbox01 容器的网卡信息。
这个时候如果将 bbox01 容器停止,会发现 bbox04 容器就只剩下 lo 接口了。
然后 bbox01 容器重启以后,bbox04 容器也重启一下,就又可以获取到网卡信息了。
自定义网络
虽然 Docker 提供的默认网络使用比较简单,但是为了保证各容器中应用的安全性,在实际开发中更推荐使用自定义的网络进行容器管理,以及启用容器名称到 IP 地址的自动 DNS 解析。
从 Docker 1.10 版本开始,docker daemon 实现了一个内嵌的 DNS server,使容器可以直接通过容器名称通信。方法很简单,只要在创建容器时使用 --name 为容器命名即可。
【说明】 Docker DNS 限制:只能在 user-defined 网络中使用。也就是说,默认的 bridge 网络是无法使用 DNS 的,所以我们就需要自定义网络。
通过 docker network create 命令可以创建自定义网络模式
进一步查看 docker network create 命令使用详情,发现可以通过 --driver 指定网络模式且默认是 bridge 网络模式,提示如下:
创建一个基于 bridge 网络模式的自定义网络模式 custom_network,完整命令如下:
docker network create custom_network
通过 docker network ls 查看网络模式:
docker network ls
通过自定义网络模式 custom_network 创建容器:
docker run -di --name bbox08 --net custom_network busybox
通过 docker inspect 容器名称|ID 查看容器的网络信息,在 NetworkSettings 节点中可以看到详细信息。
docker inspect bbox08
接下来通过 docker network connect 网络名称 容器名称 为容器连接新的网络模式。
docker network connect bridge bbox08
通过 docker inspect 容器名称|ID 再次查看容器的网络信息,多增加了默认的 bridge。
通过 docker network disconnect 网络名称 容器名称 命令断开网络。
docker network disconnect custom_network bbox08
通过 docker inspect 容器名称|ID 再次查看容器的网络信息,发现只剩下默认的 bridge。
可以通过 docker network rm 网络名称 命令移除自定义网络模式,网络模式移除成功会返回网络模式名称。
docker network rm custom_network
容器间网络通信
通常,容器间的通信方式有以下三种:
-
IP通信
-
Docker DNS server
-
Joined容器
IP通信
当docker容器启动的时候,docker会默认给当前容器被分配一个随机的ip。需要分别进入两个容器,通过容器的本地host文件,查看两个容器自身的ip,再经过指定后进行互通。采用IP通信的前提是两个容器必须要属于同一个网络的网卡,但是因为部署过后再指定应用的ip很麻烦,所以ip通信方式就不再过多赘述。
Docker DNS server
Docker DNS Server 是 Docker 容器运行时环境中的一种内置 DNS 服务器。它提供容器间的域名解析服务,使得容器可以通过域名进行网络通信,而无需关注底层的 IP 地址和网络配置。
Docker DNS Server 的主要特点和工作原理如下:
(1)内置 DNS 服务器:Docker 在创建容器时会在每个容器上运行一个内置的 DNS 服务器,该服务器负责处理容器内部的域名解析请求。DNS 服务器默认监听在容器的 loopback 网络接口上。
(2)自动解析容器名:Docker DNS Server 使用容器名作为域名的一部分,因此容器可以通过使用其他容器的名称来访问对应的服务。例如,一个名为 web 的容器可以通过将其他容器的域名设置为 http://XXXXX.com 来访问该服务。
(3)容器间通信:当一个容器需要与另一个容器进行通信时,它可以使用目标容器的名称作为域名进行解析。Docker DNS Server 会将容器名解析为容器的 IP 地址,并将通信请求转发给目标容器。
(4)自动更新记录:当容器创建、销毁或重新调度时,Docker DNS Server 会自动更新容器名与 IP 地址之间的映射关系。这样可以确保容器名始终能够正确解析到对应的 IP 地址。
(5)自定义网络:Docker 允许创建自定义网络,容器可以加入特定的网络中。在自定义网络中,Docker DNS Server 会为该网络中的所有容器提供域名解析服务,使得容器可以相互之间通过容器名进行通信。
Joined容器
joined 容器可以使两个或多个容器共享一个网络栈,共享网卡和配置信息, joined 容器之间可以通过 127.0.0.1直接通信。当一个容器加入到另一个容器的命名空间中时,它可以访问和共享该容器的网络、文件系统和其他资源。这种容器间的连接方式称为容器的链接(Container Linking)。
下面是 Joined 容器的主要特点和使用方式如下:
(1)共享命名空间:Joined 容器会与目标容器共享相同的网络命名空间,这意味着它们可以直接通过本地的 localhost 地址进行通信。同时,Joined 容器还可以共享其他命名空间,如文件系统、进程等,使得它们能够访问和操作彼此的资源。
(2)便捷的通信机制:通过容器的链接,Joined 容器之间可以通过容器名称进行网络通信。这样可以简化容器间的通信配置,并且无需暴露端口给外部网络。
(3)灵活的应用部署:将容器加入到另一个容器中,可以方便地将多个容器组合成一个应用程序的部署单元。这种方式允许开发者以模块化的方式构建和管理复杂的应用程序。
看完这些介绍,接下来我们首先明确一点,容器之间要互相通信,必须要有属于同一个网络的网卡。
我们先创建两个基于默认的 bridge 网络模式的容器。
docker run -di --name default_bbox01 busybox
docker run -di --name default_bbox02 busybox
通过 docker network inspect bridge 查看两容器的具体 IP 信息。
docker network inspect bridge
然后测试两容器间是否可以进行网络通信。
docker exec -it default_bbox01 ping 172.17.0.3
经过测试,从结果得知两个属于同一个网络的容器是可以进行网络通信的,但是 IP 地址可能是不固定的,有被更改的情况发生,这时就需要用到DNS server了。
从 Docker 1.10 版本开始,docker daemon 实现了一个内嵌的 DNS server,使容器可以直接通过容器名称通信。方法很简单,只要在创建容器时使用 --name 为容器命名即可。
但是使用 Docker DNS 有个限制:只能在 user-defined 网络中使用。也就是说,默认的 bridge 网络是无法使用 DNS 的,所以我们就需要自定义网络。
先创建自定义网络。
docker network create custom_network
然后创建两个基于自定义网络模式的容器。
docker run -di --name custom_bbox02 --net custom_network busybox
docker run -di --name custom_bbox03 --net custom_network busybox
通过 docker network inspect custom_network 查看两容器的具体 IP 信息。
然后测试两容器间是否可以进行网络通信,分别使用具体 IP 和容器名称进行网络通信。
docker exec -it custom_bbox02 ping 172.19.0.3
docker exec -it custom_bbox02 ping custom_bbox03
经过测试,从结果得知两个属于同一个自定义网络的容器是可以进行网络通信的,并且可以使用容器名称进行网络通信。
那如果此时希望 bridge 网络下的容器可以和 custom_network 网络下的容器进行网络又该如何操作?那就让 bridge 网络下的容器连接至新的 custom_network 网络即可。
docker network connect custom_network default_bbox01
至于最后提到的通过joined 容器通信就是一种基于容器网络(Container Network)实现的方式。通过加入容器的方式,我们可以轻松地实现容器间的通信,而无需依赖外部的网络设备或服务。这种方式适用于需要实现容器间紧密耦合的应用场景,例如一个容器用作数据库服务,另一个容器用作应用程序服务,它们之间需要进行数据交互和通信。
joined 容器可以使两个或多个容器共享一个网络栈,共享网卡和配置信息,joined容器之间可以通过 127.0.0.1直接通信。
创建一个 httpd 容器,名字为 web1
docker run -d -it --name=web1 httpd
创建一个busybox 容器并通过--network=container:web1指定joined 容器为web1。
docker run -it --network=container:web1 busybox
在busybox容器中用 ip a命令查看网络配置信息,然后用命令exit退出。
进入web1容器:
docker exec -it web1 /bin/bash
查看web1的网络配置信息,可以看到这里web1容器 和busybox容器的网卡 mac 地址、IP 完全一样,它们共享了相同的网络栈。
相关文章:
【Docker】Docker网络及容器间通信详解
目录 背景 默认网络 1、bridge 网络模式 2、host 网络模式 3、none 网络模式 4、container 网络模式 自定义网络 容器间网络通信 IP通信 Docker DNS server Joined容器 前言 本实验通过docker DNS server和joined 容器两种方法实现Docker容器间的通信。Docker容器间…...
TikTok国际版 使用特网科技Bluestacks模拟器安装方法
特网科技Bluestacks模拟器主机 桌面自带Bluestacks模拟器 TikTok国际版Bluestacks模拟器搜索tiktot 登录google应用商店-安装TikTok 安装过程可能需要3-5分钟不等-配置过低可能会导致安装失败,建议升级更高内存。 安装完成-打开 安装成功APP-我的游戏查看 打开国际版…...
【Hello Algorithm】暴力递归到动态规划(四)
动态规划的数组压缩技巧 - 机器人走格子问题 题目是leetcode62题目原题 表示如下 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中…...
arm day 8
arm 写一段按键中断代码 main.c #include "uart.h" #include "key_it.h" int main() {char c;char *s;uart4_init();//串口初始化//中断初始化key_it_config();while(1){//保证主程序不结束}return 0; } src/key_it.c #include"key_it.h"voi…...
k8s-14 存储之volumes
Volumes配置管理 容器中的文件在磁盘上是临时存放的,这给容器中运行的特殊应用程序带来一些问题。首先,当容器崩溃时,kubelet 将重新启动容器,容器中的文件将会丢失因为容器会以干净的状态重建。其次,当在一个 Pod 中…...
二分图博弈
一张二分图,Alice和Bob每人走一步,不能重复走,谁不能走谁输 结论:若存在最大匹配不包含初始点,则Bob赢,否则Alice赢 以上图为例,红色为最大匹配。 首先对于Alice第一步只能走黑边。而Alice无论…...
【C++】C++11—— 包装器
📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:C学习 🎯长路漫漫浩浩,万事皆有期待 上一篇博客:【C】C11…...
LED显示屏高刷新率和低刷新率有什么区别
LED显示屏的刷新率是指图像在LED显示屏上更新的速度,也即屏幕上的图像每秒钟出现的次数,它的单位是赫兹(Hz)。LED显示屏的刷新率越高,图像闪烁感就越小,稳定性也就越高,换言之对视力的保护也越好…...
国际伦敦银点差费值得吗?
伦敦银是国际轨技术属市场上广受追捧的白银保证金交易品种,具有交易时长、交易制度灵活、资金利用率高等诸多的优点。 国际伦敦银的优势主要来自它所实行的是保证金交易制度。目前香港平台一般执行的保证金比例标准是2%,以目前22美元/盎司左右的白银价格…...
常见的作物模型应用技巧!DSSAT模型、APSIM模型、WOFOST模型与PCSE模型等应用
①最新DSSAT作物模型建模方法及应用 DSSAT模型内核算法是基于Fortran语言开发的,软件界面是基于C进行开发。了解和熟悉DSSAT模型的关键算法和软件的操作是学习DSSAT模型的基础。此外,想要成为一名优秀的作物模型使用者与科研团队不可或缺的人才ÿ…...
2023年中国超硬材料制品分析及超硬刀具市场规模分析[图]
超硬材料是指硬度特别高的材料,可分为天然以及人造两种,前者主要包括天然的钻石(金刚石)、黑钻石,后者则包括人造金刚石、立方氮化硼。 超硬材料制品分类 资料来源:共研产业咨询(共研网&#x…...
使用React、Express实现一个问卷发布/收集系统
1. 设置项目结构 questionnaire-system/client/ // 前端应用src/components/ // React组件pages/ // 页面App.jsindex.jsserver/ // 后端服务routes/ // 路由models/ // 数据模型app.jspackage.json2. 启动前端应用…...
DDD之上下文映射图(Context Mapping)
领域驱动设计系列文章,点击上方合集↑ 1. 开头 在DDD中,限界上下文与限界上下文之间需要相互集成,这种集成关系在DDD中称为上下文映射(Context Mapping),也就是子域与子域之间的集成关系。 所以首先我们…...
CountDownLatch的原理
使用CountDownLatch可以实现等待多个线程执行完毕的功能,实现线程之间的协调,让它们按照我们期望的顺序执行,从而避免了可能出现的并发问题。 CountDownLatch是如何实现主线程等待子线程全部结束的呢? 代码用例 这里我们使用一段…...
Java新特性Stream流详解
一、概述 Stream流是Java 8 API添加的一个新的抽象,以一种声明性方式处理数据集合(侧重对于源数据计算能力的封装,并且支持序列与并行两种操作方式)。 Stream流是对集合(Collection)对象功能的增强…...
关于VScode中一些常用的快捷操作!
vscode CTRLO:打开文件夹以开始工作 先CTRLK 再CTRLO:打开文件夹以开始工作 如何选择workspace:file → open folder→选目标文件夹【当前工作区选择会影响代码是否能运行】 如何打开终端:View → terminal debug看不到变化历史&…...
Django 使用Mysql数据库
目录 Django 使用Mysql数据库本地安装Mysql数据服务安装好Pymysql服务Django配置数据库迁移各种报错无法找到mysqlclient数据库拒绝连接 Django 使用Mysql数据库 本地安装Mysql数据服务 安装好Pymysql服务 python3 -m pip install PyMySQL官方文档介绍 Django配置 官网文档 …...
js继承的几种方式(原型链继承、构造函数继承、组合式继承、寄生组合式继承、ES6的Class类继承)
1.原型链继承 实现原理:子类的原型指向父类实例。子类在自身实例上找不到属性和方法时去它父类实例(父类实例和实例的原型对象)上查找,从而实现对父类属性和方法的继承 缺点: 子类创建时不能传参(即没有…...
AnyTransition/过渡动画, MatchedGeometryEffect/匹配几何动画效果 的使用
1. AnyTransition 过渡动画效果 1.1 创建过度动画案例 AnyTransitionBootcamp.swift import SwiftUI/// 旋转修饰 View struct RotateViewModifier :ViewModifier{let rotation: Doublefunc body(content: Content) -> some View {content.rotationEffect(Angle(degrees: r…...
mac版postman升级后数据恢复办法
postman升级了一下,所有的collections都丢失了。 首先在finder里找到这个路径 /Users/{用户名}/Library/Application Support/Postman找到升级之前的的最新的backup.json,然后在postman里import这个文件。 所有升级前的collections都恢复了࿰…...
四.镜头知识之放大倍率
四.镜头知识之放大倍率 文章目录 四.镜头知识之放大倍率4.0 前言4.1 镜头的光学放大倍率的计算方法4.2 显示器的电子放大倍率4.2.1 智能硬件产品的显示放大倍率计算案例4.3 系统放大倍率4.4 智能硬件产品的系统放大倍率计算案例4.4 智能硬件产品的系统放大倍率计算案例4.0 前言…...
Jenkins UI 自动化持续化集成测试
一:安装jenkins 环境 在官网下载msi 直接安装即可 二:设置全局变量 设置allure 路径 三:创建项目 1、创建自由风格项目 2、如果项目在本地,且本地服务器是windows ,找到Jenkins安装根目录,寻找config…...
vue项目中引入地图的详细教程
第一步:在项目中安装地图插件 npm i amap/amap-jsapi-loader --save 第二步:创建一个容器 添加id属性 (因为地图必须使用id 不能使用class) <div id"maps"></div> 第三步:给这个容器设置宽…...
MyBatisPlus 多数据源配置
目录 一、mybatis-plus 简介 特性 二、支持数据库: 三、 开发实例 1. 引入依赖: 2. 参数配置application.yml 3. 在 Spring Boot 启动类中添加 MapperScan 注解,扫描 Mapper 文件夹: 4. 编写实体类 User.java(此处…...
使用Golang实现HTTP代理突破IP访问限制
引言 在当今互联网时代,网站和服务商为了维护安全性和保护用户隐私,常常会对特定的IP地址进行封锁或限制。但是,有时候我们可能需要访问这些被限制的网站或服务。为了突破这种限制,我们可以使用HTTP代理来隐藏真实的客户端IP地址…...
Iterator和ListIterator的区别是什么?
Iterator 和 ListIterator 都是 Java 集合框架中的迭代器,其中 Iterator 是普遍适用于所有实现了 Iterable 接口的集合类的通用迭代器,而 ListIterator 则是专门用于遍历 List 集合的迭代器,它比 Iterator 更加强大,而且只适用于 List 集合。 以下是 Iterator 和 ListItera…...
大坑-MATLAB图片转存时需注意的点
MATLAB中图片的保存和转存有一个巨大的陷阱,我也是在吃了大亏后发现的,正常情况下,MATLAB跑完实验,生成的图片如下 放大后这样 可以方便修改坐标轴标题,最初我就是因为想修改坐标轴标题才给它放大的,因为…...
基于Lang-Chain(ChatGLM和ChatChat)知识库大语言模型的部署搭建
环境准备 阿里云个人认证后,可免费试用机器学习平台PAI,可提供适合大语言模型环境搭建的高配置服务器。 点击试用阿里云服务器 试用产品选择:选择交互式建模PAI-DSW 适合哪些场景 文章/知识库/帮助文档等的检索基于现有知识库实现问答… …...
个人轻博客PHP开源系统/溯雪Sxlog轻博客源码/洁干净轻/占内存极低/php源码
源码简介: 溯雪(sxlog)它是一款很简洁越低内存的轻博客程序,整个程序包不到200KB,占内存极小,比一张照片都要小很多。简洁高效,占用空间内存极小,而且它不依赖任何数据库,不依赖富文本编辑器&a…...
2.Vue-从零开始搭建一个vue项目
题记 从零开始搭建一个vue项目,以下是操作的全过程。 安装Vue CLI脚手架 打开终端,运行以下命令全局安装Vue CLI脚手架: npm install -g vue/cli 查看 Vue CLI脚手架版本: vue -V 注意:查看vue版本的命令不是vue -V&a…...
佛山专业网站营销/阿里大数据分析平台
领导力的36个关键 下载没有交易权 与生产线经理不同,您通常不以产品负责人的身份管理开发团队和利益相关者 ,个人也不向您报告。 因此,您没有任何交易权 :您无法告诉别人该怎么做; 您不能为其分配任务; 并且…...
未及时取消网站备案/著名营销策划公司
Swoole 如何处理高并发①对Reactor模型介绍我们都知道IO复用异步非阻塞程序使用的是经典的Reactor模型,Reactor就是反应堆的意思,也就是说它本身不处理任何数据收发。只是可以监视一个socket(比如管道、eventfd、信号)句柄的事件变化。Reactor只作为一个…...
英文网站制作 官网/网站收录提交入口大全
最近看了关于卢森堡博士的《非暴力沟通》一书,强烈推荐,这本书很实用。尤其是对于亲近之人之间改善关系,如何化解彼此之间的冷暴力。简单来是两个方面,对外对其他的观察要客观,评论一个人的时候一定要有特定的时间和地…...
做一个购物网站/昆明关键词优化
下面是一个判断整数是否为素数的C语言函数: #include <math.h>int isprime(int n) {if (n < 1) return 0;for (int i 2; i < sqrt(n); i) {if (n % i 0) return 0;}return 1; }...
南昌网站建设制作与维护/软文标题大全
Pacemaker、corosync pacemaker详细介绍: http://blog.51cto.com/freeloda/1274533 corosync详细介绍: http://blog.51cto.com/freeloda/1272417 Pacemaker是一个集群资源管理器。它利用集群基础构件(OpenAIS 、heartbeat或corosyncÿ…...
wordpress主题使用/网络营销课程实训总结
{dede:sql runphpyes sqlSelect content from dede_arctype where id10}[field:content function"cn_substr(me,180)"/] {/dede:sql}使用cn_substr函数即可实现截串。Html2text()函数是去掉html标签代码。参考代码:转载于:https://blog.51cto.com/okowo/1…...