Docker镜像之Docker Compose讲解
文章目录
- 1 docker-compose
- 1.1 compose编排工具简介
- 1.2 安装docker-compose
- 1.3 编排启动镜像
- 1.4 haproxy代理后端docker容器
- 1.5 安装socat 直接操作socket控制haproxy
- 1.6 compose中yml 配置指令参考
- 1.6.1 简单命令
- 1.6.2 build
- 1.6.3 depends_on
- 1.6.4 deploy
- 1.6.5 logging
- 1.6.6 network_mode
- 1.6.7 secrets
1 docker-compose
1.1 compose编排工具简介
Compose
是用于定义和运行多容器 Docker
应用程序的工具。通过 Compose
,可以使用 YML
文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML
文件配置中创建并启动所有服务
Compose
使用的三个步骤:
- 使用
Dockerfile
定义应用程序的环境 - 使用
docker-compose.yml
定义构成应用程序的服务,这样它们可以在隔离环境中一起运行 - 最后,执行
docker-compose up
命令来启动并运行整个应用程序
1.2 安装docker-compose
安装docker-compose
# 下载pip软件
yum install -y python2-pip
# 下载 docker-compose
pip install docker-compose
国内开启pip 下载加速:http://mirrors.aliyun.com/help/pypi
mkdir ~/.pip/
cat > ~/.pip/pip.conf <<'EOF'
[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
EOF
1.3 编排启动镜像
1、创建文件目录
[root@docker01 ~]# mkdir /opt/my_wordpress/
[root@docker01 ~]# cd /opt/my_wordpress/
2、编写编排文件
[root@docker01 my_wordpress]# vim docker-compose.yml
version: '3'
services:db:image: mysql:5.7volumes:- /data/db_data:/var/lib/mysqlrestart: alwaysenvironment:MYSQL_ROOT_PASSWORD: somewordpressMYSQL_DATABASE: wordpressMYSQL_USER: wordpressMYSQL_PASSWORD: wordpresswordpress:depends_on:- dbimage: wordpress:latestvolumes:- /data/web_data:/var/www/htmlports: - "8000:80"restart: alwaysenvironment:WORDPRESS_DB_HOST: db:3306WORDPRESS_DB_USER: wordpressWORDPRESS_DB_PASSWORD: wordpress
3、启动
启动方法:docker-compose up
后台启动方法:docker-compose up -d
4、浏览器上访问http://10.0.0.100:8000
进行wordpress的安装即可
1.4 haproxy代理后端docker容器
1、修改编排脚本
[root@docker01 my_wordpress]# cat docker-compose.yml
version: '3'
services:db:image: mysql:5.7volumes:- /data/db_data:/var/lib/mysqlrestart: alwaysenvironment:MYSQL_ROOT_PASSWORD: somewordpressMYSQL_DATABASE: wordpressMYSQL_USER: wordpressMYSQL_PASSWORD: wordpresswordpress:depends_on:- dbimage: wordpress:latestvolumes:- /data/web_data:/var/www/htmlports: - "80"restart: alwaysenvironment:WORDPRESS_DB_HOST: db:3306WORDPRESS_DB_USER: wordpressWORDPRESS_DB_PASSWORD: wordpress
2、同时启动两台wordpress
[root@docker01 my_wordpress]# docker-compose scale wordpress=2
WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.
Starting mywordpress_wordpress_1 ... done
Creating mywordpress_wordpress_2 ... done
3、安装haproxy
[root@docker01 ~]# yum install haproxy -y
4、修改haproxy配置文件
关于配置文件的详细说明,参考:https://www.cnblogs.com/MacoLee/p/5853413.html
[root@docker01 ~]#cp /etc/haproxy/haproxy.cfg{,.bak}
[root@docker01 ~]# vim /etc/haproxy/haproxy.cfg
globallog127.0.0.1 local2chroot /var/lib/haproxypidfile /var/run/haproxy.pidmaxconn 4000user haproxygroup haproxydaemonstats socket /var/lib/haproxy/stats level admin #支持命令行控制
defaultsmode httplog globaloption httplogoption dontlognulloption http-server-closeoption forwardfor except 127.0.0.0/8option redispatchretries 3timeout http-request 10stimeout queue1mtimeout connect 10stimeout client 1mtimeout server 1mtimeout http-keep-alive 10stimeout check 10smaxconn 3000
listen statsmode httpbind 0.0.0.0:8888stats enablestats uri /haproxy-status stats auth admin:123456
frontend frontend_www_example_combind 10.0.0.100:8000mode httpoption httploglog globaldefault_backend backend_www_example_com
backend backend_www_example_comoption forwardfor header X-REAL-IPoption httpchk HEAD / HTTP/1.0balance roundrobinserver web-node1 10.0.0.100:32768 check inter 2000 rise 30 fall 15server web-node2 10.0.0.100:32769 check inter 2000 rise 30 fall 15
5、启动haproxy
systemctl start haproxy
systemctl enable haproxy
6、使用浏览器访问hapeoxy监听的8000端口可以看到负载的情况
7、使用浏览器访问 http://10.0.0.100:8888/haproxy-status
可以看到后端节点的监控状况,
1.5 安装socat 直接操作socket控制haproxy
1、安装软件
yum install socat.x86\_64 -y
2、查看帮助
[root@docker01 web_data]# echo "help"|socat stdio /var/lib/haproxy/stats
3、下线后端节点
echo "disable server backend_www_example_com/web-node2"|socat stdio /var/lib/haproxy/stats
4、上线后端节点
echo "enable server backend_www_example_com/web-node3"|socat stdio /var/lib/haproxy/stats
5、编写php测试页,放到/data/web_data下,在浏览器中访问可以查看当前的节点
[root@docker01 web_data]# vim check.php
<html><head><title>PHP测试</title></head><body><?php echo '<p>Hello World </p>'; ?><?php echo "访问的服务器地址是:"."<fontcolor=red>".$_SERVER['SERVER_ADDR']."</font>"."<br>";echo"访问的服务器域名是:"."<fontcolor=red>".$_SERVER['SERVER_NAME']."</font>"."<br>";?></body>
</html>
1.6 compose中yml 配置指令参考
1.6.1 简单命令
version
:指定本yml
依从的compose
哪个版本制定的cap_add,cap_drop
:添加或删除容器拥有的宿主机的内核功能cgroup_parent
:为容器指定父 cgroup 组,意味着将继承该组的资源限制command
:覆盖容器启动的默认命令container_name
:指定自定义容器名称,而不是生成的默认名称devices
:指定设备映射列表dns
:自定义 DNS 服务器,可以是单个值或列表的多个值dns_search
:自定义 DNS 搜索域。可以是单个值或列表entrypoint
:覆盖容器默认的 entrypointenv_file
:从文件添加环境变量。可以是单个值或列表的多个值environment
:添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 Falseexpose
:暴露端口,但不映射到宿主机,只被连接的服务访问。extra_hosts
:添加主机名映射。类似 docker client --add-hosthealthcheck
:用于检测 docker 服务是否健康运行image
:指定容器运行的镜像。
以下格式都可以:- image: redis
- image: ubuntu:14.04
- image: tutum/influxdb
- image: example-registry.com:4000/postgresql
- image: a4bc65fd # 镜像id
restart
no
:是默认的重启策略,在任何情况下都不会重启容器。always
:容器总是重新启动。on-failure
:在容器非正常退出时(退出状态非0),才会重启容器。unless-stopped
:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
security_opt
:修改容器默认的 schema 标签。
security-opt:- label:user:USER # 设置容器的用户标签- label:role:ROLE # 设置容器的角色标签- label:type:TYPE # 设置容器的安全策略标签- label:level:LEVEL # 设置容器的安全等级标签
stop_grace_period
:指定在容器无法处理SIGTERM
(或者任何stop_signal
的信号),等待多久后发送 SIGKILL 信号关闭容器。默认的等待时间是 10 秒
stop_grace_period: 1s # 等待 1 秒
stop_grace_period: 1m30s # 等待 1 分 30 秒
stop_signal
:设置停止容器的替代信号。默认情况下使用 SIGTERM 。
以下示例,使用 SIGUSR1 替代信号 SIGTERM 来停止容器。
stop_signal: SIGUSR1
sysctls
:设置容器中的内核参数,可以使用数组或字典格式
sysctls:net.core.somaxconn: 1024net.ipv4.tcp_syncookies: 0sysctls:- net.core.somaxconn=1024- net.ipv4.tcp_syncookies=0
tmpfs
:在容器内安装一个临时文件系统。可以是单个值或列表的多个值。
tmpfs: /runtmpfs:- /run- /tmp
ulimits
:覆盖容器默认的 ulimit
ulimits:nproc: 65535nofile:soft: 20000hard: 40000
volumes
:将主机的数据卷或着文件挂载到容器里
version: "3.7"
services:db:image: postgres:latestvolumes:- "/localhost/postgres.sock:/var/run/postgres/postgres.sock"- "/localhost/data:/var/lib/postgresql/data"
1.6.2 build
build
:指定为构建镜像上下文路径
其中可选项:
context
:上下文路径。dockerfile
:指定构建镜像的Dockerfile
文件名。args
:添加构建参数,这是只能在构建过程中访问的环境变量。labels
:设置构建镜像的标签。target
:多层构建,可以指定构建哪一层
例如 webapp 服务,指定为从上下文路径 ./dir/Dockerfile 所构建的镜像:
version: "3.7"
services:webapp:build: ./dir
或者,作为具有在上下文指定的路径的对象,以及可选的 Dockerfile 和 args:
version: "3.7"
services:webapp:build:context: ./dirdockerfile: Dockerfile-alternateargs:buildno: 1labels:- "com.example.description=Accounting webapp"- "com.example.department=Finance"- "com.example.label-with-empty-value"target: prod
1.6.3 depends_on
depends_on
:设置依赖关系
docker-compose up
:以依赖性顺序启动服务。在以下示例中,先启动 db 和 redis ,才会启动 web。docker-compose up SERVICE
:自动包含SERVICE
的依赖项。在以下示例中,docker-compose up web
还将创建并启动 db 和 redis。docker-compose stop
:按依赖关系顺序停止服务。在以下示例中,web 在 db 和 redis 之前停止
version: "3.7"
services:web:build: .depends_on:- db- redisredis:image: redisdb:image: postgres
注意:web 服务不会等待 redis db 完全启动 之后才启动。
1.6.4 deploy
指定与服务的部署和运行有关的配置。只在 swarm 模式下才会有用
version: "3.7"
services:redis:image: redis:alpinedeploy:mode:replicatedreplicas: 6endpoint_mode: dnsrrlabels: description: "This redis service label"resources:limits:cpus: '0.50'memory: 50Mreservations:cpus: '0.25'memory: 20Mrestart_policy:condition: on-failuredelay: 5smax_attempts: 3window: 120s
可以选参数:
endpoint_mode
:访问集群服务的方式。endpoint_mode
: vip
Docker 集群服务一个对外的虚拟 ip。所有的请求都会通过这个虚拟 ip 到达集群服务内部的机器。- endpoint_mode: dnsrr
DNS 轮询(DNSRR)。所有的请求会自动轮询获取到集群 ip 列表中的一个 ip 地址。
labels
:在服务上设置标签。可以用容器上的 labels(跟 deploy 同级的配置) 覆盖 deploy 下的 labels。mode
:指定服务提供的模式。replicated
:复制服务,复制指定服务到集群的机器上。global
:全局服务,服务将部署至集群的每个节点。
replicas
:mode
为replicated
时,需要使用此参数配置具体运行的节点数量。resources
:配置服务器资源使用的限制,例如上例子,配置 redis 集群运行需要的 cpu 的百分比 和 内存的占用。避免占用资源过高出现异常。restart_policy
:配置如何在退出容器时重新启动容器。condition
:可选 none,on-failure 或者 any(默认值:any)。delay
:设置多久之后重启(默认值:0)。max_attempts
:尝试重新启动容器的次数,超出次数,则不再尝试(默认值:一直重试)。window
:设置容器重启超时时间(默认值:0)。
rollback_config
:配置在更新失败的情况下应如何回滚服务。parallelism
:一次要回滚的容器数。如果设置为0,则所有容器将同时回滚。delay
:每个容器组回滚之间等待的时间(默认为0s)。failure_action
:如果回滚失败,该怎么办。其中一个 continue 或者 pause(默认pause)。monitor
:每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h
)(默认为0s)。max_failure_ratio
:在回滚期间可以容忍的故障率(默认为0)。order
:回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认 stop-first )。
update_config
:配置应如何更新服务,对于配置滚动更新很有用。parallelism
:一次更新的容器数。delay
:在更新一组容器之间等待的时间。failure_action
:如果更新失败,该怎么办。其中一个 continue,rollback 或者pause (默认:pause)。monitor
:每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)。max_failure_ratio
:在更新过程中可以容忍的故障率。order
:回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认stop-first)
1.6.5 logging
服务的日志记录配置
driver
:指定服务容器的日志记录驱动程序,默认值为json-file。有以下三个选项
driver: "json-file"
driver: "syslog"
driver: "none"
仅在 json-file
驱动程序下,可以使用以下参数,限制日志得数量和大小。
logging:driver: json-fileoptions:max-size: "200k" # 单个文件大小为200kmax-file: "10" # 最多10个文件
当达到文件限制上限,会自动删除旧得文件。
syslog 驱动程序下,可以使用 syslog-address 指定日志接收地址。
logging:driver: syslogoptions:syslog-address: "tcp://192.168.0.42:123"
1.6.6 network_mode
设置网络模式
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
networks:配置容器连接的网络,引用顶级 networks 下的条目 。
services:some-service:networks:some-network:aliases:- alias1other-network:aliases:- alias2
networks:some-network:# Use a custom driverdriver: custom-driver-1other-network:# Use a custom driver which takes special optionsdriver: custom-driver-2
aliases
:同一网络上的其他容器可以使用服务名称或此别名来连接到对应容器的服务。
1.6.7 secrets
存储敏感数据,例如密码:
version: "3.1"
services:mysql:image: mysqlenvironment:MYSQL_ROOT_PASSWORD_FILE: /run/secrets/my_secretsecrets:- my_secretsecrets:my_secret:file: ./my_secret.txt
相关文章:

