Debian10,docker单机安装ThingsBoard-3.3.2

news2025/1/15 17:30:40

1.编译项目源码

源代码编译ThingsBoard-3.3.2

2.环境准备

修改ssh登录配置

sudo vi /etc/ssh/sshd_config
打开密码登录和root用户登录

3.安装docker

更新apt

sudo apt update

安装必备软件

sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common

错误一

E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?

参考文章
依次执行

sudo rm /var/lib/apt/lists/lock
sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock*
sudo dpkg --configure -a
sudo apt update

将官方 Docker hub 的 GPG key 添加到系统中

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

将 Docker 版本库添加到APT源:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"

安装docker

sudo apt update
sudo apt install docker-ce

检查运行

sudo systemctl status docker

安装docker-compose

安装docker-compose

curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

更改权限

sudo chmod +x /usr/local/bin/docker-compose
docker-compose version

4.docker集群

初始化主节点

--advertise-addr参数设定为主节点的ip
docker swarm init --advertise-addr 192.168.200.10

子节点加入

 docker swarm join --token SWMTKN-1-30b3cmx28ufw2n1mufspl4vckej58wkt50oj03vbjqdycb7mcv-61lnupb8w4a07d95p8pmgjdl8 192.168.200.10:2377

查看docker集群

docker node  ls

在这里插入图片描述

安装docker本地仓库

docker pull registry

选择master节点搭建本地仓库

vi /etc/docker/daemon.json
{ 
  "insecure-registries": ["192.168.200.10:5000"], 
  "registry-mirrors": ["https://4abdkxlk.mirror.aliyuncs.com"]
}

子节点指定本地仓库地址

echo '{ "insecure-registries":    ["192.168.200.10:5000"] }' > /etc/docker/daemon.json

重启docker

systemctl daemon-reload
systemctl restart docker.service
mkdir -p /software/registry

主节点部署仓库

docker run -d -p 5000:5000 -v /software/registry:/tmp/registry  --restart=always registry
'//-p指定端口,一内一外;-v表示挂载,前者是宿主机,后者是容器'

查看仓库镜像

curl -X GET http://192.168.200.10:5000/v2/_catalog

不做

#打标签
docker tag nginx:latest 192.168.59.111:5000/nginx
#上传
docker push 192.168.59.111:5000/nginx

集群解散命令

docker swarm leave --force

4.部署ThingsBoard

创建文件夹

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

编译镜像

去到对应目录

docker build -t tb-js-executor .
docker build -t tb-node .
docker build -t tb-web-ui .
docker build -t tb-mqtt-transport .
docker build -t tb-http-transport .

发布镜像到本地仓库

vi push.sh
docker tag tb-node:latest 192.168.200.10:5000/tb-node
#推送到本地仓库
docker push 192.168.200.10:5000/tb-node


docker tag tb-web-ui:latest 192.168.200.10:5000/tb-web-ui
#推送到本地仓库
docker push 192.168.200.10:5000/tb-web-ui


docker tag tb-mqtt-transport:latest 192.168.200.10:5000/tb-mqtt-transport
#推送到本地仓库
docker push 192.168.200.10:5000/tb-mqtt-transport


docker tag tb-http-transport:latest 192.168.200.10:5000/tb-http-transport
#推送到本地仓库
docker push 192.168.200.10:5000/tb-http-transport


docker tag tb-js-executor:latest 192.168.200.10:5000/tb-js-executor
#推送到本地仓库
docker push 192.168.200.10:5000/tb-js-executor


docker rmi 192.168.200.10:5000/tb-js-executor:latest
docker rmi 192.168.200.10:5000/tb-mqtt-transport:latest
docker rmi 192.168.200.10:5000/tb-http-transport:latest
docker rmi 192.168.200.10:5000/tb-web-ui:latest
docker rmi 192.168.200.10:5000/tb-node:latest
# docker tag local-image:tagname new-repo:tagname
# tag复制一份镜像并改名,然后推送到私有仓库,删除本地推送的镜像
docker tag tb-node:latest 192.168.200.20:5000/tb-node
docker push 192.168.200.20:5000/tb-node

