Docker 简单使用及安装常用软件

一、Docker 安装、配置与卸载

1.1、Docker 安装

# 1.安装gcc环境
yum -y install gcc gcc-c++ && \# 2. 卸载docker旧版本(可能之前有安装)
yum -y remove docker docker-common docker-selinux docker-engine && \# 3. 安装依赖的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2 && \# 4. 设置stable仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo && \# 5. 更新yum软件包索引
yum makecache fast && \# 6. 安装Docker社区版
yum -y install docker-ce && \# 7. 启动Docker
systemctl start docker && \# 8. 测试是否安装成功
docker version

1.2、Docker 卸载

# 1. 卸载docker之前需要先停止
systemctl stop docker && \# 2. 卸载docker
yum -y remove docker-ce && \# 3. 清除残留文件
rm -rf /var/lib/docker

1.3、配置 Docker 仓库的国内镜像加速

VAR_PATH_ETC_DOCKER_DIR="/etc/docker" && \
VAR_PATH_ETC_DOCKER_DAEMON_JSON="$VAR_PATH_ETC_DOCKER_DIR/daemon.json" && \# 1. 创建存放配置文件的文件夹
mkdir -p $VAR_PATH_ETC_DOCKER_DIR && \# 2. 创建配置文件
# 配置文件的具体内容因人而异,需要登录[阿里云开发者平台](https://dev.aliyun.com/search.html)进行查看
cat << EOF > $VAR_PATH_ETC_DOCKER_DAEMON_JSON
{"registry-mirrors": ["xxx"]
}
EOF# 重新加载配置文件
systemctl daemon-reload && \# 重启docker
systemctl restart docker

二、Docker 命令

2.1、命令分类

子命令分类子命令
Docker 环境信息info、version
容器生命周期管理Create、exec、kill、pause、.restart、rm、run、start、stop、unpause
镜像仓库命令login、logout、pull、push、search
镜像管理build、images、import、load、rmi、save、tag、commit
容器运维操作attach、export、inspect、port、ps、rename、stats、top、wait、cp、diff、update
容器资源管理volume、network
系统日志信息events、history、logs

Docker 命令结构图

2.2、Docker 进程命令

命令作用
systemctl start docker启动 docker 服务
systemctl stop docker停止 docker 服务
systemctl status docker查看 docker 服务状态
systemctl restart docker重启 docker 服务
systemctl enable docker设置 docker 开机自启动

2.3、Docker 容器命令

容器命令作用
docker run ...基于镜像创建容器并启动(第一次使用,不能重复创建同名容器)
docker rm <容器名>删除容器
docker start <容器名或容器id>启动容器
docker stop <容器名或容器id>停止容器
docker kill <容器名或容器id>杀死容器
docker ps查看当前运行中的容器
docker ps -a查看所有容器
docker exec -it <容器名> /bin/bash进入到容器中
docker stop <容器id>停止容器
docker inspect <容器名>查看容器信息(IP 地址等)
docker port <容器名>查看容器的端口映射信息
docker attach <容器名>用途未知
docker commit <容器名>将正在运行的容器制作成一个镜像

docker commit 命令使用示例

2.4、Docker 镜像命令

镜像命令作用
docker images列出本地机器中的镜像
docker search <镜像名>在 docker hub 中进行查找镜像
docker pull <镜像名>:<版本号>下载镜像,没指定版本号时默认为最新版
docker rmi -f <镜像名>:<版本号>强制删除镜像

三、Docker 容器数据卷

可以在 IDEA 中通过 service 来调用出下面的面板

image-20231115233408685

3.1、数据卷

数据卷出现的目的是为了解决以下的两个问题:

  • Docker容器删除后,在容器中产生的数据也会随之消失
  • Docker容器和外部机器,Docker容器和Docker容器之间不可以直接交换文件

如果想要进行多个docker容器之间的数据交换,可以将多个容器挂载到同一个数据卷(共享文件夹)

3.2、目录挂载

