【Docker】Docker Compose(容器编排)
一、什么是 Docker Compose
docker-compose 是 Docker 官方的开源项目,使用 python 编写,实现上调用了 Docker 服务的 API 进行容器管理及编排,其官方定义为定义和运行多个 Docker 容器的应用。
docker-compose 中有两个非常重要的概念:
- 服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
- 项目(project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义,整个 docker-compose.yml 定义一个项目。
Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
通过 compose 可以方便的管理多个服务。
二、生活案例
docker compose 就像航母一样,有舰载机、防空导弹,舰载机、导弹就是一个个容器。
三、为什么要 Docker Compose
Docker 是一个轻量化的应用程序,Docker 官方推荐每个 Docker 容器中只运行一个进程。如果一个应用需要涉及到 MySQL、nginx 等环境, 那么就需要分别为应用、数据库和 nginx 创建单独的 docker 容器,然后再分别启动容器。
如果构建好 Docker 之后,每次启动应用都至少需要 docker run 三次或者写一些脚本来实现,这样会比较繁琐。另外,这些 docker 容器都是分散独立的,也不方便镜像管理。
既然这些 docker 容器都是为了同一个应用服务,就应该把它们放到一起,这就引出了 docker-compose 来解决这类型的问题。
四、Docker Compose 的安装
安装 docker 的时候,我已经安装了 docker-compose,安装的组件包名称为 docker-compose-plugin。
检查安装是否成功:
五、Docker Compose 的功能
1、使用步骤
Compose 使用的步骤:
- 使用 docker-compose.yml 定义构成应用程序的服务,这样它们就可以在隔离环境中一起运行。
- 执行 docker compose up 命令来启动并运行整个应用程序。
2、核心功能
Compose 具有管理应用程序整个生命周期的命令:
- 启动,停止和重建服务
- 查看正在运行的服务的状态
- 流式传输运行服务的日志输出
- 在服务上运行一次性命令
六、Docker Compose 使用场景
1、单主机部署
快速搭建一个单节点开发或者测试环境,方便使用。
2、不同环境隔离
通过指定 project 来运行不同的环境,实现隔离的目的。
七、Docker Compose 文件(docker-compose.yml)
1、文件语法版本
目前官方支持三个大版本, 即 Version 1、Version 2 及 Version 3, 其中 Version 1 已经被废弃掉了。当前最新的版本是 3.8,它支持的 Docker Engine 版本不得低于 19.03.0。后面的学习主要是基于 3.8 版本的 Compose file 语法进行讲解,其他版本的介绍可以参考:
https://docs.docker.com/compose/compose-file/compose-versioning/
2、文件基本结构及常见指令
version: "3.8" # 定义版本, 表示当前使用的 docker-compose 语法的版本services: # 服务, 可以存在多个
servicename: # 服务名字, 它也是内部 bridge 网络可以使用的 DNS name, 如果不是集群模式相当于 docker run 的时候指定的一个名称#集群(Swarm)模式是多个容器的逻辑抽象image: # 必选,镜像的名字command: # 可选,如果设置,则会覆盖默认镜像里的 CMD 命令environment: # 可选,等价于 docker container run 里的 --env 选项设置环境变量volumes: # 可选,等价于 docker container run 里的 -v 选项 绑定数据卷networks: # 可选,等价于 docker container run 里的 --network 选项指定网络ports: # 可选,等价于 docker container run 里的 -p 选项指定端口映射expose: # 可选,指定容器暴露的端口 build: #构建目录depends_on: #服务依赖配置env_file: #环境变量文件
servicename2:image: command: networks: ports:
servicename3:#...volumes: # 可选,等价于 docker volume create
networks: # 可选,等价于 docker network create
(1)常见字段格式语法
A. image
指定容器运行的镜像。
以下格式都可以:
image: redis
image: redis:5
image:
redis@sha256:0ed5d5928d4737458944eb604cc8509e245c3e19d02ad83935398
bc4b991aac7
image: library/redis
image: docker.io/library/redis
image: my_private.registry:5000/redis
B. command
覆盖容器启动的默认命令。
command: ["bundle", "exec", "thin", "-p", "3000"]
command: bundle exec thin -p 3000
C. entrypoint
覆盖容器默认的 entrypoint 。
entrypoint: /code/entrypoint.sh
也可以是以下格式:
entrypoint:- php- -d- zend_extension=/usr/local/lib/php/extensions/no-debug-nonzts-20100525/xdebug.so- -d- memory_limit=-1- vendor/bin/phpunit
D. environment
添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。
#map 语法
environment:RACK_ENV: developmentSHOW: "true"USER_INPUT:
#数组语法
environment:- RACK_ENV=development- SHOW=true- USER_INPUT
E. networks
指定容器运行的网络:
配置容器网络:
services:frontend:image: awesome/webappnetworks:- front-tier- back-tiermonitoring:image: awesome/monitoringnetworks:- adminbackend:image: awesome/backendnetworks:back-tier:aliases:- databaseadmin:aliases:- mysqlnetworks:front-tier:back-tier:admin:
配置网络驱动和子网信息:
services:frontend:image: awesome/webappnetworks:front-tier:ipv4_address: 172.16.238.10networks:front-tier:ipam:driver: defaultconfig:- subnet: "172.16.238.0/24"
F. volumes
将主机的数据卷或者文件挂载到容器里。
#短语法
services:db:image: postgres:latestvolumes:- "/localhost/postgres.sock:/var/run/postgres/postgres.sock"- "/localhost/data:/var/lib/postgresql/data"#完整语法
services:backend:image: awesome/backendvolumes:- type: volume#命名卷source: db-datatarget: /datavolume:nocopy: true#绑定卷- type: bindsource: /var/run/postgres/postgres.socktarget: /var/run/postgres/postgres.sockvolumes:db-data:
G. ports
指定端口映射。以下格式都可以:
#完整语法
ports:- target: 80host_ip: 127.0.0.1published: 8080protocol: tcpmode: host- target: 80host_ip: 127.0.0.1published: 8000-9000protocol: tcpmode: host
#短语法
ports:- "3000"- "3000-3005"- "8000:8000"- "9090-9091:8080-8081"- "49100:22"- "127.0.0.1:8001:8001"- "127.0.0.1:5000-5010:5000-5010"- "6060:6060/udp"
H. expose
暴露端口,但不映射到宿主机,只被连接的服务访问。
仅可以指定内部端口为参数:
expose:- "3000"- "8000"
I. build
指定为构建镜像上下文路径:
例如 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"
- context:上下文路径。
- dockerfile:指定构建镜像的 Dockerfile 文件名。
- args:添加构建参数,这是只能在构建过程中访问的环境变量。
- labels:设置构建镜像的标签。
J. 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
可以指定条件,healthy 需要配置 healthcheck 来完成。
services:web:build: .depends_on:db:condition: service_healthyredis:condition: service_startedredis:image: redisdb:image: postgres
health check 样例:
K. env_file
从文件添加环境变量。可以是单个值或列表的多个值。
env_file: .env
也可以是列表格式:
env_file:- ./common.env- ./apps/web.env- /opt/secrets.env
八、Docker Compose 命令清单
官网参考地址:https://docs.docker.com/compose/reference/
命令清单如下:
1、命令格式
对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。
docker-compose 命令的基本的使用格式为:
docker compose [OPTIONS] COMMAND [ARGS...]
2、常见选项说明
- -f,--file 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
- -p,--project-name 指定项目名称,默认将使用所在目录名称作为项目名。
3、常见命令说明
(1)up
该命令的作用十分强大,它会尝试自动完成包括构建镜像、(重新)创建服务、启动服务并关联服务相关容器的一系列操作,可以直接通过该命令来启动一个项目。
docker compose up [options] [SERVICE...]
- -d 在后台运行服务容器,推荐在生产环境下使用该选项。
- --force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用。
- --no-recreate 如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用。
(2)down
停止所有容器,并删除容器和网络。
docker compose down [options] [SERVICE...]
- -v,--volumes 删除容器同时删除目录映射。
(3)run
该命令可以在指定服务容器上执行相关的命令。
- -d:后台运行容器。
- --name NAME:为容器指定一个名字。
- --entrypoint CMD:覆盖默认的容器启动指令。
- -e KEY=VAL:设置环境变量值,可多次使用选项来设置多个环境变量。
- -u, --user="":指定运行容器的用户名或者 uid。
- --rm:运行命令后自动删除容器。
- -p,--publish=[]:映射容器端口到本地主机。
九、操作案例
1、Docker Compose 基本操作
(1)创建 compose 目录
(2)进入 prj15 目录,创建 docker-compose.yml 文件
(3)输入内容
(4)输入 docker config 会做检查
(5)创建首页目录,编辑首页内容
(6)启动服务
(7)通过页面访问
(8)停止服务
(9)启动服务
(10)删除服务
十、综合案例
1、Docker Compose 部署自定义服务
编写一个简单的案例,nginx 反向代理到我们的一个 springboot 微服务,微服务访问我们的 msyql 数据库查询用户信息。
(1)设计数据非常简单的一个表信息,写入两条数据,文件为 init.sq
数据初始化脚本:
(2)创建一个 springboot 应用,配置 maven 项目
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.8</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.bit</groupId><artifactId>demojdbc</artifactId><version>0.0.1-SNAPSHOT</version><name>demojdbc</name><description>demojdbc</description><properties><java.version>8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
(3)添加启动类
package com.bit.demojdbc;import org.springframework.boot.SpringApplication;
import
org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DemojdbcApplication {public static void main(String[] args) {SpringApplication.run(DemojdbcApplication.class, args);}
}
(4)配置数据库信息
注意本地测试的时候红色部分调整为 ip 地址,而我们实际的服务使用的 mysql 的一个服务名称。
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://mysql:3306/test
spring.datasource.username=root
spring.datasource.password=root
(5)配置用户控制器,简单配置,不再去涉及 mapper 那些内容通过 jdbc 直接完成操作
package com.bit.demojdbc;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/user")
public class UserController {@AutowiredJdbcTemplate jdbcTemplate;@RequestMapping("/list")@ResponseBodypublic Object Users(){return jdbcTemplate.queryForList("select * from users");}
}
(6)编译打包
(7)进入打包的目录,本地测试正常启动
PS D:\src\bit\demojdbc\target> java -jar .\demojdbc-0.0.1-SNAPSHOT.jar. ____ _ __ _ _/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\\/ ___)| |_)| | | | | || (_| | ) ) ) )' |____| .__|_| |_|_| |_\__, | / / / /
==========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.7.8)2023-04-26 00:21:41.578 INFO 23736 --- [ main] com.bit.demojdbc.DemojdbcApplication : Starting DemojdbcApplication v0.0.1-SNAPSHOT using Java 1.8.0_202 on maxhou with PID 23736 (D:\src\bit\demojdbc\target\demojdbc-0.0.1-SNAPSHOT.jar started by facea in D:\src\bit\demojdbc\target)
2023-04-26 00:21:41.580 INFO 23736 --- [ main] com.bit.demojdbc.DemojdbcApplication : No active profile set, falling back to 1 default profile: "default"
2023-04-26 00:21:43.877 INFO 23736 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2023-04-26 00:21:43.886 INFO 23736 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2023-04-26 00:21:43.886 INFO 23736 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.71]
2023-04-26 00:21:43.989 INFO 23736 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2023-04-26 00:21:43.989 INFO 23736 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2356 ms
2023-04-26 00:21:44.671 INFO 23736 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2023-04-26 00:21:44.687 INFO 23736 --- [ main] com.bit.demojdbc.DemojdbcApplication : Started DemojdbcApplication in 3.457 seconds (JVM running for 3.804)
(8)本地测试正常访问
(9) 创建目录
(10)编写 docker-compose.yml
(11)创建工程目录和卷目录
(12)将 nginx 的反向代理配置 xyl.conf 放入到 ./nginx/conf.d
其中内容为:
(13)将数据库初始化文件 init.sql 放入到 ./mysql/initdb 目录
(14)将应用 jar 包放入到 ./app 目录
(15)启动项目
(16)浏览器访问 nginx
可以看到用户信息正常返回:
到此完成了我们的 nginx 服务,后台服务和数据的完整的一个应用。
2、Docker Compose 部署 WordPress
(1)什么是 WordPress
WordPress 是使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设属于自己的网站,也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一款个人博客系统,并逐步演化成一款内容管理系统软件,它是使用 PHP 语言和 MySQL 数据库开发的,用户可以在支持 PHP 和 MySQL 数据库的服务器上使用自己的博客。
WordPress 有许多第三方开发的免费模板,安装方式简单易用。不过要做一个自己的模板,则需要你有一定的专业知识。比如你至少要懂的标准通用标记语言下的一个应用 HTML 代码、CSS、PHP 等相关知识。
WordPress 官方支持中文版,同时有爱好者开发的第三方中文语言包,如 wopus 中文语言包。WordPress 拥有成千上万个各式插件和不计其数的主题模板样式。
(2)部署 WordPress
A. 编写 Docker Compose
B. 运行站点
C. 访问 web 页面
D. 配置参数,点击安装
E. 登录
G. 进入后台
H. 删除,释放空间
十一、常见问题
1、up、run 和 start 之间有什么区别
通常我们想要 docker compose up,用于 up 启动或重新启动 docker-compose.yml。
- 在默认的 “附加” 模式下,会看到来自所有容器的所有日志。
- 在 “分离” 模式(-d)中,启动容器后 Compose 退出,但容器继续在后台运行。
该 docker compose run 命令用于运行 “一次性” 或 “临时” 任务。它需要您要运行的服务名称,并且只为正在运行的服务所依赖的服务启动容器。用于 run 运行测试或执行管理任务,例如从数据卷容器中删除或添加数据。该 run 命令的作用类似于 docker run -ti 它打开容器的交互式终端并返回与容器中进程的退出状态匹配的退出状态。
docker compose start 命令仅对重新启动先前创建但已停止的容器有用,它从不创建新容器。
2、如何在同一主机上运行 Compose 文件的多个副本
Compose 使用项目名称为项目的所有容器和其他资源创建唯一标识符。要运行项目的多个副本,请使用 -p 命令行选项或 COMPOSE_PROJECT_NAME 环境变量设置自定义项目名称。
3、可以控制服务启动顺序吗?
可以控制启动顺序。通过依赖指定,并且可以配合 healthcheck 等健康检查成功以后再启动。
相关文章:

【Docker】Docker Compose(容器编排)
一、什么是 Docker Compose docker-compose 是 Docker 官方的开源项目,使用 python 编写,实现上调用了 Docker 服务的 API 进行容器管理及编排,其官方定义为定义和运行多个 Docker 容器的应用。 docker-compose 中有两个非常重要的概念&…...

嵌入式初学-C语言-二九
C语言编译步骤 预处理编译汇编链接 什么是预处理 预处理就是在源文件(如.c文件)编译之前,所进行的一部分预备操作,这部分操作是由预处理程序自动完成,当源文件在编译时,编译器会自动调用预处理指令的解析…...

0x03 ShowDoc 文件上传漏洞(CNVD-2020-26585)复现
参考:ShowDoc文件上传漏洞(CNVD-2020-26585)_showdoc漏洞-CSDN博客 一、fofa 搜索使用该工具的网站 网络空间测绘,网络空间安全搜索引擎,网络空间搜索引擎,安全态势感知 - FOFA网络空间测绘系统 "S…...

【大模型从入门到精通34】开源库框架LangChain 利用LangChain构建聊天机器人1
这里写目录标题 利用LangChain构建聊天机器人介绍介绍对话型聊天机器人构建环境环境变量和平台设置 加载文档和创建向量存储高级检索技术对话上下文和记忆纳入聊天历史会话缓冲内存 构建对话检索链环境设置与API密钥配置选择合适的语言模型版本Q&A系统设置 利用LangChain构…...

