【GoTeams】-5:引入Docker

本文目录
- 1. Dokcer-compose
- 回顾下Docker知识
- 编写docker-compose.yaml
- 运行docker
- 2. 部署go服务
- 编写dockerfile
1. Dokcer-compose
这里简单先用一下win版本的Docker,后期开发好了部署的时候再移植到服务器下进行docker部署。
输入命令docker-compose version 就可以看到已经装好的docker版本了,顺便装一个dockerdesktop。
回顾下Docker知识
Docker 是一个开源的应用容器引擎,它通过容器技术来实现轻量级的虚拟化。容器允许开发者将应用及其所有依赖包打包到一个可移植的容器中,以便在任何环境中一致地运行。
Docker Compose 是 Docker 官方提供的一个工具,用于定义和运行多容器的 Docker 应用。通过 Compose,用户可以使用 YAML 文件来定义多个 Docker 容器的服务、网络、存储卷等配置,并通过一个命令(docker-compose up)启动所有定义好的服务。
Dockerfile 是用来构建 Docker 镜像的文件,包含创建镜像的步骤和指令,可以与 Docker Compose 配合使用,在 Compose 中定义服务时使用自定义的 Docker 镜像。
编写docker-compose.yaml
目前需要部署Mysql、Redis、Etcd、User、Api服务,所以需要编写一下Docker方便以后启动。
创建一个docker-compose.yaml文件,然后进行容器编排。
version: '3'
services:mysql:container_name: mysql8image: mysql:${MYSQL_VERSION}restart: alwaysports:- 3309:3306environment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: rootMYSQL_DATABASE: msprojectvolumes:- ${MYSQL_DIR}/data:/var/lib/mysql- ${MYSQL_DIR}/conf:/etc/mysql/conf.d/- ${MYSQL_DIR}/logs:/logscommand:--default-authentication-plugin=mysql_native_password--character-set-server=utf8mb4--collation-server=utf8mb4_general_ci--explicit_defaults_for_timestamp=true--lower_case_table_names=1
这里大致讲一下进行了什么操作,回顾下之前学过的docker容器。
首先定义容器名称,container_name: mysql8,定义了容器的名称为 mysql8,可以通过这个名称来管理MySQL容器。
image: mysql:${MYSQL_VERSION}该配置使用指定版本的MySQL镜像,${MYSQL_VERSION} 是一个变量,表示MySQL的版本号。该变量的实际值在运行时会由环境变量提供。
3309:3306 将容器的3306端口(MySQL默认端口)映射到主机的3309端口。可以通过主机的3309端口访问容器中的MySQL服务。
MYSQL_DATABASE: msproject 创建一个名为msproject的数据库。
${MYSQL_DIR}/data:/var/lib/mysql 将主机上 ${MYSQL_DIR}/data 目录映射到容器的 /var/lib/mysql 目录,这是MySQL存储数据的位置。
${MYSQL_DIR}/conf:/etc/mysql/conf.d/ 将主机上 ${MYSQL_DIR}/conf 目录映射到容器的 /etc/mysql/conf.d/,用于配置MySQL。
${MYSQL_DIR}/logs:/logs 将主机上 ${MYSQL_DIR}/logs 目录映射到容器的 /logs 目录,用于存储MySQL的日志。
然后是Redis的持久化。
Redis:container_name: redis6image: redis:${REDIS_VERSION}restart: alwaysvolumes:- ${REDIS_DIR}/data:/data- ${REDIS_DIR}/conf/redis.conf:/etc/redis/redis.confports:- ${REDIS_PORT}:6379command: redis-server /etc/redis/redis.conf
Etcd持久化。
Project-User:container_name: project-userimage: project-user:latestports:- 8080:8080- 8881:8881
User服务持久化。
Etcd:container_name: etcd3image: bitnami/etcd:${ETCD_VERSION}deploy:replicas: 1restart_policy:condition: on-failureenvironment:- ALLOW_NONE_AUTHENTICATION=yesprivileged: truevolumes:- ${ETCD_DIR}/data:/bitnami/etcd/dataports:- ${ETCD_PORT}:2379- 2380:2380
上面我们有一些需要环境提供的参数,这里需要在.env环境编写。
MYSQL_VERSION=8.0.20
MYSQL_DIR=D:\GoProject\msproject-data\mysql
MYSQL_PORT=3309
REDIS_VERSION=6.2.7
REDIS_PORT=6379
REDIS_DIR=D:\GoProject\msproject-data\redis
ETCD_VERSION=3.5.6
ETCD_PORT=2379
ETCD_DIR=D:\GoProject\msproject-data\etcd
此外还需要在redis下来配置.conf文件,D:\GoProject\msproject-data\redis\conf
# 任意ip可访问
bind 0.0.0.0
# 自定义启动端口
port 6379
# rdb或aof文件存储位置
dir /data
save 900 1
save 300 10
save 60 10000
appendonly yes
appendfilename "appendonly.aof"
运行docker
我们在项目路径下直接docker-compose up -d,-d的作用是后台启动,然后直接等待拉取启动即可。