数据卷在宿主机(Linux)上,挂载到 Docker 容器中。类似文件在U盘上,然后U盘接入到电脑中(挂载)。电脑重装系统并不会删除 U 盘中的数据,类似删除 Docker 容器并不会删除数据卷中的数据。

文件挂载通过 -v 指定参数 docker run -v <宿主机目录>:<docker容器内目录> --privileged=true

--privileged=true 表示 docker

额外的功能:

  • 限制容器内的目录只能读取,在上面的命令中添加 :ro(read only),构成 -v <宿主机目录>:<容器内目录>:ro

3.3、容器之间的数据卷继承

期望不同容器之间的挂载目录保持相同,可以使用数据卷继承. 需要注意的是,继承的是文件挂载的规则

--volumes-from <希望保持相同挂载规则的容器名>

数据卷的继承可以在不知道其它容器具体的挂载规则的情况下,复用该规则。继承的挂载规则是独立的,子容器的挂载规则不会因为父容器的删除而消失。

四、Dockfile

镜像原理

镜像是一层层文件堆叠而成,镜像是只读的,而容器是镜像上面在堆叠一层可写的文件,对于镜像生成的原始容器的操作都记录在容器层对应的文件中?

制作镜像

commit 制作镜像

对运行中的容器进行修改,然后通过 docker commit <容器名> <指定镜像名>:<指定版本号> 也可以创建镜像。这种方式的优点是简单,缺点在于不是自动化的,不适合复现。例如,在写博客教程时,读者需要按照博主相同的操作流程对 docker 容器进行修改配置,不能通过一行代码直接得到相同的环境。所以后面主要介绍通过 Dockerfile 来创建镜像。

通过 commit 方式制作的镜像不会打包挂载的数据卷吗?如果数据卷是容器和宿主机独立的两份,为什么这里又不会打包挂载的数据卷呢?数据卷是容器和宿主机共享的,正因为数据卷是宿主机的文件夹挂载在容器中(搞清楚谁挂载在谁上很重要,类比 U 盘插入电脑,数据卷挂载在容器中),数据卷不属于docker的文件系统,因此容器被打包成镜像时不会打包挂载的数据卷。

Dockerfile 制作镜像

Dockerfile 文件中的每一行构建一层镜像,这就是RUN尽可能一个模块写在一起并使用 && 进行连接的原因?

# FROM: 指定基础镜像
FROM centos:7
# MAINTAINER: 指定作者信息
MAINTAINER xiong# ENV: 设置环境变量
ENV USERNAME root
ENV PASSWORD root# RUN: 执行shell命令
RUN yum install -y vim
RUN apt-get update && apt-get install -y \pythonpython-pip
RUN pip install numpy# ADD: 将宿主机文件复制到容器中
ADD hello.py /tmp/hello.py# WORKDIR: 指定工作目录
WORKDIR /# EXPOSE: 暴露端口(谁的端口?)
EXPOSE 5000# 接收docker run中的输入的字符串作为echo命令的参数,一般用于制作一些执行后关闭的容器
ENTRYPOINT ["/bin/echo"]
# CMD: 容器启动时执行该命令,后面是提供echo命令的参数
CMD ["/bin/echo""Hello,Dockerfile!"]

定义Dockerfile,发布SpringBoot项目(假设为springboot-hello.jar)

  1. 创建一个 Dockerfile 文件,文件名和后缀都任意,假设为 springboot_hello.dockerfile。Dockerfile 文件和 jar 包放到同一个目录下。

    # jar包执行需要JRE环境
    FROM java:8
    ADD springboot-hello.jar ./spring-hello.jar
    CMD java -jar spring-hello.jar
    
  2. 输入 docker build -f <Dockerfile文件路径> -t <镜像名>:<版本号> 命令来构建镜像

    docker build -f springboot_hello.dockerfile -t myHello:1.0
    

保存镜像