魔法糖果工厂
LYA 是一家魔法糖果工厂的新任管理员。工厂生产的魔法糖果有七种颜色,分别用字母 a、b、c、d、e、f、g 表示。这些糖果被排列在一条传送带上,准备进行包装。为了提高效率,工厂引进了一台智能包装机器人。这个机器人可以按照预设的指令序列来包…...

NVM安装管理node.js版本(简单易懂)
一、前言 1.1 简介 NVM(Node Version Manager)是 node.js 的版本管理器,用 shell 脚本切换机器中不同版本的 nodejs。 Nodejs为什么需要多个版本? 有经验的开发者可能遇到过,某个依赖包明确nodejs是某个版本&#…...

第1章-04-Chrome及Chrome Driver安装及测试
🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年CSDN全站百大博主。 🏆数年电商行业从业经验,历任核心研发工程师&am…...

【Linux】SSH 隧道转发场景搭建
ssh建立隧道转发 A设备:没有公网IP地址的本地设备,如本地内网服务器(需要能通公网) B设备:有公网IP地址的服务器,可以是云服务器 C设备:终端设备,想通过公网服务器B访问到设备A 要…...

前后端部署-服务器linux中安装数据库Mysql8
一、登录Xshell7 && 开放Mysql 3306端口, Redis 6379 端口 二、手动部署MySQL数据库 1.运行以下命令,更新YUM源。 sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm 2.运行以下命令,安装My…...