在desktop中能看到帮我们拉取的镜像。

以及启动的容器。

通过redis试试是否能够添加成功。

CREATE TABLE `ms_member` (`id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '系统前台用户表',`account` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '用户登陆账号',`password` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '登陆密码',`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '用户昵称',`mobile` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '手机',`realname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '真实姓名',`create_time` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建时间',`status` tinyint(1) NULL DEFAULT 0 COMMENT '状态',`last_login_time` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '上次登录时间',`sex` tinyint(0) NULL DEFAULT 0 COMMENT '性别',`avatar` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '头像',`idcard` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '身份证',`province` int(0) NULL DEFAULT 0 COMMENT '省',`city` int(0) NULL DEFAULT 0 COMMENT '市',`area` int(0) NULL DEFAULT 0 COMMENT '区',`address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '所在地址',`description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '备注',`email` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮箱',`dingtalk_openid` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '钉钉openid',`dingtalk_unionid` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '钉钉unionid',`dingtalk_userid` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '钉钉用户id',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户表' ROW_FORMAT = COMPACT;
我们把准备好的表,在mysql中导入。

这样服务就跑起来了,我们来看看现在etcd是否能用。
分别把user服务和api服务跑起来,然后看看前端是否能够正常请求。

验证无误,现在把mysql、redis、etcd迁移到docker上了,查询redis也能够查询到记录的验证码!

2. 部署go服务
需要把go服务也编译打包成镜像,然后运行起来。下面是一个编译的脚本。
chcp 65001
@echo off
:loop
@echo off&color 0A
cls
echo,
echo 请选择要编译的系统环境:
echo,
echo 1. Windows_amd64
echo 2. linux_amd64set/p action=请选择:
if %action% == 1 goto build_Windows_amd64
if %action% == 2 goto build_linux_amd64:build_Windows_amd64
echo 编译Windows版本64位
SET CGO_ENABLED=0
SET GOOS=windows
SET GOARCH=amd64
go build -o project-user/target/project-user.exe project-user/main.go
go build -o project-api/target/project-api.exe project-api/main.go
:build_linux_amd64
echo 编译Linux版本64位
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build -o project-user/target/project-user project-user/main.go
go build -o project-api/target/project-api project-api/main.go
在脚本下执行build 命令,然后进行编译,这里我们需要编译linux版本,放到docker中去。

编写dockerfile
写dockerfile是为了编译成镜像。
FROM alpine
WORKDIR /Initial
COPY ./target/project-user .
COPY ./config/config-docker.yaml .
RUN mkdir config && mv config-docker.yaml config/config.yaml
EXPOSE 8080 8881
ENTRYPOINT ["./project-user"]
FROM alpine指定了构建镜像所使用的基础镜像为 alpine,这是一个非常轻量的 Linux 发行版。使用 alpine 作为基础镜像,可以减小镜像的体积,因为 alpine 镜像通常非常小,只有几十兆。
WORKDIR /Initial 设置容器内的工作目录为 /Initial。工作目录是指在容器中运行命令时默认的目录。如果该目录不存在,WORKDIR 会创建它。
COPY ./target/project-user .将本地系统中的 ./target/project-user 文件复制到 Docker 容器中的当前工作目录(即 /Initial)中。
COPY ./config/config-docker.yaml . 将本地系统中的 ./config/config-docker.yaml 文件复制到 Docker 容器的当前工作目录(/Initial)中。此文件通常用于存储容器中应用的配置文件。
RUN mkdir config && mv config-docker.yaml config/config.yaml ,首先在在容器的当前工作目录中创建一个名为 config 的新目录。然后mv config-docker.yaml config/config.yaml:将之前复制到容器中的 config-docker.yaml 文件重命名为 config/config.yaml 并移动到新创建的 config 目录中。
EXPOSE 8080 8881 告知 Docker 容器将暴露端口 8080 和 8881,意味着容器运行时,这些端口将会被开放,并允许主机或其他容器与之通信。需要注意的是,EXPOSE 仅是一个声明,它不会自动将端口映射到主机上,实际的端口映射需要通过 docker run -p 或 docker-compose.yml 配置来完成。
ENTRYPOINT ["./project-user"] 指定容器启动时的默认命令。ENTRYPOINT 设置容器运行时的入口点,容器启动后,会执行 ./project-user 这个命令。通常,ENTRYPOINT 用来指定容器的主进程。在这里,./project-user 是容器内的一个可执行文件,它会在容器启动时运行。
然后我们需要把原来config文件复制一份改为config-docker.yaml文件,并且需要修改配置代码。原本我们的server地址是127.0.0.1,这是本地回环地址,任何绑定在 127.0.0.1 上的服务只能在本地机器上访问,不能从其他机器或者网络中访问
需要改为0.0.0.0,绑定到 0.0.0.0 上的服务将接受来自所有网络接口(包括外部网络接口)的请求。这意味着服务不仅能接受本地机器的请求,还能接受来自其他机器或容器的请求。
server:name: "project-user"addr: "0.0.0.0:8080"
zap:debugFileName: "/logs/debug/project-debug.log"infoFileName: "/logs/info/project-info.log"warnFileName: "/logs/error/project-error.log"maxSize: 500,maxAge: 28,MaxBackups: 3
redis:host: "redis6"port: 6379password: ""db: 0
grpc:addr: "0.0.0.0:8881"name: "user"version: "1.0.0"weight: 2
etcd:addrs:- "etcd3:2379"
也就是说,在 Docker 容器中,通常容器中的服务是通过 容器的网络接口 与其他容器或主机进行通信的。如果你将应用绑定到 127.0.0.1,那么它将只能接受来自容器内部(即容器的网络栈)或者本地机器的请求,而不能接受外部请求。这对多容器应用或需要外部访问的服务(如 Web 服务、gRPC 服务等)会构成问题。
同时还要对redis和etcd的容器名设定好,已经起来的容器名称是redis6和etcd3,我们需要对应设置好。
并且在docker-compoose.yaml的文件下,加入User相关配置。
Project-User:container_name: project-userimage: project-user:latestports:- 8080:8080- 8881:8881
然后再写一个run.bat的脚本,一起来打包运行。
chcp 65001
cd project-user
docker build -t project-user:latest .
cd ..
docker-compose up -d
chcp 65001 用于 设置命令行的字符编码 为 UTF-8(65001 是 UTF-8 编码的代码页)。
docker build -t project-user:latest .构建 Docker 镜像的命令。-t project-user:latest:这是为构建出来的 Docker 镜像指定一个标签(-t 参数),标签为 project-user:latest。latest 是镜像的版本标签,意味着这是最新版本的镜像。.:指的是当前目录(即 project-user 目录)。构建过程会查找当前目录下的 Dockerfile 文件,使用 Dockerfile 中的指令来构建镜像。
docker-compose up -d 也就是cd到上层目录之后,会根据当前目录下的 docker-compose.yml 文件来启动定义的服务。docker-compose.yml 文件通常包含一个或多个服务(如 Web 服务、数据库服务等)的配置。
然后我们来run这个bat脚本,然后等待运行即可。(这个过程需要魔法,不然会失败,这个点大家自行解决即可。)

嗯,魔法也不行,魔法只能pull,但是不能构建dockerfile,会一直提示报错,这里还需要添加docker的镜像地址。
{"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"registry-mirrors": ["https://docker.registry.cyou/","https://docker-cf.registry.cyou/","https://dockercf.jsdelivr.fyi/","https://docker.jsdelivr.fyi/","https://dockertest.jsdelivr.fyi/","https://mirror.aliyuncs.com/","https://dockerproxy.com/","https://mirror.baidubce.com/","https://docker.m.daocloud.io/","https://docker.nju.edu.cn/","https://docker.mirrors.sjtug.sjtu.edu.cn/","https://docker.mirrors.ustc.edu.cn/","https://mirror.iscas.ac.cn/","https://docker.rainbond.cc/","https://jq794zz5.mirror.aliyuncs.com"]}
这里我们在docker引擎里面设置即可。

现在再重新run.bat这个脚本,就可以构造我们user的镜像,并且运行全部的docker compose了。


这个时候我们也能看到user镜像了。

现在启动就可以不用通过本地goland用go run 命令启动服务了,已经在容器里面跑起来了。
通过命令docker logs -f project-user可以查看对应的docker容器日志。

然后在本地启动api服务,在前端发送请求,验证成功。

此时user容器的日志也已更新。

如果后续改动了代码,需要验证的话,步骤就是先运行命令build.bat命令,build对应的linux版本。也就是先编译Go程序为linux版本。
然后运行run.bat脚本,重新编译镜像并运行容器。这样等待重新生效即可。
后续如何在linux下查看占用的端口情况,这里有两个命令:
netstat -tulnpss -tuln
相关文章:
【GoTeams】-5:引入Docker
本文目录 1. Dokcer-compose回顾下Docker知识编写docker-compose.yaml运行docker 2. 部署go服务编写dockerfile 1. Dokcer-compose 这里简单先用一下win版本的Docker,后期开发好了部署的时候再移植到服务器下进行docker部署。 输入命令docker-compose version 就可…...
将自定义vue组件加载在Mapbox或Maplibre的marker和popup上
1. 使用场景 在开发WebGIS应用时,我们常需要将自定义UI组件与地图元素结合。本文介绍如何将Vue组件集成到Mapbox/Maplibre的Marker标记点和Popup弹窗中,实现动态交互式的地图功能。 2. 为什么需要特殊处理? 在常规开发中我们大多的处理是 …...
定时任务和分布式任务框架
文章目录 一 Spring Task1.@Scheduled注解介绍2 基本用法(1)使用@EnableScheduling修饰启动类(2)创建定时任务的类(3)fixedDelay(4)fixedRate(5)cron3 执行多个任务4 设置异步执行5 @Async使用自定义线程池6 缺点二 xxl-job介绍架构图与其他任务调度平台的比较运行调…...
GB28181视频监控流媒体平台LiveGBS如何自定义收流端口区间以便减少收流端口数或解决端口冲突问题
LiveGBS GB28181流媒体服务在接收视频的时候默认是使用30000-30249, webrtc流播放端口区间默认是UDP的30250-30500区间。有些网络环境不方便开放这么大的端口区间,下面介绍下如何修改配置这个区间。 从页面上修改这个区间,端口区间尽量设置大…...
rabbitmq-amqp事务消息+消费失败重试机制+prefetch限流
1. 安装和配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency><dependency> <groupId>com.fasterxml.jackson.core</groupId> <arti…...
Mac服务器上创建Docker并安装宝塔环境
1. 远程ssh登录服务器:ssh -o ProxyCommand"nc -X 5 -x 127.0.0.1:7890 %h %p" -i fenfaqianming.pem ec2-user54.254.XXX.XXX 2. mac服务器上需要安装Colima 3. brew install colima 4. colima start 5. colima autostart 创建mac服务器安装docker &…...
golang 从零单排 (一) 安装环境
1.下载安装 打开网址The Go Programming Language 直接点击下载go1.24.1.windows-amd64.msi 下载完成 直接双击下一步 下一步 安装完成 环境变量自动设置不必配置 2.验证 win r 输入cmd 打开命令行 输入go version...
康谋分享 | 3DGS:革新自动驾驶仿真场景重建的关键技术
随着自动驾驶技术的迅猛发展,构建高保真、动态的仿真场景成为了行业的迫切需求。传统的三维重建方法在处理复杂场景时常常面临效率和精度的挑战。在此背景下,3D高斯点阵渲染(3DGS)技术应运而生,成为自动驾驶仿真场景重…...
【够用就好008】开新坑自学esb32烧录进军物联网和嵌入式
见字如面,这里是AKA AIGC创意人竹相左边。 学习使用了三年的AI工具,现在最大的自信就是业余时间可以学习任何自己感兴趣的事,感觉手搓火箭也不是梦。 今天开个新坑,也是逐步探索想要进入的新世界。物联网(IoT&#…...
大白话JavaScript实现一个函数,将字符串中的每个单词首字母大写。
大白话JavaScript实现一个函数,将字符串中的每个单词首字母大写。 答题思路 理解需求:要写一个函数,它能接收一个字符串,然后把这个字符串里每个单词的第一个字母变成大写。分解步骤 拆分单词:一般单词之间是用空格隔…...
Go红队开发—格式导出
文章目录 输出功能CSV输出CSV 转 结构体结构体 转 CSV端口扫描结果使用CSV格式导出 HTML输出Sqlite输出nmap扫描 JSONmap转json结构体转jsonjson写入文件json编解码json转结构体json转mapjson转string练习:nmap扫描结果导出json格式 输出功能 在我们使用安全工具的…...
从零构建高可用MySQL自动化配置系统:核心技术、工具开发与企业级最佳实践
在现代企业级数据库管理中,手动配置 MySQL 已无法满足高效、稳定和可扩展的需求。本文从 MySQL 配置管理的核心原理 出发,深入剖析 自动化配置工具的架构设计、关键技术实现,并结合 企业级落地方案,帮助读者构建一套 高可用、智能化的 MySQL 自动化配置系统。无论是 DevOps…...
element-plus中table组件的使用
1、table组件的基本使用 注意: ①对象集合,要从后端查询。 ②prop是集合中的对象的属性名;label是表格表头的名称。 2、将性别一列的71转为男,72转为女 问题描述: 解决步骤: ①将el-table-column变成双标签…...
K8s 1.27.1 实战系列(三)安装网络插件
Kubernetes 的网络插件常见的有 Flannel 和 Calico ,这是两种主流的 CNI(容器网络接口)解决方案,它们在设计理念、实现方式、性能特征及适用场景上有显著差异。以下是两者的综合对比分析: 一、Flannel 和 Calico 1. 技术基础与网络实现 Flannel 核心机制:基于 Overlay …...
Java基础回顾 Day4
多线程相关 runnable接口实现,解决单继承的问题,因为继承Thread类就不能继承其他类了 Callable接口的特点是满足线程需要返回值和抛出异常的情况 在创建线程后的任何时候都可以重新设置,线程已经创建,可以使用 Thread.setPrior…...
Go加spy++隐藏窗口
最近发现有些软件的窗口就像狗皮膏药一样,关也关不掉,一点就要登录,属实是有点不爽了。 窗口的进程不能杀死,但是窗口我不想要。思路很简单,用 spy 找到要隐藏的窗口的句柄,然后调用 Windows 的 ShowWindo…...
Windows CMD 命令大全(综合开发整理版)
CMD Windows CMD 命令大全(综合整理版)基础操作与文件管理类系统维护与配置类网络与连接类开发者常用命令CMD 黑窗口使用技巧1. **效率操作**2. **高级功能**3. **开发者高效技巧**注意事项**微软官方文档****其他实用资源****如何高效使用官方文档**Windows CMD 命令大全(综…...
网络安全通信架构图
🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 在安全通信里面我经常听到的2个东西就是SSL和TLS,这2个有什么区别呢?以及HTTPS是怎么通信的?包括对称加密、非对称加密、摘要、…...
当中国“智算心跳”与全球共振:九章云极DataCanvas首秀MWC 2025
3月3日,西班牙巴塞罗那,全球通信与科技领域的盛会“2025世界移动通信大会(MWC 2025)”正式拉开帷幕。中国人工智能基础设施领军企业九章云极DataCanvas公司以全球化战略视野与硬核技术实力,全方位、多维度地展示了在智…...
Clion快捷键、修改字体
文章目录 一、Clion快捷键1.撤销:crtl Z2.重做:crtl shift Z3.删除该行:crtl Y4.多行后退:选中多行 Tab5.多行缩进:选中多行 shift Tab 二、修改注释的斜体 一、Clion快捷键 1.撤销:crtl Z 2.重做…...
基于PySide6的CATIA零件自动化着色工具开发实践
引言 在汽车及航空制造领域,CATIA作为核心的CAD设计软件,其二次开发能力对提升设计效率具有重要意义。本文介绍一种基于Python的CATIA零件着色工具开发方案,通过PySide6实现GUI交互,结合COM接口操作实现零件着色自动化。该方案成…...
在Uniapp中实现特殊字符弹出框并插入输入框
在开发Uniapp项目时,我们经常会遇到需要用户输入特殊字符的场景。为了提升用户体验,我们可以封装一个特殊字符弹出框,用户点击键盘图标后弹出该字符集,选择字符后自动插入到输入框中。本文将详细介绍如何实现这一功能。 1. 功能概…...
golang dlv调试工具
golang dlv调试工具 在goland2022.2版本 中调试go程序报错 WARNING: undefined behavior - version of Delve is too old for Go version 1.20.7 (maximum supported version 1.19) 即使你go install了新的dlv也无济于事 分析得出Goland实际使用的是 Goland安装目录下dlv 例…...
深入解析 BitBake 日志机制:任务调度、日志记录与调试方法
1. 引言:为什么 BitBake 的日志机制至关重要? BitBake 是 Yocto 项目的核心构建工具,用于解析配方、管理任务依赖,并执行编译和打包任务。在 BitBake 构建过程中,日志记录机制不仅用于跟踪任务执行情况,还…...
数据结构链表的C++实现
在C中实现链表是一种常见的练习,有助于理解指针和动态内存分配的概念。下面是一个简单的单向链表(Singly Linked List)的实现示例,包括基本的操作如插入、删除和遍历。 单向链表 (Singly Linked List) 实现 1. 定义节点结构 首…...
《原型链的故事:JavaScript 对象模型的秘密》
原型链(Prototype Chain) 是 JavaScript 中实现继承的核心机制。每个对象都有一个内部属性 [[Prototype]](可以通过 __proto__ 访问),指向其原型对象。每个对象都有一个原型, 原型本身也是一个对象…...
Linux 配置静态 IP
一、简介 在 Linux CentOS 系统中默认动态分配 IP 地址,每次启动虚拟机服务都是不一样的 IP,因此要配置静态 IP 地址避免每次都发生变化,下面将介绍配置静态 IP 的详细步骤。 首先先理解一下动态 IP 和静态 IP 的概念: 动态 IP…...
【Python 数据结构 10.二叉树】
目录 一、二叉树的基本概念 1.二叉树的定义 2.二叉树的特点 3.特殊的二叉树 Ⅰ、斜树 Ⅱ、满二叉树 Ⅲ、完全二叉树 Ⅳ、完全二叉树和满二叉树的区别 4.二叉树的性质 5.二叉树的顺序存储 Ⅰ、完全二叉树 Ⅱ、非完全二叉树 Ⅲ、稀疏二叉树 6.二叉树的链式存储 7.二叉树的遍历概念…...
SwanLab简明教程:从萌新到高手
目录 1. 什么是SwanLab? 1.1 核心特性 2. 安装SwanLab 3. 登录SwanLab账号(云端版) 4. 5分钟快速上手 更多案例 5. SwanLab功能组件 5.1 图表视图 5.2 表格视图 5.3 硬件监控 5.4 环境记录 5.5 组织协同 6. 训练框架集成 6.1 基…...
SQLiteStudio:一款免费跨平台的SQLite管理工具
SQLiteStudio 是一款专门用于管理和操作 SQLite 数据库的免费工具。它提供直观的图形化界面,简化了数据库的创建、编辑、查询和维护,适合数据库开发者和数据分析师使用。 功能特性 SQLiteStudio 提供的主要功能包括: 免费开源,可…...