容器和镜像不能直接传输,需要将其保存成压缩文件,才能实现镜像的共享。(为什么不直接发布到 docker hub 或私有仓库上,让别人去拉取呢?)

  • 保存镜像:docker save -o <tar文件名> <镜像名>:<版本号>
  • 加载镜像:docker load -i <tar文件名>
  • 保存容器:docker export
  • 加载容器:docker import

保存镜像(先commit,再save)会保留它的历史,保存容器会对它的历史进行压缩,二者类似。

# 将之前创建的redis-demo镜像保存为tar文件. 
docker save -o redis-docker.tar redis-demo:1.0
# 输出路径为当前目录

docker save 保存镜像

五、Docker 网络

每个容器中只运行一个进程。容器和容器之间通过容器链接或者其它的容器网络技术来进行通信

获取容器的 IP 地址:docker inspect <容器名> | grep "IPAddress"

如果在创建容器时不使用端口映射,相当于在宿主机和容器之间搭建了一个私人网络,在宿主机上可以通过查找容器 IP + 容器端口号来访问容器,但是在其它机器上无法访问容器。

5.1、容器链接(过时)

容器链接 docker run --link 在单台主机上可以正常工作,但是在一个大规模系统中,需要使用其它的服务发现方式。可以使用键值存储和 DNS 作为解决方案。另外,Docker Network 提供了一种内建机制来将容器内的服务暴露给外部,而不必使用容器链接。

5.2、用户定义网络

默认情况下使用 bridge 网络,但该网络的问题是不能将容器名解析为 IP 地址,例如不可以通过 ping <容器名> 的方式来进行容器间的通信。而用户定义的网络则解决了这个问题。

创建网络:docker network create <网络名>

连接网络:

  • 创建容器时连接到指定网络 docker run --name --network <指定连接的网络名>
  • 运行中容器连接到指定网络 docker network connect <指定连接的网络名> <容器名>

断开网络连接:docker network disconnect <网络名> <容器名>

查看网络信息:docker network inspect <网络名>

从用法上来看,网络和容器的使用方法类似,只是使用 docker network 作为命令的前缀,例如 docker network ls 等等。

六、Docker Compose 服务编排

6.1、服务编排

微服务架构中一般包含多个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启动和停止,维护的工作量会非常大。而服务编排就是按照一定的业务规则批量管理容器,而 Docker Compose 就是进行服务编排的工具之一。Docker Compose 的使用步骤:

  1. 编写 Dockerfile 文件
  2. 使用 docker-compose.yml 文件定义组成应用程序的各个微服务
  3. 运行 docker-compose up 来启动应用程序

6.2、Docker Compose 的使用

docker compose 默认被安装,可以通过 docker compose version 查看