如何使用jd-gui对springboot源码进行分析
背景: 最近在学习springboot的过滤器和拦截器,想了解一下过滤器和拦截器是怎么匹配URL的,在网上搜了半天都搜不到针对源码的,网上大部分内容都是说怎么配置过滤器和拦截器,怎么使用,并没有对源码进行分析的…...

原来ChatGPT是这么评价《黑神话:悟空》的啊?
《黑神话:悟空》一经上线便迅速吸引了全球的目光,成为了今日微博热搜榜上的焦点话题。作为中国首款现象级的中国3A大作,它的发布无疑引发了广泛的关注与讨论。 《黑神话:悟空》,这款3A国产游戏大作,由国内游…...

C语言第17篇
1.在C语言中,全局变量的存储类别是_________. A) static B) extern C) void D) register 提示:extern adj.外来的 register n.登记表,v.登记 提示与本题无关 2.在一个C源程序文件中,要定义一个只允许本源文件中所有函数使用的全局变…...

Springboot+vue实现webScoket
需求 因为在做的项目中,有多个网站登录同一个用户,故想在某一个页面登录或者退出的时候,对其他页面进行相同的操作 跨域,跨页面,跨项目,跨标签页,https 因为一开始不像麻烦后端,所以…...

CSS知识点详解:display+float
display:浮动 1.block:使元素呈现为块级元素,可设置宽高 display: block; 特点:使元素呈现为块级元素,即该元素会以新行开始,占据整行的宽度,即使其宽度未满。 例子: 2.inline&a…...