Docker镜像之Docker Compose讲解
文章目录1 docker-compose1.1 compose编排工具简介1.2 安装docker-compose1.3 编排启动镜像1.4 haproxy代理后端docker容器1.5 安装socat 直接操作socket控制haproxy1.6 compose中yml 配置指令参考1.6.1 简单命令1.6.2 build1.6.3 depends_on1.6.4 deploy1.6.5 logging1.6.6 ne…...

蓝桥杯30天真题冲刺|题解报告|第三十天
大家好,我是snippet,今天是我们这次蓝桥省赛前一起刷题的最后一天了,今天打了一场力扣周赛,前面3个题都是有思路的,第三个题只过了一半的案例,后面看完大佬们的题解彻悟,下面是我今天的题解 目录…...
配置 Git Husky 代码提交约束
介绍 Git Husky 是一个可以管理 Git Hooks 的工具,它可以帮助我们在代码提交的时候运行脚本,以确保代码提交符合特定的规范和约定。 在 Git 中,允许在操作特定的事件时执行特定的脚本,这些事件我们称之为 Hooks。 Git Husky 利…...

IntelliJ IDEA 2023.1 最新变化
文章目录IntelliJ IDEA 2023.1 最新变化一. 主要更新1. 新 UI 增强 测试版启用新 UI2. 在项目打开时更早提供 IDE 功能3. 更快地导入 Maven 项目4.后台提交检查5. Spring Security 匹配器和请求映射的导航 Ultimate二. 用户体验1. 全 IDE 缩放2. 保存多个工具窗口布局的选项3. …...