使用 docker compose 来编排 nginx + springboot 项目,其中 nginx 能够反向代理多个 springboot 项目生成的容器。

  1. 编写 docker-compose.yml 文件

    docker-compose 就是将 docker run 命令中的各种参数配置使用 yaml 的方式进行重新编排

    version: '3'
    services:nginx:冲冲冲image: nginxports:# 短线"-"在yaml文件中的含义表示是数组# 这里的80:80是没有空格的,因为代表的是一个属性值<host_port>:<docker_port>- 80:80# 需要连接的其它容器,与其进行通信links:- app1- app2# 数据卷挂载volumes:#  nginx的配置文件名叫啥都可以,以".conf"结尾即可,推荐为nginx.conf,在挂载目录中创建即可- ./nginx/conf.d:/etc/nginx/conf.d# springboot-hello是springboot项目生成的一个docker镜像# app1 是生成的容器app1:image: springboot-helloexpose:- "8080"app2:image: springboot-helloexpose:- "8081"
    
  2. 编写 nginx 的配置文件

    server {listen 80;access_log off;location / {# 配置反向代理proxy_pass http://app1:8080 http://app2:8081;}
    }
    
  3. 使用docker compose up来执行 docker-compose.yml 文件中信息

分布式系统中的容器通信该如何处理,至今未正面面对这个问题。K8S?

七、通过 Docker 安装其他软件

7.1、Docker 安装 MySQL

  1. 拉取 MySQL 的镜像

    docker pull mysql:latest
    

    docker 拉取 mysql 镜像

  2. 查看本地镜像

    docker images
    

    docker 查看本地镜像

  3. 运行容器

    docker run \
    --name mysql-docker \
    -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=root \
    -v /opt/module/data/mysql/data:/var/lib/mysql \
    -v /opt/module/data/mysql/log:/var/log/mysql \
    -v /opt/module/data/mysql/lib:/var/lib/mysql-files \
    -v /opt/module/data/mysql/conf:/etc/mysql \
    -d mysql
    
    参数介绍
    --name mysql-docker指定创建的容器名为 mysql-docker
    -p 3306:3306前一个 3306 是 Linux 宿主机上的端口,后一个 3306 是 mysql-docker 容器中的端口
    -e MYSQL_ROOT_PASSWORD=root设置环境变量 MySQL 的 root 用户的密码为 root
    -v /opt/module/data/mysql/data:/var/lib/mysql指定 MySQL 的数据挂载目录
    -v /opt/module/data/mysql/log:/var/log/mysql
    -v /opt/module/data/mysql/lib/mysql-files:/var/lib/mysql-files
    -v /opt/module/data/mysql/conf:/etc/mysql
    -d mysql:latest指定使用 mysql:latest 这个镜像来启动容器

    -p <宿主机的port>:<容器的port>:实现容器端口到宿主机端口的映射。外部机器不可以与宿主机的容器直接通信,宿主机可以与容器直接通信,外部机可以与宿主机直接通信。通过端口映射,例如宿主机的3307对应着访问容器的3306,当外部机器需要访问容器的3306端口时,访问宿主机的3307端口即可

  4. 使用 docker ps 来查看正在运行中的容器(取名为 mysql-docker)

    查看 mysql-docker 是否成功启动

  5. 在宿主机上修改 MySQL 的配置 vim /opt/module/data/mysql/conf/my.cnf

    # 防止中文乱码
    [client]
    default-character-set=utf8[mysql]
    default-character-set=utf8[mysqld]
    init_connect='SET collation_connection = utf8_unicode_ci'
    init_connect='SET NAMES utf8'
    character-set-server=utf8
    collation-server=utf8_unicode_ci
    skip-character-set-client-handshake
    skip-name-resolve
    #################################### 集群配置 ###################################
    # mysql集群中的id,集群下需要唯一
    server_id=101
    # 指定不需要同步的数据库名称
    binlog-ignore-db=mysql
    # 开启二进制日志功能
    log-bin=mall-mysql-bin
    # 设置二进制日志使用内存大小(事务)
    binlog_cache_size=1M
    # 设置mysql集群使用的binlog日志的格式(mixed,statement,row)
    binlog_format=mixed
    expire_logs_days=7
    slave_skip_errors=1062
    ############################ MySQL从服务器需要额外配置下面参数 ##########################
    # relay_log 配置中继日志
    relay_log=mall-mysql-relay-bin
    # log_slave_updates表示slave将复制事件写入自己的binlog日志中
    log_slave_updates=1
    # slave设置为只读
    read_only=1
    
  6. 重启 mysql-docker 来应用更新后的配置

    docker restart mysql-docker
    
  7. 使用 docker exec -it mysql-docker 进入到 mysql-docker 容器中,成功进入代表部署成功

    进入正在运行中的docker容器
  8. 使用 whereis mysql 命令来查看 MySQL 的安装位置

    查看 MySQL 的安装位置
  9. 使用 cat /etc/mysql/my.cnf 来查看在宿主机上修改的配置文件

  10. 使用 mysql -uroot -proot 来进入 MySQL,在其中创建一个数据库,方便后面的测试连接

  11. 在 IDEA 中进行外部的连接测试

    通过 IDEA 进行外部连接测试
  12. (主从复制)MySQL 主服务器中开启主从复制

    这部分感觉可以不用进行配置?直接把root用户给SLAVE服务器?

    CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
    GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave'@'%';
    
  13. (主从复制)在主服务器上获取一些用于主从复制的信息

    SHOW MASTER STATUS;
    
  14. (主从复制)在从服务器中指定主服务器

    CHANGE MASTER TO 
    MASTER_HOST='<mysql主服务器的ip地址>',
    MASTER_USER='root',
    MASTER_PASSWORD='root',
    MASTER_PORT=3306,
    MASTER_LOG_FILE='mall-mysql-bin.000001',
    MASTER_LOG_POS=617,
    MASTER_CONNECT_RETRY=30;
    

    上面的信息需要根据 MySQL主服务器上情况进行修改

  15. (主从复制)在 MySQL 从服务器中开启主从复制

    START SLAVE;
    
  16. (主从复制)主从复制配置成功的测试

    
    

7.2、Docker 安装 Redis

  1. 创建并启动 Redis

    docker run \
    -p 6379:6379 \
    --name redis \
    -v /opt/module/data/redis/data:/data \
    -v /opt/module/data/redis/conf/:/etc/redis/conf \
    -d redis \
    redis-server /etc/redis/conf/redis.conf
    

    最后一行的 redis-server /etc/redis/redis.conf 实际上是 redis 启动服务端的命令,难道说 docker run 可以直接执行 sh 命令吗?那是否可以写上 mysql -uroot -proot 来直接登录 MySQL 呢?

    redis-server /etc/redis/conf/redis.conf 是指定redis-docker容器启动时使用的配置文件,由于上面没有创建 redis.conf 文件,所以实际上并没有成功启动。可以通过 docker logs -f redis-docker 查看日志,能够看到 Fatal error,can’t open config file ‘/etc/redis/conf/redis.conf’: No such file or directory 这样的错误。

  2. 在宿主机的挂载目录 /opt/module/data/redis/conf 中创建 redis.conf 文件,并设置允许远程访问 Redis

    挂载目录实际上就是容器内的目录,相当于创建了一个快捷方式(软链接),对挂载目录中的操作实际上是对容器内部的目录进行操作。

    bind 0.0.0.0
    protected-mode no
    
  3. 使用 docker start redis 来真正启动Redis容器

  4. 使用 redis-docker 容器来执行连接 Redis

    docker exec -it redis redis-cli
    

    这里标明不需要进入到容器中再去执行 redis-cli 命令,做了一点点简化。

7.3、Docker 安装 Redis 集群

配置一个 3 主 3 从的 Redis 集群

  1. 创建一个用户自定义网络,不妨命名为 redis-network

    docker network create redis-network
    
  2. 下面的配置文件复制 6 份,启动 6 个 Redis 容器
    (redis-master-6380、redis-master-6381、redis-master-6382、redis-slave-6383、redis-slave-6384、redis-slave-6385)

    docker run \
    -p 6380:6379 \
    --name redis-master-6380 \
    --network redis-network
    --privileged=true \
    -v /opt/module/data/redis/data:/data \
    -v /opt/module/data/redis/conf/:/etc/redis/conf \
    --cluster-enabled yes \
    --appendonly yes \
    -d redis \
    redis-server /etc/redis/conf/redis.conf
    
  3. 将多个 Redis 节点合并成一个 Redis 集群(不指定 master 和 slave)

    redis-cli --cluster create \
    <ip1>:<port1> \
    <ip2>:<port2> \
    <ip3>:<port3> \
    <ip4>:<port4> \
    <ip5>:<port5> \
    <ip6>:<port6> \
    --cluster-replicas 1 \
    --cluster-yes
    
  4. 为 master 节点添加 slave 节点

    其中 <node-id> 通过 redis-cli cluster nodes 来获取

    redis-cli \
    -h <ip1> -p <port1> \
    cluster replicate <node-id>
    

7.4、Docker 安装 Nginx

  1. 创建并启动 Nginx

    docker run \
    -p 8000:80 \
    --name nginx-docker \
    -v /opt/module/data/nginx/conf:/etc/nginx/conf \
    -v /opt/module/data/nginx/log:/var/log/nginx \
    -d nginx
    

八、安装过程中的错误记录

使用 docker ps 查看正在运行的容器

使用 docker logs mysql-docker 来查看容器报错日志

可能存在的问题:

  • 如果这里并没有 mysql 容器在运行,那么有可能是因为端口冲突,或者一些其它别的问题?(换一台主机测试成功)
  • 可能一开始能够通过 docker ps 查看到运行中的 mysql-docker,但是隔一段时间后发现 mysql-docker 停止了,这也说明 mysql-docker 并没有成功运行。

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

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

相关文章

PHP源码_最新在线工具箱网站系统源码

项目运行截图 源码贡献 https://githubs.xyz/boot?app41 部分数据库表 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for toolbox_category -- ---------------------------- DROP TABLE IF EXISTS toolbox_category…

Golang | Leetcode Golang题解之第64题最小路径和

题目&#xff1a; 题解&#xff1a; func minPathSum(grid [][]int) int {if len(grid) 0 || len(grid[0]) 0 {return 0}rows, columns : len(grid), len(grid[0])dp : make([][]int, rows)for i : 0; i < len(dp); i {dp[i] make([]int, columns)}dp[0][0] grid[0][0]…

ubuntu sudo apt-get install neo4j 配置安装与设置远程访问

文章目录 下载Adding the Debian repositoryInstalling Neo4j安装流程设置远程访问 下载 neo4j 官方的下载地址&#xff0c;进入页面之后&#xff0c;往下滑&#xff1a; https://neo4j.com/deployment-center/#community 点击 Visit https://debian.neo4j.com/ Adding the …

Apache Seata基于改良版雪花算法的分布式UUID生成器分析1

title: Seata基于改良版雪花算法的分布式UUID生成器分析 author: selfishlover keywords: [Seata, snowflake, UUID] date: 2021/05/08 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Seata基于改良版雪花算法的分布式UUID生成器分析…

电子式汽车机油压力传感器的接线方法及特点

电子式机油压力传感器由厚膜压力传感器芯片、信号处理电路、外壳、固定电路板装置和两根引线&#xff08;信号线和报警线&#xff09;组成。信号处理电路由电源电路、传感器补偿电路、调零电路、电压放大电路、电流放大电路、滤波电路和报警电路组成。 厚膜压力传感器是20世纪…

数据结构 - C/C++

快速跳转 数组链表栈队列串树 目录 数据结构 逻辑结构 物理结构 数据结构 数据 数据不仅仅包括整型、实型等数值类型&#xff0c;还包括字符及声音、图像、视频等非数值类型。 计算机可以理解并按照指定格式处理。 结构 元素相互之间存在一种或多种特定关系的数据集合。 …

tuxera ntfs for mac是什么 tuxera ntfs for mac怎么用 tuxera激活码

Tuxera NTFS for Mac是一款完全的mac读写软件&#xff0c;可辅助mac电脑读写ntfs格式&#xff0c;进行磁盘的管理。本文会详细讲解tuxera ntfs for mac的操作方法。 Tuxera NTFS for Mac 2023安装包免费下载&#xff1a;https://souurl.cn/IE35lO 一、Tuxera NTFS for Mac是什…

goget配置多个golang 运行环境

一台主机安装多个golang 运行环境 本环境 windows10 为 基础 mac linux也可以按照此方法操作 背景 开发不同的运维工具会用到不同版本的golang&#xff0c;但是开发者不能一直进行重装来处理 &#xff0c;因此 需要一个工具进行golang版本的管理 go管理工具介绍 gvm (Go V…

微服务保护和分布式事务(Sentinel、Seata)笔记

一、雪崩问题的解决的服务保护技术了解 二、Sentinel 2.1Sentinel入门 1.Sentinel的安装 &#xff08;1&#xff09;下载Sentinel的tar安装包先 &#xff08;2&#xff09;将jar包放在任意非中文、不包含特殊字符的目录下&#xff0c;重命名为 sentinel-dashboard.jar &…

【C++报错】error C2143:语法错误:缺少“ : ”(在“<” 的前面)[ 相互引用问题 ]

这里写自定义目录标题 情景再现问题分析是经典的互相引用问题 解决方案 情景再现 问题分析 template<class K,class T,class KeyofT,class Hash>class __HTIterator{typedef HashNode<T> Node;typedef HashTable<K, T, KeyofT, Hash> HT; 【★】typedef …

基于springboot+vue+Mysql的网上商城购物系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

Java创建并遍历N叉树(前序遍历)

力扣 title589&#xff1a;N叉树的前序遍历 给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#xff0c;每组子节点由空值 null 分隔&#xff08;请参见示例&#xff09;。 思路&#xff1a; 1.初始化时…

[ACTF2020 新生赛]BackupFile 1 [极客大挑战 2019]BuyFlag 1 [护网杯 2018]easy_tornado 1

目录 [ACTF2020 新生赛]BackupFile 1 1.打开页面&#xff0c;叫我们去找源文件 2.想到用disearch扫描&#xff0c;发现源文件index.php.bak 3.访问这个文件&#xff0c;下载一个文件&#xff0c;用记事本打开 4.翻译php代码 5.构造payload url/?key123&#xff0c;得到fl…

如何配置和使用Apollo的component里的plugin

关于如何使用Apollo的Component里的plugin&#xff0c;在Apollo的文档里只有如果和开发的说明却没有找到一个清楚完整说明怎么把plugin跑起来的说明&#xff0c;例如我想把lidar_detection_filter按我们的需求对目标过滤算法作修改然后编译完后&#xff0c;执行 cyber_launch …

【七十三】【算法分析与设计】516. 最长回文子序列,二叉树,329. 矩阵中的最长递增路径,记忆化递归填表

516. 最长回文子序列 给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 示例 1&#xff1a; 输入&#xff1a;s &qu…

《QT实用小工具·五十一》带动画的 CheckBox

1、概述 源码放在文章末尾 该项目实现了带动画效果的多选框&#xff0c;鼠标放在上面或者选中都会呈现炫酷的动画效果&#xff0c;demo演示如下&#xff1a; 项目部分代码如下所示&#xff1a; #ifndef LINEARCHECKBOX_H #define LINEARCHECKBOX_H#include <QCheckBox> …

OPPO手机支持深度测试+免深度测试解锁BL+ROOT权限机型整理-2024年3月更新

绿厂OPPO手机线上线下卖的都很不错&#xff0c;目前市场份额十分巨大&#xff0c;用户自然也非常多&#xff0c;而近期ROM乐园后台受到很多关于OPPO手机的私信&#xff0c;咨询哪些机型支持解锁BL&#xff0c;ROOT刷机&#xff0c;今天ROM乐园正式盘点当前市场上可以解BL刷root…

Mysql-黑马

Mysql-黑马 编写规范&#xff1a;## 一级1. 二级三级 1.Mysql概述 数据库概念mysql数据仓库 cmd启动和停止 net start mysql180 net stop mysql180备注&#xff1a;其中的mysql180是服务名 客户端连接 远程连接数据仓库 -h 主机号 -P端口号 mysql [-h 127.0.0.1] [-P 33…

1083 是否存在相等的差

solution 输出的是重复的差值&#xff0c;而非全部差值 #include<iostream> #include<algorithm> using namespace std; const int maxn 1e4 10; int flag[maxn] {0}; int main(){int n, x;scanf("%d", &n);for(int i 1; i < n; i){scanf(&…

一文全面了解 wxWidgets 布局器(Sizers)

目录 Sizers背后的理念 共同特征 最小大小 边框 对齐方式 伸缩因子 使用 Sizer 隐藏控件 wxBoxSizer wxStaticBoxSizer wxGridSizer wxFlexGridSizer 布局器&#xff08;Sizers&#xff09;&#xff0c;由wxWidgets类层次结构中的wxSizer类及其派生类表示&#xff0…