docker tag tb-web-ui:latest 192.168.200.20:5000/tb-web-ui
docker push 192.168.200.20:5000/tb-web-ui

docker tag tb-mqtt-transport:latest 192.168.200.20:5000/tb-mqtt-transport
docker push 192.168.200.20:5000/tb-mqtt-transport


docker tag tb-http-transport:latest 192.168.200.20:5000/tb-http-transport
docker push 192.168.200.20:5000/tb-http-transport


docker tag tb-js-executor:latest 192.168.200.20:5000/tb-js-executor
docker push 192.168.200.20:5000/tb-js-executor

docker rmi 192.168.200.20:5000/tb-node:latest
docker rmi 192.168.200.20:5000/tb-web-ui:latest
docker rmi 192.168.200.20:5000/tb-js-executor:latest
docker rmi 192.168.200.20:5000/tb-mqtt-transport:latest
docker rmi 192.168.200.20:5000/tb-http-transport:latest


查看仓库镜像

curl -X GET http://192.168.200.10:5000/v2/_catalog

上传docker文件夹

在这里插入图片描述
在这里插入图片描述

安装rabbitmq

docker pull rabbitmq:3.7.7-management
docker run -d -p  5672:5672 -p 15672:15672    -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin --name rabbitmq --hostname=rabbitmq rabbitmq:3.7.7-management
5672服务地址
15672webUI
http://192.168.200.10:15672/#/

上传源码中的docker文件夹

vi docker-compose.rabbitmq.yml
将不使用的协议注释

编辑环境变量

在这里插入图片描述
配置来源compose-utils.sh

vi env.sh

TB_QUEUE_TYPE=rabbitmq

DOCKER_REPO=192.168.200.10:5000

JS_EXECUTOR_DOCKER_NAME=tb-js-executor
TB_NODE_DOCKER_NAME=tb-node
WEB_UI_DOCKER_NAME=tb-web-ui
MQTT_TRANSPORT_DOCKER_NAME=tb-mqtt-transport
HTTP_TRANSPORT_DOCKER_NAME=tb-http-transport

COAP_TRANSPORT_DOCKER_NAME=tb-coap-transport
LWM2M_TRANSPORT_DOCKER_NAME=tb-lwm2m-transport
SNMP_TRANSPORT_DOCKER_NAME=tb-snmp-transport

TB_VERSION=latest

# Database used by ThingsBoard, can be either postgres (PostgreSQL) or hybrid (PostgreSQL for entities database and Cassandra for timeseries database).
# According to the database type corresponding docker service will be deployed (see docker-compose.postgres.yml, docker-compose.hybrid.yml for details).

DATABASE=postgres

LOAD_BALANCER_NAME=haproxy-certbot

# If enabled Prometheus and Grafana containers are deployed along with other containers
MONITORING_ENABLED=false

vi docker-compose.yml
将不需要的协议注释
#
# Copyright © 2016-2021 The Thingsboard Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#


version: '2.2'