stm32学习笔记-9 USART串口
9 USART串口 文章目录9 USART串口9.1 串口通信协议9.2 stm32的片上外设-USART9.3 USART收发相关实验9.3.1 实验1:串口发送9.3.2 实验2:移植printf函数9.3.3 实验3:串口发送接收9.4 USART串口数据包9.5 USART数据包相关实验9.5.1 实验1&#x…...

【蓝桥杯】每日四道编程题(两道真题+两道模拟)| 第四天
专栏: 蓝桥杯——每日四道编程题(两道真题两道模拟) “蓝桥杯就要开始了,这些题刷到就是赚到” ₍ᐢ..ᐢ₎♡ 另一个专栏: 蓝桥杯——每日四道填空题(两道真题两道模拟题) 目录 专栏࿱…...
大家有没有时候觉得,递归,分治,回溯,傻傻分不清楚?
递归,分治,回溯的定义 递归(Recursion) 递归是一种解决问题的方法,它将一个问题分解成一个或多个较小的相同类型的子问题,然后通过递归调用自身来解决这些子问题。递归通常包括一个基本情况(b…...

Java 8 - Lambda 表达式
1. 函数式接口 当一个接口中只有一个非 default 修饰的方法,这个接口就是一个函数式接口用 FunctionalInterface 标注 1)只有一个抽象方法 FunctionalInterface public interface MyInterface {void print(int x); } 2)只有一个抽象方法和…...
【Ruby学习笔记】4.Ruby 类和对象及类案例
前言 本章介绍Ruby的类和对象及类案例。 Ruby 类和对象 Ruby 是一种完美的面向对象编程语言。面向对象编程语言的特性包括: 数据封装数据抽象多态性继承 这些特性将在 面向对象的 Ruby 中进行讨论。 一个面向对象的程序,涉及到的类和对象。类是个别…...

