Docker-Compose单机多容器应用编排与管理

前言

Docker Compose 作为 Docker 生态系统中的一个重要组件,为开发人员提供了一种简单而强大的方式来定义和运行多个容器化应用。本文将介绍 Docker Compose 的使用背景、优劣势以及利用 Docker Compose 简化应用程序的部署和管理。

目录

一、Docker Compose 简介

1. 使用背景

2. 简介

3. Docker Compose 分层介绍

4. Docker Compose 优势 

5. Docker Compose 缺点

二、Docker Compose 部署

1. 环境安装

1.1 下载 Docker Compose 并安装

2. YAML 文件格式及编写注意事项

2.1 概述

2.2 特点

2.3 注意事项

2.4 数据结构

2.4.1 对象映射(字典)

2.4.2 序列数组(列表)

2.4.3 布尔值

2.4.4 混合结构

2.4.5 示例

3. 配置常用字段

4. 常用命令

5. 文件结构

6. 构建 nginx 镜像

6.1 准备依赖文件

6.2 编写配置文件 docker-compose.yaml

6.3 启动 yaml 文件中定义的服务

6.4 查看容器基本信息

6.5 访问服务

三、多容器应用编排

1. 修改 yaml 文件

2. 删除 nginx 容器、镜像、网络

3. tomcat 工作目录以及相关文件准备

4. 启动服务

5. 访问页面


一、Docker Compose 简介

1. 使用背景

尽管 Dockerfile 是定义单个容器镜像所必需的工具,但它也存在一些缺点,特别是在多容器应用程序的情况下,如:编排过程复杂且难以维护、Dockerfile 并不直接支持容器间的依赖关系管理、Dockerfile 主要关注于单个容器的构建;

Docker Compose 能够弥补这些缺点,通过一个简单的 YAML 文件,它提供了一种更高级的抽象,能够轻松管理多个相关联的容器,并定义它们之间的依赖关系,从而简化了多容器应用程序的编排和管理过程。

2. 简介

Docker Compose 负责实现在单机上完成容器集群编排的管理,是单机多应用容器编排;在生产环境中,适用于纵向扩展,从而降低成本。当需要进行多主机(跨节点)的集群管理和容器编排时,则需要用到 Docker Swarm 工具。在实际使用中,两者也可以结合使用,比如使用 Docker Compose 来定义应用程序的服务组成,然后利用 Docker Swarm 在集群中进行部署和管理。

3. Docker Compose 分层介绍