services:
  zookeeper:
    restart: always
    image: "zookeeper:3.5"
    ports:
      - "2181"
    environment:
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=zookeeper:2888:3888;zookeeper:2181
  redis:
    restart: always
    image: redis:4.0
    ports:
      - "6379"
  tb-js-executor:
    restart: always
    image: "${DOCKER_REPO}/${JS_EXECUTOR_DOCKER_NAME}:${TB_VERSION}"
    scale: 20
    env_file:
      - tb-js-executor.env
  tb-core1:
    restart: always
    image: "${DOCKER_REPO}/${TB_NODE_DOCKER_NAME}:${TB_VERSION}"
    ports:
      - "8080"
      - "7070"
    logging:
      driver: "json-file"
      options:
        max-size: "200m"
        max-file: "30"
    environment:
      TB_SERVICE_ID: tb-core1
      TB_SERVICE_TYPE: tb-core
      EDGES_ENABLED: "true"
    env_file:
      - tb-node.env
    volumes:
      - ./tb-node/conf:/config
      - ./tb-node/log:/var/log/thingsboard
    depends_on:
      - zookeeper
      - redis
      - tb-js-executor
      - tb-rule-engine1
      - tb-rule-engine2
  tb-core2:
    restart: always
    image: "${DOCKER_REPO}/${TB_NODE_DOCKER_NAME}:${TB_VERSION}"
    ports:
      - "8080"
      - "7070"
    logging:
      driver: "json-file"
      options:
        max-size: "200m"
        max-file: "30"
    environment:
      TB_SERVICE_ID: tb-core2
      TB_SERVICE_TYPE: tb-core
      EDGES_ENABLED: "true"
    env_file:
      - tb-node.env
    volumes:
      - ./tb-node/conf:/config
      - ./tb-node/log:/var/log/thingsboard
    depends_on:
      - zookeeper
      - redis
      - tb-js-executor
      - tb-rule-engine1
      - tb-rule-engine2
  tb-rule-engine1:
    restart: always
    image: "${DOCKER_REPO}/${TB_NODE_DOCKER_NAME}:${TB_VERSION}"
    ports:
      - "8080"
    logging:
      driver: "json-file"
      options:
        max-size: "200m"
        max-file: "30"
    environment:
      TB_SERVICE_ID: tb-rule-engine1
      TB_SERVICE_TYPE: tb-rule-engine
    env_file:
      - tb-node.env
    volumes:
      - ./tb-node/conf:/config
      - ./tb-node/log:/var/log/thingsboard
    depends_on:
      - zookeeper
      - redis
      - tb-js-executor
  tb-rule-engine2:
    restart: always
    image: "${DOCKER_REPO}/${TB_NODE_DOCKER_NAME}:${TB_VERSION}"
    ports:
      - "8080"
    logging:
      driver: "json-file"
      options:
        max-size: "200m"
        max-file: "30"
    environment:
      TB_SERVICE_ID: tb-rule-engine2
      TB_SERVICE_TYPE: tb-rule-engine
    env_file:
      - tb-node.env
    volumes:
      - ./tb-node/conf:/config
      - ./tb-node/log:/var/log/thingsboard
    depends_on:
      - zookeeper
      - redis
      - tb-js-executor
  tb-mqtt-transport1:
    restart: always
    image: "${DOCKER_REPO}/${MQTT_TRANSPORT_DOCKER_NAME}:${TB_VERSION}"
    ports:
      - "1883"
    environment:
      TB_SERVICE_ID: tb-mqtt-transport1
    env_file:
      - tb-mqtt-transport.env
    volumes:
      - ./tb-transports/mqtt/conf:/config
      - ./tb-transports/mqtt/log:/var/log/tb-mqtt-transport
    depends_on:
      - zookeeper
  tb-mqtt-transport2:
    restart: always
    image: "${DOCKER_REPO}/${MQTT_TRANSPORT_DOCKER_NAME}:${TB_VERSION}"
    ports:
      - "1883"
    environment:
      TB_SERVICE_ID: tb-mqtt-transport2
    env_file:
      - tb-mqtt-transport.env
    volumes:
      - ./tb-transports/mqtt/conf:/config
      - ./tb-transports/mqtt/log:/var/log/tb-mqtt-transport
    depends_on:
      - zookeeper
  tb-http-transport1:
    restart: always
    image: "${DOCKER_REPO}/${HTTP_TRANSPORT_DOCKER_NAME}:${TB_VERSION}"
    ports:
      - "8081"
    environment:
      TB_SERVICE_ID: tb-http-transport1
    env_file:
      - tb-http-transport.env
    volumes:
      - ./tb-transports/http/conf:/config
      - ./tb-transports/http/log:/var/log/tb-http-transport
    depends_on:
      - zookeeper
  tb-http-transport2:
    restart: always
    image: "${DOCKER_REPO}/${HTTP_TRANSPORT_DOCKER_NAME}:${TB_VERSION}"
    ports:
      - "8081"
    environment:
      TB_SERVICE_ID: tb-http-transport2
    env_file:
      - tb-http-transport.env
    volumes:
      - ./tb-transports/http/conf:/config
      - ./tb-transports/http/log:/var/log/tb-http-transport
    depends_on:
      - zookeeper
      