ant design pro v6 如何做好角色管理
先上图: 整个角色管理是如何做的吗? 首先你要处理后端,要先把角色存到用户那。 这是用户管理部分的内容: 可以看到一个用户是有多个角色的。 看到没有,存的是数组 数组的是一个 role 对象 role 对象是这样…...

C++ 设计模式(3. 抽象工厂模式)
抽象工厂模式也是一种创建型设计模式,提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类【引用自大话设计模式第15章】基本结构 抽象工厂模式包含多个抽象产品接口,多个具体产品类,一个抽象工厂接口和多个具体…...

【PHP入门教程】PHPStudy环境搭建+HelloWorld运行
文章目录 PHP 的历史PHP 的用途PHP 的特点和优势PHP 环境搭建环境准备安装window 安装CentOS / Ubuntu / Debian 安装 第一个Hello World使用Apache服务运行命令行运行代码 PHP 的历史 PHP(Hypertext Preprocessor)超文本预处理器是一种开源的通用脚本语…...

补 0 输出。
题目描述 输入一个整数,请在整数前面补 00 补足 88 位后输出。 输入描述 输入一行包含一个整数 nn。 输出描述 输出补00后的整数。 输入输出样例 示例1 输入 2021输出 00002021示例2 输入 202110输出 00202110 import os import sys# 请在此输入您的代码 si…...