分享一个计算表格内单元格合并的工具,支持行合并、列合并等常见场景
分享一个计算表格内单元格合并的工具,支持行合并、列合并等常见场景 效果图 安装 cj-toolkit-x/table-cell-merger 插件 npm i cj-toolkit-x/table-cell-merger使用方法 import {TableCellMerger} from "cj-toolkit-x/table-cell-merger" // 创建一个单…...

CUDA编程(三):Hello world
CUDA编程(三):Hello worldCUDA编程Hello worldCUDA编程 CUDA是Compute Unified Device Architecture的缩写,由英伟达公司2007年开始推出,初衷是为GPU增加一个易用的编程接口,让开发者无需学习复杂的着色语…...

二十九、String的不可变性
一、String的基本特性 1.String:字符串,使用一对“”引起来表示 1)String s1 “hallo”; //字面量的定义方式 2)String 说 new String(“hello”)’ 2.String声明为final的,不可被继承。 3.String实现了Serialzable接口:表示字符串是支持序列化的。实…...
TCP服务器如何使用select处理多客户连接
TCP是一种面向连接的通信方式,一个TCP服务器难免会遇到同时处理多个用户的连接请求的问题,本文用一个简化的实例说明如何在一个TCP服务器程序中,使用select处理同时出现的多个客户连接,文章给出了程序源代码,本文假定读者已经具备了基本的socket编程知识,熟悉基本的服务器…...