#  tb-coap-transport:
#    restart: always
#    image: "${DOCKER_REPO}/${COAP_TRANSPORT_DOCKER_NAME}:${TB_VERSION}"
#    ports:
#      - "5683:5683/udp"
#    environment:
#      TB_SERVICE_ID: tb-coap-transport
#    env_file:
#      - tb-coap-transport.env
#    volumes:
#      - ./tb-transports/coap/conf:/config
#      - ./tb-transports/coap/log:/var/log/tb-coap-transport
#    depends_on:
#      - zookeeper
      
#  tb-lwm2m-transport:
#    restart: always
#    image: "${DOCKER_REPO}/${LWM2M_TRANSPORT_DOCKER_NAME}:${TB_VERSION}"
#    ports:
#      - "5685:5685/udp"
#    environment:
#      TB_SERVICE_ID: tb-lwm2m-transport
#    env_file:
#      - tb-lwm2m-transport.env
#    volumes:
#      - ./tb-transports/lwm2m/conf:/config
#      - ./tb-transports/lwm2m/log:/var/log/tb-lwm2m-transport
#    depends_on:
#      - zookeeper
      
#  tb-snmp-transport:
#    restart: always
#    image: "${DOCKER_REPO}/${SNMP_TRANSPORT_DOCKER_NAME}:${TB_VERSION}"
#    environment:
#      TB_SERVICE_ID: tb-snmp-transport
#    env_file:
#      - tb-snmp-transport.env
#    volumes:
#      - ./tb-transports/snmp/conf:/config
#      - ./tb-transports/snmp/log:/var/log/tb-snmp-transport
#    depends_on:
#      - zookeeper
      
  tb-web-ui1:
    restart: always
    image: "${DOCKER_REPO}/${WEB_UI_DOCKER_NAME}:${TB_VERSION}"
    ports:
      - "8080"
    env_file:
      - tb-web-ui.env
  tb-web-ui2:
    restart: always
    image: "${DOCKER_REPO}/${WEB_UI_DOCKER_NAME}:${TB_VERSION}"
    ports:
      - "8080"
    env_file:
      - tb-web-ui.env
  haproxy:
    restart: always
    container_name: "${LOAD_BALANCER_NAME}"
    image: thingsboard/haproxy-certbot:1.3.0
    volumes:
     - ./haproxy/config:/config
     - ./haproxy/letsencrypt:/etc/letsencrypt
     - ./haproxy/certs.d:/usr/local/etc/haproxy/certs.d
    ports:
     - "80:80"
     - "443:443"
     - "1883:1883"
     - "7070:7070"
     - "9999:9999"
    cap_add:
     - NET_ADMIN
    environment:
      HTTP_PORT: 80
      HTTPS_PORT: 443
      MQTT_PORT: 1883
      EDGES_RPC_PORT: 7070
      FORCE_HTTPS_REDIRECT: "false"
    links:
        - tb-core1
        - tb-core2
        - tb-web-ui1
        - tb-web-ui2
        - tb-mqtt-transport1
        - tb-mqtt-transport2
        - tb-http-transport1
        - tb-http-transport2

正式安装ThingsBoard-3.3.2

创建日志文件夹

sh docker-create-log-folders.sh

执行安装脚本

sh docker-install-tb.sh

错误一