因为嫌吵,在自己家也用上了远程控制电脑
加班嘛,赶稿嘛,参加工作的人都懂那种无形的压力和烦躁。 因为家里空间有限,我平常都是直接在客厅用台式电脑加急改写方案,但今天晚上家里来了几位叔,他们边吃饭边聊着秦始皇的话题,都70多分钟了,…...

vue---echarts环形图
1、完整代码直接可以cv <template><div id"main1"></div> </template><script> import * as echarts from echarts; // import { mapState } from vuex; // import { Alarm_Device } from ../utils/api.js; export default {name: P…...

克服编程挫折:从Bug的迷宫中寻找出口与面对算法保持冷静的策略
在编程学习的道路上,挫折感无疑是每个学习者都必须面对的挑战之一。它们仿佛是一座座高墙,阻挡我们前进的步伐。然而,正如许多有经验的编程高手所证明的那样,挫折并不是终点,而是成长和进步的催化剂。本文将分享一些有…...

Flink之SQL client使用案例
Flink的执行模式有以下三种: 前提是我们已经开启了yarnsession的进程,在下图中可以看到启动的id也就是后续任务需要通过此id进行认证,以及任务分配的master主机。 这里启动时候会报错一个ERROR:org.apache.flink.shaded.curator.org.apache…...

实际开发中的模块化开发 - 应用到直播间
实际开发中的模块化开发 - 模块管理(以直播间为例)-CSDN博客 引言 在前面的两篇博客中,我们已经介绍了直播模块的简单结构,创建了模块管理器和模块抽象基类,并且通过模块化实现了两个小业务功能模块。接下来…...

EmguCV学习笔记 VB.Net 第5章 图像变换
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访…...

【初阶数据结构】顺序表与链表的比较(附题)
目录 一、顺序表和链表的区别(其他链表存在缺陷,比较意义不大,这里用带头双向循环链表与顺序表进行比较) 1.1插入、扩容与随机访问 二、缓存利用率的比较 2.1前置知识 详解及补充知识(本文仅为比较顺序表及链表&am…...

git-20240822
目录 初始化仓库 Git init Git init project --bare 查看提交的记录 git log --prettyoneline 查看当前git远程库地址 git remote -v 查看详细提交记录 git log 撤出暂存区的文件 git reset HEAD file(.代表全部文件) 提交数据到远程仓库 git config --global push.…...

【时时三省】c语言例题----华为机试题< 数字颠倒>
目录 1,题目 描述 输入描述: 输出描述: 示例1 2,代码...

【前缀和算法】--- 一维和二维前缀和模板
Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: 算法Journey 本文开始,博主开始讲解有关前缀和的算法,本篇博客我们先来了解一下有关前缀和的两个模板。 🏠 一维前缀和模板 &…...

有些信息注定会丢失
智能在分析问题、做出决策时,总是希望获取尽可能多的信息,以此更加准确地决策。然而,很遗憾的是,有一些信息注定会丢失,不可能获取完全的信息,而且即使能够获取,智能也不能完全利用。 这一点与…...

c#中Task.Run 和使用 Task 构造函数创建任务的区别
Task.Run 和使用 Task 构造函数创建任务是两种不同的方法,它们在某些方面有显著的区别: 启动方式: Task.Run 是一个静态方法,它立即启动一个任务并在后台执行指定的工作。它通常用于快速启动一个简单的后台任务。使用 Task 构造函数创建任务&…...