python字符编码
目录 ❤ 前言 文本编辑器存取文件的原理(nodepad,pycharm,word) python解释器执行py文件的原理 ,例如python test.py 总结 ❤ 什么是字符编码? ASCII MBCS Unicode ❤ 字符编码的发展史 阶段一: 现代计算…...
面向对象练习题(8)
目录 第一题 第二题 第三题 第一题 思路分析: 1.Person p new Student();这就是一个向上转型,让父类的引用指向子类的对象,但是向上转型不能访问子类的属性和方法 我们在写代码时看的是编译类型 在运行是看的是运行类型 p.run(); p.eat(); …...
重构类关系-Extract Interface提炼接口八
重构类关系-Extract Interface提炼接口八 1.提炼接口 1.1.使用场景 若干客户使用类接口中的同一子集,或者两个类的接口有部分相同。将相同的子集提炼到一个独立接口中。 类之间彼此互用的方式有若干种。“使用一个类”通常意味用到该类的所有责任区。另一种情况…...
vivo手机各系列简介和拆解
Vivo是中国智能手机制造商,其产品线较多,主要包括以下系列: X系列:X系列是Vivo的高端智能手机系列,注重出色的拍照性能、高质量的音效和高端的设计。该系列主要面向追求高质量拍照和高端体验的用户。 V系列࿱…...

Redis:redis通用命令;redis常见数据结构;redis客户端;redis的序列化
一、redis命令 1.redis通用命令 Redis 通用命令是一些 Redis 下可以作用在常用数据结构上的常用命令和一些基础的命令 常见的命令有: keys 查看符合模板的所有key,不建议在生产环境设备上使用,因为keys会模式匹配所有符合条件的key&#…...
Java新特性
switch Java中switch的三种用法方式 JAVA中的switch Java switch 中如何使用枚举? 注解 天天用注解你真的知道怎么用吗?Java中的注解及其实现原理。 JAVA注解 JAVA注解 基础 集合判空 求和 Java8之List求和 JAVA中对list使用stream对某个字段求和…...
Java_Spring:8. Spring 中 AOP 的细节
目录 1 说明 2 AOP 相关术语 3 学习 spring 中的 AOP 要明确的事 4 关于代理的选择 1 说明 spring 的 aop通过配置的方式,实现上一章节的功能。 2 AOP 相关术语 Joinpoint(连接点): 所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring …...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

6.9-QT模拟计算器
源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...
Python学习(8) ----- Python的类与对象
Python 中的类(Class)与对象(Object)是面向对象编程(OOP)的核心。我们可以通过“类是模板,对象是实例”来理解它们的关系。 🧱 一句话理解: 类就像“图纸”,对…...