docker-install-tb.sh: 18: docker-install-tb.sh: [[: not found
docker-install-tb.sh: 34: [: unexpected operator
docker-install-tb.sh: 42: docker-install-tb.sh: source: not found

在这里插入图片描述
参考文章

sudo dpkg-reconfigure dash
弹出页面选择no

错误二

docker-install-tb.sh: line 42: source: compose-utils.sh: file not found

source命令找不到文件,在所有报错的文件前加./ 指定目录

source命令找不到的文件
docker-install-tb.sh
compose-utils.sh
docker-start-services.sh
docker-stop-services.sh
vi docker-compose.rabbitmq.yml
#不使用的协议注释

错误三

[0.001s][error][logging] Error opening log file '/var/log/thingsboard/tb-core1-gc.log': Permission denied
[0.001s][error][logging] Initialization of output 'file=/var/log/thingsboard/tb-core1-gc.log' using options 'filecount=10,filesize=10M' failed.
Invalid -Xlog option '-Xlog:gc*,heap*,age*,safepoint=debug:file=/var/log/thingsboard/tb-core1-gc.log:time,uptime,level,tags:filecount=10,filesize=10M', see error log for details.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

解决,重新赋予文件夹访问权限

sh docker-start-services.sh

安装成功,查看进程

docker-compose ps
系统管理员账号:sysadmin@thingsboard.org

密码:sysadmin

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

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

相关文章

SpringBoot异步方法(官方案例)

在线文档项目结构 1.源码克隆:git clone https://github.com/spring-guides/gs-async-method.git 2.包含两个项目initial和complete,initial可以根据文档练习完善,complete是完整项目 3.功能描述:构建查找服务,异步查询…

Linux搭建Docker版FTP,命令与Dockerfile两种方式以及容器编码解决

Linux搭建Docker版FTP,命令与Dockerfile两种方式以及容器编码解决一、Linux搭建Docker版FTP二、修改 Docker 容器内部 locale 系统编码最终待实现效果,这个方式容器内部编码并未永久改变三、编写Dockerfile方式加载带UTF-8编码环境的镜像3.1Dockerfile构…

【LINUX权限】

目录:前言一、shell二、权限(一)文件权限(二)权限相关指令chmod(修改权限)su 、sudo(提权)root提权chown 、chgrpumask(掩码)file(三&…

性能测试工具 Lmbench 的使用方法以及解析运行结果

1. Lmbench 简介 Lmbench 是一款简易可以移植的内存测试工具,其主要功能有,带宽测评(读取缓存文件、拷贝内存、读/写内存、管道、TCP),延时测评(上下文切换、网络、文件系统的建立和删除、进程创建、信号处…

MYSQL中的14个实用的功能

1.group_concat 在我们平常的工作中,使用group by进行分组的场景,是非常多的。 比如想统计出用户表中,名称不同的用户的具体名称有哪些? 具体sql如下: select name from `user` group by name; 但如果想把name相同的code拼接在一起,放到另外一列中该怎么办呢? 答:…

Genesis一款基于Domino的app store应用超市

大家好,才是真的好。 众所周知,App Store是苹果iOS系统生态成功的关键因素。Domino作为一款企业应用平台,很多年前,就有人提出要创建Domino平台上的App Store。 其实比IOS早很多年前就有类似的应用管理,早在2000年的…

代码随想录之回溯第一课

要领:类型题目,用具体的一个例子来记忆,就够了,印象更加深刻。 一个题目,感觉理解不深刻,不透彻,不清晰,不熟练,就是不达标。 怎么做? 每天回顾复习看一次&am…

DD-1/50 12.5-50mA【接地继电器】

系列型号: DD-1/40接地继电器 DD-1/50接地继电器 DD-1/60接地继电器 一、 用途及工作原理 DD-1型接地继电器为瞬时动作的过电流继电器,用作小电流接地电力系统高电压三相交流发电机和电动机的接地零序过电流保护。继电器线圈接零序电流互感器(电缆式、…

电脑重装系统后分辨率不对应该怎么调

越来越多的小伙伴使用小白一键重装系统给自己的电脑安装上了win10系统,但是有部分小伙伴发现安装完win10系统之后,屏幕分辨率也无法进行调整,呈灰色状态。接下来小编就给大家详细的介绍一下小白一键重装系统分辨率不对怎么调的教程。 工具/原…

【Django】(一)基础知识

文章目录一.安装二.创建项目三.项目介绍四.APP的创建五.小案例六 模板和静态文件模板静态文件7.模板语法7.1 变量7.2列表7.3 字典7.4 过滤器7.5 if/else7.6 for标签7.7 ifequal和ifnotequal7.8注释7.9csrf_token8.模板继承8.1父模板8.2 子模板9.请求和响应10.数据库10.1安装第三…

【服务器搭建个人网站】附:接入的服务商 以及 安全评估报告该如何填写?

前言 哈喽,大家好,我是木易巷! 关于公安备案的一些详细的细节没有分享出来,在公安备案期间要填写很多东西,其中比较难填写的就是接入的服务商和安全评估报告的填写。 这一篇给大家总结:公安备案接入服务商和…

⭐️【linux】关于linux-gcc,你必须要知道的知识

🌲🌲目录🌲🌲 1️⃣什么是gcc 2️⃣gcc如何生成可执行文件 3️⃣简单使用gcc 4️⃣linux的库 1️⃣什么是gcc ❄️GCC(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的…

Java 中 Map 集合的基本使用

一、HashMap 1.1 HashMap 基本使用 import java.util.*;/*** author: yunhu* date: 2022/7/14*/ public class Test {public static void main(String[] args) {Map<String, Integer> map new HashMap<>();map.put("Alice", 12);map.put("Bob&qu…

62.Python 类的3要素语法

62.类的3要素语法 文章目录62.类的3要素语法1. 定义类的语法2. pass语句的作用3.我们学的5个缩进语法4.类的属性5.类的方法6. 创建对象7.类在爬虫中的应用8. 总结1. 定义类的语法 定义类的语法如下&#xff1a; class 类名: 代码块 从语法上来看&#xff1a;类的…

Edify Script (Android Shell)定制Twrp刷机包

本文将通过三方面向大家介绍Edify Script,相信你看完了这篇文章会对安卓系统可刷写插件有一个比较完整的认识,并且能过通过阅读此文章实现使用twrp刷入自己写的插件zipi包。网上能搜到的大部分是旧的,新版本去掉了很多的edify函数,照着他们那个写多半会报错。 本文分为如下…

LeetCode学习-第三十八天

第三十八天 我使用的C&#xff0c;错误的地方请见谅&#xff0c;文章初衷仅用来督促本人学习&#xff0c;如果恰巧能够给你带来帮助&#xff0c;我会十分开心。 文章目录第三十八天一、537. 复数乘法二、29. 两数相除一、537. 复数乘法 复数 可以用字符串表示&#xff0c;遵循…

CentOS7如何修改IP地址及UUID

CentOS7系统下&#xff0c;如果要把IP地址修改为192.168.1.80&#xff0c;子网掩码是255.255.255.0&#xff0c;网关是192.168.1.1&#xff0c;DNS是192.168.1.1&#xff0c;那么我们使用客户端连接CentOS或者打开系统终端&#xff0c;切换到root用户&#xff0c;命令&#xff…

开料的目的和子流程,一文读懂

经过多个月的分享&#xff0c;关于PCB行业&#xff0c;想必朋友们已经有了一些个人的理解&#xff0c;甚至对PCB行业&#xff0c;还产生了浓厚的兴趣。 但是&#xff0c;PCB生产工艺是非常复杂的&#xff0c;想要深入地学习并且学好PCB生产工艺&#xff0c;假如不在PCB的生产一…

如何从PyTorch中获取过程特征图

一、获取Tensor 神经网络在运算过程中实际上是以Tensor为格式进行计算的&#xff0c;我们只需稍稍改动一下forward函数即可从运算过程中抓到Tensor 代码如下&#xff1a; base_feature self.extractor.forward(x) #正常的前向传递 featurebase_feature.detach() …

JavaScript 数据类型

文章目录JavaScript 数据类型JavaScript 拥有动态类型JavaScript 字符串JavaScript 数字JavaScript 布尔JavaScript 数组JavaScript 对象Undefined 和 Null声明变量类型JavaScript 数据类型 字符串&#xff08;String&#xff09;、数字(Number)、布尔(Boolean)、数组(Array)、…