Docker Compose 将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container):

  • Docker-Compose 运行目录下的所有文件(docker-compose.yml,extends 文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名,比如 LNMP; 
  • 一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖;比如:ngixn、myaql、php;
  • 一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡,比如 Consul。

即使用 Docker Compose 可以完成多个 docker run 的所有操作。

Compose 允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。包括:容器的数量、容器之间的依赖关系、环境变量、端口映射以及数据卷等设置;

然后,用户使用 docker-compose 命令根据指定配置模板文件的配置来启动和管理容器集群。

4. Docker Compose 优势 

Docker Compose简化了多容器应用的管理与编排,提供了一种简单且强大的方式来定义和运行多个相关联的容器,有助于提高开发、部署和管理效率。

① 简化多容器应用编排:Docker Compose允许用户通过一个简单的YAML文件定义和运行多个相关联的容器;

② 一键部署:通过Docker Compose文件,用户可以将整个应用程序的配置信息集中在一个地方,实现一键式的部署,极大地简化了部署流程;

③ 微服务架构支持:对于采用微服务架构的应用程序,Docker Compose能够帮助开发人员管理各个微服务之间的依赖关系,简化了微服务架构下的应用部署和管理。

5. Docker Compose 缺点

① 适用范围受限:Docker Compose 更适用于单机或者开发测试环境下的应用部署,对于生产环境中复杂的多主机集群管理需求,其能力相对较弱。

② 缺乏自动恢复机制:当容器发生故障时,Docker Compose 本身并没有提供完善的自动恢复机制,需要额外的监控系统或工具来实现容器级别的自动恢复。

尽管存在这些缺点,但在适当的使用场景下, Docker Compose 仍然是一个非常有价值的容器编排工具。

二、Docker Compose 部署

1. 环境安装

1.1 下载 Docker Compose 并安装

[root@localhost ~]# curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# `uname -s`-`uname -m`也可以写成$(uname -s) 和 $(uname -m):分别会自动替换为你的系统类型(如:Linux)和机器架构(如:x86_64),确保你下载的是适合你系统的版本。
# curl -L:这部分表示使用curl命令进行下载,并且使用-L参数来跟随重定向
# -o /usr/local/bin/docker-compose: 表示将下载的文件保存为/usr/local/bin目录下的docker-compose文件
[root@localhost bin]# pwd
/usr/local/bin
[root@localhost bin]# ls
docker-compose
[root@localhost bin]# chmod +x /usr/local/bin/docker-compose
[root@localhost bin]# ll
总用量 16636
-rwxr-xr-x. 1 root root 17031592 4月  29 16:08 docker-compose
[root@localhost bin]# docker-compose --version     # 查看版本
docker-compose version 1.25.0-rc4, build 8f3c9c58

2. YAML 文件格式及编写注意事项

2.1 概述

YAML(YAML Ain't Markup Language) 是一种人类可读的数据序列化格式,常用于配置文件和数据传输。它以缩进、换行和符号结构来表示数据,具有简洁、清晰的特点。YAML 旨在成为一个易于阅读和编写的数据格式,同时也适合机器解析和生成。它使用空格缩进来表示层级关系,不需要显式的标记符号(如 XML 或 JSON 中的尖括号或大括号),这使得它更加直观和易读。

YAML 官方网站:The Official YAML Web Site

2.2 特点

  • YAML 数据结构通过缩进来表示
  • 连续的项目通过减号来表示
  • 键值对用冒号分隔
  • 数组用中括号 [ ] 括起来,[ ]通常用于表示列表(数组)
  • hash 用花括号 { } 括起来,{ }通常用于表示字典(键值对)

2.3 注意事项

  • 大小写敏感
  • 通过缩进表示层级关系
  • 不支持制表符 tab 键缩进,只能使用空格缩进
  • 缩进的空格数目不重要,只要相同层级左对齐,通常开头缩进 2 个空格
  • 用 # 号注释
  • 符号字符后缩进1个空格,如冒号:  逗号 ,    横杠 -    
  • 如果包含特殊字符用单引号 ('') 引起来会作为普通字符串处理,双引号 (" ") 特殊字符作为本身想表示的意思,name:"Hi,\nTom"
  • 以 .yml 或者 .yaml 结尾
  • 以 --- 开始,以 ... 结束,但开始和结束标志都是可选的

2.4 数据结构

2.4.1 对象映射(字典)

字典在 YAML 中使用键值对的形式表示,使用冒号 : 将键和值分隔开,键值之间需要有一个空格。字典可以包含嵌套的字典或者列表作为值。

  • 键值对的字典
  • 对象映射指的是在docker-compose.yml文件中定义的服务和它们的配置
  • 这些对象映射定义了每个服务的配置,以及如何运行这些服务
name: Using Ansible
code: D1234
#符号字符“: ”后必须缩进1个空格
#转换为 python 的 Dict
#{'name': 'Using Ansibel','code': 'D1234'}
2.4.2 序列数组(列表)

在 YAML 中,列表使用短横线 - 表示,后面跟着一个空格。列表可以包含任意类型的元素,例如字符串、数字、布尔值或者其他嵌套的列表。

  • 一组按次序排列的列表
  • 序列数组是一种数据结构,用于表示一组有序的元素
  • 在docker-compose.yml文件中,序列数组通常用于定义多个相似的配置项,例如多个服务或多个环境变量
- red
- green
- blue
# 以上的值假如转换成 python 的 List 会是这样:
# ['red', 'green', 'blue']
2.4.3 布尔值
  • 布尔值可以用来表示真假值
  • 在 YAML 中,以下是表示布尔值的方式:

① true 和 false:分别表示真和假
② yes 和 no:分别表示真和假
③ on 和 off:分别表示真和假
④ 1 和 0:分别表示真和假 

debug: true
debug: false
2.4.4 混合结构

但在日常生产中,往往需要的数据结构会特别复杂,有可能会是字符串、列表、字典的组合形式。这里举一个例子:学校里是以班级为单位。我们去使用列表和字典的形式去描述一个班级的组成。

class:
  - name: stu1
    num: 001
  - name: stu2
    num: 002
  - name: stu3
    num: 003
#{'class': [{'name': 'stul, 'num': 1},{'name': 'stu2', 'num': 2), ...]}
2.4.5 示例
# yaml 格式
languages:       #序列的映射
  - Java
  - Golang
  - Python
websites:        #映射的映射
  cpu: 2
  memory: 1024M
  swap: 2048M
  disk: 60G 

键:{值}

# Json 格式
{
  languages: [
    'Java',
    'Golang',
    'Python'	
  ],
  resources: {
    cpu: '2',
    memory: '1024M',
    swap: '2048M',
    disk: '60G'
  }
}


Baidu:
  www.baidu.com
wangyi: www.163.com
tengxun: www.qq.com

3. 配置常用字段

字段描述
build指定 Dockerfile 文件名,要指定Dockerfile文件需要在build标签的子级标签中使用dockerfile标签指定
dockerfile构建镜像上下文路径
context可以是 dockerfile 的路径,或者是指向 git 仓库的 url 地址
image指定镜像
command执行命令,覆盖容器启动后默认执行的命令
container_name指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale指定容器数量
deploy指定部署和运行服务相关配置,只能在 Swarm 模式使用
environment添加环境变量
networks加入网络,引用顶级networks下条目
network_mode设置容器的网络模式,如 host,bridge,...
ports暴露容器端口,与 -p 相同,但端口不能低于 60
volumes挂载一个宿主机目录或命令卷到容器,命名卷要在顶级 volumes 定义卷名称
volumes_from从另一个服务或容器挂载卷,可选参数 :ro 和 :rw,仅版本 '2' 支持
hostname容器主机名
sysctls在容器内设置内核参数
links连接到另外一个容器,- 服务名称[:服务别名]
privileged用来给容器root权限,注意是不安全的,true | false
restart设置重启策略,no,always,nounless-st-failure,oped
no,默认策略,在容器退出时不重启容器。
on-failure,在容器非正常退出时(退出状态非0),才会重启容器。
on-failure:3,在容器非正常退出时重启容器,最多重启3次。
always,在容器退出时总是重启容器。
unless-stopped,在容器退出的容器时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了。
depends_on在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,可能会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出。depends_on标签用于解决容器的依赖、启动先后的问题。
php:
  depends_on:
    - apache
    - mysql

4. 常用命令

字段描述
build重新构建服务
ps列出容器
up创建和启动容器
exec在容器里面执行命令
scale指定一个服务容器启动数量
top显示容器进程
logs查看容器输出
down删除容器、网络、数据卷和镜像
stop/start/restart停止/启动/重启服务

5. 文件结构

[root@localhost nginx]# tree /opt/compose_nginx/
/opt/compose_nginx/
├── nginx
│   ├── Dockerfile
│   └── nginx-1.12.0.tar.gz
└── wwwroot
    └── index.html

6. 构建 nginx 镜像

6.1 准备依赖文件

① 创建工作目录,添加相关文件 

[root@localhost ~]# mkdir -p /opt/compose_nginx/{nginx,wwwroot}
[root@localhost ~]# cd /lnmp/nginx/
[root@localhost nginx]# cp Dockerfile nginx-1.12.0.tar.gz /opt/compose_nginx/nginx/
[root@localhost nginx]# cd /opt/compose_nginx/nginx
[root@localhost nginx]# ls
Dockerfile  nginx-1.12.0.tar.gz

② 修改 Dockerfile 文件 

[root@localhost nginx]# vim Dockerfile
FROM centos:7
MAINTAINER nginx image <fql>
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.0.tar.gz /usr/local/src/
WORKDIR /usr/local/src/nginx-1.12.0
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make -j 4 && make install
ENV PATH /usr/local/nginx/sbin:$PATH
EXPOSE 80
EXPOSE 443
ENTRYPOINT [ "/usr/local/nginx/sbin/nginx", "-g", "daemon off;" ]

③ 添加 web 文件 

[root@localhost nginx]# echo "<h1>welcome</h1>" > /opt/compose_nginx/wwwroot/index.html

6.2 编写配置文件 docker-compose.yaml

version: '2'                 # 指定了Docker Compose文件的版本,2:多机编排;3:多+单
services:                    # 定义了要运行的服务
  nginx:                     # 服务的名称,表示要运行一个Nginx容器
    container_name: web10    # 这指定了容器的名称为web10
    hostname: nginx          # 容器的主机名为nginx
    build:                   # 使用本地的Dockerfile构建镜像
      context: ./nginx       # 指定了Dockerfile的构建上下文为当前目录下的./nginx文件夹
      dockerfile: Dockerfile # 指定了要使用的Dockerfile的名称为Dockerfile
    ports:                   # 定义了将容器内部端口映射到主机上的端口
      - 100:80               # 将容器的80端口映射到主机的100端口
      - 101:443              # 将容器的443端口映射到主机的101端口
    networks:                # 定义了容器连接的网络
      lnmp:                  # 这是网络的名称
        ipv4_address: 172.20.0.10       # 指定了容器在lnmp网络中的IPv4地址为172.20.0.10
    volumes:                 # 将主机上的目录挂载到容器内部的目录
      - ./wwwroot:/usr/local/nginx/html # 将主机上的./wwwroot目录挂载到容器内的/usr/local/nginx/html目录
networks:                    # 定义了Docker网络
  lnmp:                      # 这是网络的名称
    driver: bridge           # 指定了网络的模式为bridge
    ipam:                    # 定义了IP地址管理
      config:                # 这是配置IP地址的部分
        - subnet: 172.20.0.0/16         # 指定了网络的子网为172.20.0.0/16

6.3 启动 yaml 文件中定义的服务

[root@localhost compose_nginx]# ls   # 必须在docker-compose.yaml所在目录执行此命令
docker-compose.yaml  nginx  wwwroot
[root@localhost compose_nginx]# docker-compose -f docker-compose.yaml up -d
# -f, --file FILE:使用特定的compose模板文件,默认为 docker-compose.yaml
# -p, --project-name NAME:指定项目名称,默认使用目录名称
# -d:在后台运行

6.4 查看容器基本信息

[root@localhost compose_nginx]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                                                        NAMES
b57da6f20339   compose_nginx_nginx   "/usr/local/nginx/sb…"   17 minutes ago   Up 17 minutes   0.0.0.0:100->80/tcp, :::100->80/tcp, 0.0.0.0:101->443/tcp, :::101->443/tcp   web10
[root@localhost compose_nginx]# docker inspect b57da6f20339
                    "Gateway": "172.20.0.1",
                    "IPAddress": "172.20.0.10",

6.5 访问服务

访问192.168.190.108:100

三、多容器应用编排

nginx + tomcat docker-compose编排

1. 修改 yaml 文件

[root@localhost compose_nginx]# vim docker-compose.yaml
version: '3'
services:
  nginx:
    container_name: web10
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - 100:80
      - 101:443
    networks:
      tm:
        ipv4_address: 172.20.0.10
    volumes:
      - ./wwwroot:/usr/local/nginx/html
  tomcat:
    hostname: tomcat
    build:
      context: ./tomcat
      dockerfile: Dockerfile
    ports:
      - 8080:8080
    networks:
      tm:
        # ipv4_address: 172.20.0.20
networks:
  tm:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/16

2. 删除 nginx 容器、镜像、网络

[root@localhost compose_nginx]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                                                        NAMES
b57da6f20339   compose_nginx_nginx   "/usr/local/nginx/sb…"   31 minutes ago   Up 31 minutes   0.0.0.0:100->80/tcp, :::100->80/tcp, 0.0.0.0:101->443/tcp, :::101->443/tcp   web10
[root@localhost compose_nginx]# docker rm -f b57da6f20339
b57da6f20339

[root@localhost compose_nginx]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
compose_nginx_nginx   latest    9b349cf24e1c   32 minutes ago   569MB
php                   lnmp      d36e706ae5d6   25 hours ago     1.4GB
nginx                 lnmp      a6b0e83b8ff8   26 hours ago     569MB
mysql                 lnmp      2b328d4ecd04   30 hours ago     10.1GB
nginx                 latest    7383c266ef25   5 days ago       188MB
centos                7         eeb6ee3f44bd   2 years ago      204MB
[root@localhost compose_nginx]# docker rmi 9b349cf24e1c

[root@localhost compose_nginx]# docker network ls
NETWORK ID     NAME                 DRIVER    SCOPE
be4ecfaae8fa   bridge               bridge    local
05a4abf62706   compose_nginx_lnmp   bridge    local
52f938e47449   host                 host      local
d2b40d071ba3   mynetwork            bridge    local
8adfae2f9020   none                 null      local
[root@localhost compose_nginx]# docker network rm compose_nginx_lnmp
compose_nginx_lnmp

或者直接使用: docker-compose  -f  docker-compose-yml  down

删除容器、网络、数据卷、镜像 

3. tomcat 工作目录以及相关文件准备

192.168.190.107:
[root@localhost ~]# cd /opt
[root@localhost opt]# ls
apache      debian-7.0-x86-minimal.tar.gz  mysqld  nginx.conf  sshd       tomcat
containerd  docker-26.0.2.tgz              nginx   rh          systemctl
[root@localhost opt]# ls tomcat/
apache-tomcat-9.0.16.tar.gz  Dockerfile  jdk-8u291-linux-x64.tar.gz
[root@localhost opt]# scp -r tomcat/ 192.168.190.108:/opt/compose_nginx/

192.168.190.108:
[root@localhost compose_nginx]# ls
docker-compose.yaml  nginx  tomcat  wwwroot
[root@localhost compose_nginx]# cd tomcat/
[root@localhost tomcat]# ls
apache-tomcat-9.0.16.tar.gz  Dockerfile  jdk-8u291-linux-x64.tar.gz
[root@localhost tomcat]# cat Dockerfile 
FROM centos:7
MAINTAINER tomcat image <fql>
ADD jdk-8u291-linux-x64.tar.gz /usr/local/
WORKDIR /usr/local/
RUN mv jdk1.8.0_291 /usr/local/java
ENV JAVA_HOME /usr/local/java
ENV JRE_HOME ${JAVA_HOME}/jre
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
ENV PATH $JAVA_HOME/bin:$PATH
ADD apache-tomcat-9.0.16.tar.gz /usr/local/
WORKDIR /usr/local/
RUN mv apache-tomcat-9.0.16 /usr/local/tomcat
EXPOSE 8080
#CMD ["/usr/local/tomcat/bin/catalina.sh","run"]
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
CMD ["/usr/local/tomcat/bin/startup.sh","start"]

4. 启动服务

[root@localhost compose_nginx]# ls
docker-compose.yaml  nginx  tomcat  wwwroot
[root@localhost compose_nginx]# docker-compose -f docker-compose.yaml up -d
[root@localhost compose_nginx]# docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS          PORTS                                                                        NAMES
544dee4ad153   compose_nginx_tomcat   "/usr/local/tomcat/b…"   48 seconds ago   Up 47 seconds   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp                                    compose_nginx_tomcat_1
dd6bde2af9ee   compose_nginx_nginx    "/usr/local/nginx/sb…"   48 seconds ago   Up 47 seconds   0.0.0.0:100->80/tcp, :::100->80/tcp, 0.0.0.0:101->443/tcp, :::101->443/tcp   web10

5. 访问页面

访问192.168.190.108:8080

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构复习指导之串

文章目录 串 考纲内容 复习提示 1.串的定义和实现 1.1串的定义 1.2串的存储结构 1.2.1定长顺序存储表示 1.2.2堆分配存储表示 1.2.3块链存储表示 2.串的基本操作 拓展 知识回顾 串 考纲内容 字符串模式匹配 复习提示 本章是统考大纲第6章内容,采纳读者建议单独作为…

ActiveMQ 反序列化漏洞 (CVE-2015-5254)

一、漏洞描述 Apache ActiveMQ 是由美国阿帕奇&#xff08;Apache&#xff09;软件基金会开发的开源消息中间件&#xff0c;支持 Java 消息服务、集群、Spring 框架等。属于消息队列组件(消息队列组件&#xff1a;分布式系统中的重要组件&#xff0c;主要解决应用耦合、异步消息…

宽字符的来历:从ASCII到Unicode,C语言中的宽字符处理

目录 一、ASCII编码&#xff1a;字符世界的开篇 二、Unicode与宽字符的诞生 宽字符类型与宽字符串 三、C语言中的宽字符处理函数 四、宽字符与多字节字符 结语 在计算机科学的发展历程中&#xff0c;字符编码经历了从简单到复杂、从单一语言到全球多语种支持的演变过程。…

十大落地护眼灯有哪些?2024十大落地灯品牌排名

十大落地护眼灯有哪些&#xff1f;想要让孩子在舒适敞亮的光线下学习&#xff0c;不少家长都会给孩子选择入手落地灯&#xff0c;不过市面上却流传着落地灯品质恶劣的负面新闻。我是一名专业测评家居博主&#xff0c;终于搞清楚落地灯负面新闻的原因&#xff0c;其原因主要是因…

回顾python

回顾python 目录 回顾python 1.定义变量 2.分支控制结构 3.for循环 4.while 循环 5.类 面向对象 &#xff11;&#xff09;​方法的定义&#xff1a; &#xff12;&#xff09;类的定义&#xff1a; &#xff13;&#xff09;类的继承 1.定义变量 a23b"张三&quo…

【NOI-题解】1607. 两位数运算1020. 算算和是多少1029. 倒序输出一个四位整数1418. 求一个5位数的各个位之和1608. 三位数运算

文章目录 一、前言二、问题问题&#xff1a;1607. 两位数运算问题&#xff1a;1020. 算算和是多少问题&#xff1a;1029. 倒序输出一个四位整数问题&#xff1a;1418. 求一个5位数的各个位之和问题&#xff1a;1608. 三位数运算 三、感谢 一、前言 本章节主要讲解基本运算中的…

在线商城客服系统,多用户电商系统可API对接客服软件

在当今数字化时代&#xff0c;在线商城客服系统和多用户电商系统之间的无缝API对接已成为电商行业的重要趋势。这种整合为商家提供了更高效的客户服务和管理方式&#xff0c;提升了用户体验和业务效率。其中&#xff0c;商淘云电商客服系统作为一款强大的客服管理工具&#xff…

react props传参

props是父子传参的常用方法。 一、主要功能 1.传参 定义&#xff1a;父级组件向子级组件传递参数。 2.验证数据类型格式 定义&#xff1a;可以指定父组件传递过来数据为指定类型。 3.设置默认值 定义&#xff1a;在参数未使用时&#xff0c;直接默认为指定值。 二、实例代…

OpenSceneGraph

文章目录 关于 OpenSceneGraphScreenshots - OpenMW 关于 OpenSceneGraph 官网&#xff1a;https://openscenegraph.github.io/openscenegraph.io/github : https://github.com/openscenegraph/OpenSceneGraphClasses : https://podsvirov.github.io/osg/reference/opensceneg…

Android系统的硬件抽象层

硬件抽象层 Author: cpu_codeDate: 2020-07-12 22:20:34LastEditTime: 2020-07-13 22:52:02FilePath: \notes\android_bottom\hardware_abstraction_layer.mdGitee: https://gitee.com/cpu_codeGithub: https://github.com/CPU-CodeCSDN: https://blog.csdn.net/qq_44226094Gi…

后端如何处理接口的重复调用

首先是&#xff0c;原理在请求接口之前&#xff0c;使用过滤器拦截数据&#xff0c;来进行判断两次数据是否一致。 1.自定义注解 2.创建一个Handler处理器 3.RepeatSubmitInterceptor的实现类 4.过滤器的配置

thinkphp6 workerman无法使用框架Db/model等类库方法解决方案

thinkphp6 workerman无法使用框架Db/model相关操作解决 执行安装相关扩展 composer require webman/gateway-worker引入成功后编辑服务类文件,直接展示代码 <?phpnamespace app\server\controller;use GatewayWorker\BusinessWorker; use GatewayWorker\Gateway; use Gate…

从0到1手写注册中心Registry之核心接口设计

一. 数据模型 InstanceMeta用于描述服务实例的元信息&#xff1a; schema&#xff1a;比如httphost,&#xff1a;比如127.0.0.1port&#xff1a;比如8082context&#xff1a;比如midnight-rpcstatus&#xff1a;服务上下线&#xff0c;true/falseParameters: 服务携带的参数&…

React 第十一章 Dva

Dva 是一个基于 redux 和 redux-saga 的数据流方案&#xff0c;然后为了简化开发体验&#xff0c;dva 还额外内置了 react-router 和 fetch&#xff0c;所以也可以理解为一个轻量级的应用框架。 Dva 的本意&#xff0c;是将基于 React 技术栈中常用到的库集成到一起。当时&…

Django-admin组件

Django-admin组件 admin是django中提供的一套可视化工具&#xff1a;用于对ORM中定义的表进行增删改查。 1 概览 在django项目启动时&#xff0c;自动找到注册到admin中的所有model中定义的类&#xff0c;然后为这些类生成一系列的URL和视图函数&#xff0c;实现基本增删改查…

Pandas数据可视化 - Matplotlib、Seaborn、Pandas Plot、Plotly

可视化工具介绍 让我们一起探讨Matplotlib、Seaborn、Pandas Plot和Plotly这四个数据可视化库的优缺点以及各自的适用场景。这有助于你根据不同的需求选择合适的工具。 1. Matplotlib 优点: 功能强大&#xff1a;几乎可以用于绘制任何静态、动画和交互式图表。高度可定制&a…

【酱浦菌-爬虫项目】爬取学术堂宏观经济学论文原文

前言 首先给大家放出完整代码&#xff0c;然后下面就是用jupyter写的代码。实际上在写的时候用的是jupyter写的&#xff0c;因为感觉jupyter写的时候更加的流畅&#xff0c;每一步运行的细节都能保存下来&#xff0c;更方便学习理解。 完整代码&#xff1a; import os impo…

基于深度学习检测恶意流量识别框架(80+特征/99%识别率)

基于深度学习检测恶意流量识别框架 目录 基于深度学习检测恶意流量识别框架简要示例a.检测攻击类别b.模型训练结果输出参数c.前端检测页面d.前端训练界面e.前端审计界面&#xff08;后续更新了&#xff09;f.前端自学习界面&#xff08;自学习模式转换&#xff09;f1.自学习模式…

Spring管理第三方依赖

在开发中&#xff0c;我们常需要根据业务需求导入我们需要的第三方依赖包&#xff0c;本文主要以导入druid数据库来连接池为案例讲解有关spring管理第三方依赖 目录 纯注解文件注入 1.在pom.xml中导入依赖 2.在com.lcyy包下建立一个config包用于配置类的实现 3.在config包下…

2024年第十五届蓝桥杯江苏省赛回顾

呜呜呜~~~ 我在考完了后感觉自己直接炸了&#xff1a;好多学到的算法都没有用上&#xff0c;几乎所有的题目都是暴力的。。。 最后十几分钟对于一道dp算法终于有思路了&#xff0c;但是。。匆匆忙忙之间就是没有调试出来。&#xff08;还是交了一道暴力[旋风狗头]直接哭死~~&…