docker的与使用
1 docker初体验
1.1 docker简介
- 问题:为什么会有docker出现?
一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各种版本的迭代之后,不同版本环境的兼容,对运维人员都是考验 , 这个时候 docker 横空出世,是因为它对此给出了一个标准化的解决方案。
环境配置如此麻烦,换一台机器,就要重来一次,费力费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。开发人员利用 docker 可以消除协作编码时“在我的机器上可正常工作”的问题。
-
docker官网地址:https://www.docker.com/
-
docker 是一个开源的应用容器引擎,基于 Go 语言开发。docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
-
docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。
-
总之一句话:只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作 。
1.2 docker的优势
docker的优势包括:
1、可移植性:docker容器可以在任何支持docker的环境中运行,包括本地开发环境、测试环境和生产环境,从而提高了应用程序的可移植性。
2、可伸缩性:docker容器可以根据负载的变化进行快速扩展和收缩,从而更好地满足应用程序的需求。
3、隔离性:docker容器提供了隔离的运行环境,从而使得不同容器中运行的应用程序互相隔离,避免了应用程序之间的干扰。
1.3 docker和虚拟机的区别
docker和虚拟机的区别如下图所示:
隔离性:在于隔离性上面,由于vm对操作系统也进行了虚拟化,隔离的更加彻底。而docker共享宿主机的操作系统,隔离性较差。
运行效率:由于vm的隔离操作,导致生成虚拟机的速率大大低于容器docker生成的速度,因为docker直接利用宿主机的系统内核。它们的启动速度是在数量级上的差距。
资源利用率:在资源利用率上虚拟机由于隔离更彻底,因此利用率也会相对较低。
经典名句:虚拟机已死,容器才是未来
1.4 docker架构
-
docker是一个客户端-服务器(C/S)架构程序。docker客户端只需要向docker服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。docker提供了一个命令行工具docker以及一整套RESTful API。你可以在同一台宿主机上运行docker守护进程和客户端,也可以从本地的docker客户端连接到运行在另一台宿主机上的远程docker守护进程。
-
docker的架构图如下所示:
1.5 docker镜像与容器
**镜像:**类似虚拟机镜像 , 是一个特殊的文件系统
操作系统分为内核和用户空间。对于Linux而言,内核启动后,会挂载root文件系统为其提供用户空间支持。而docker镜像(Image),就相当于是一个root文件系统。
docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。 镜像不包含任何动态数据,其内容在构建之后也不会被改变。
**容器:**类似linux系统环境,运行和隔离应用。是镜像运行时的实体
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 。
**仓库:**集中存放镜像文件的地方。
镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中存储、分发镜像的地方,比如后面我们要学的,docker Registry就是这样的服务。
1.6 Docker hub
-
docker用Registry来保存用户构建的镜像。Registry分为公共和私有两种。docker公司运营公共的Registry叫做docker Hub。用户可以在Docker Hub注册账号,分享并保存自己的镜像(说明:在docker Hub下载镜像很慢,可以自己构建私有的Registry)。
-
访问docker Hub搜索Redis镜像
https://hub.docker.com/
一般都会选择官方的的子镜像仓库:
在子镜像仓库中会存在很多的版本的镜像。
1.7 docker的安装与卸载
- docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),CE版本是免费的,EE版本是收费的。本次我们使用社区版。
docker的安装和卸载可以参考官方文档:https://docs.docker.com/engine/install/centos/
(1)卸载docker:
sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
(2)安装docker:
-
第一步 检查系统版本
注意:这里建议安装在CentOS7.x以上的版本,在CentOS6.x的版本中,安装前需要安装其他很多的环境,而且Docker很多补丁不支持更新。
# 确定是CentOS7.x及其以上版本
cat /etc/redhat-release
- 第二步 检查环境,安装gcc和g++
yum -y install gcc
yum -y install gcc-c++
- 第三步 安装必要的一些系统工具
yum install -y yum-utils device-mapper-persistent-data lvm2
- 第四步 添加软件源信息(设置阿里云镜像地址,提高下载速度)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 第五步 更新yum软件包索引并安装Docker-CE
yum makecache fastyum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
1.8 docker服务相关命令
docker服务操作的相关命令如下所示:
# 查看docker服务的运行状态
systemctl status docker# 启动docker服务
systemctl start docker# 关闭docker服务
systemctl stop docker# 重启docker服务
systemctl restart docker
1.9 配置镜像加速器
docker的使用过程中,需要从远程仓库下载镜像,但是默认为国外网站,所以在下载时可能会出现下载连接超时导致下载失败,因此需要为其配置镜像加速器,以提高下载速度。目前使用的镜像加速器有很多,比如阿里云,网易云等等。
(1)国内配置的镜像地址
受目前网络环境影响,其它加速器可能暂时不能使用,所以大家尽量采样优先推荐(如果不行就挨个试一下):
0.优先选用★
https://registry.dockermirror.com1.Docker中国区官方镜像
https://registry.docker-cn.com2.网易
http://hub-mirror.c.163.com3.中国科技大学
https://docker.mirrors.ustc.edu.cn
(2)阿里云镜像地址
阿里云镜像加速器的使用步骤:
1、注册和登录
2、进入管理后台
3、搜索容器镜像服务
4、查看示例代码进行配置即可
(3)配置过程
- 创建文件daemon.json
vim /etc/docker/daemon.json
- 文件中添加如下内容
{ "registry-mirrors":["https://registry.dockermirror.com","https://registry.dockermirror.com"]
}
- 重启docker生效
2 docker镜像操作
2.1 搜索远程镜像
相关命令如下所示:
# 命令:
docker search# 格式:
docker search 镜像关键字# 示例:搜索镜像名称中包含redis关键字的镜像
docker search redis
docker search --limit 5 redis
执行效果如下所示:
列介绍:
1、name: 镜像仓库源名称
2、description: 镜像的描述
3、official: 是否 docker 官方发布
4、stars: 镜像的收藏数,收藏数越多表示此镜像的受欢迎程度越高
5、automated: 是否自动构建
2.2 拉取镜像
相关命令如下所示:
# 命令:
docker pull# 格式: tag表示的镜像的标签,也可以理解为就是镜像的版本
docker pull 镜像名称[:tag] # 示例1: 默认拉取的是最新的redis镜像
docker pull redis # 示例2: 拉取redis7.0.10镜像,一个镜像到底存在哪些标签,需要上docker hub中进行查看
docker pull redis:7.0.10
执行效果如下所示:
2.3 查看本地镜像
相关命令如下所示:
# 命令:
docker images # 示例:
docker images
docker images -qa
执行效果如下所示:
列介绍:
1、repository:镜像来源仓库名称
2、tag: 镜像标签
3、image id: 镜像id
4、created: 创建时间
5、size: 镜像的大小
2.4 删除本地镜像
相关命令如下所示:
# 命令:
docker rmi # 删除单个镜像(-f 强制删除):
docker rmi -f 镜像ID# 删除多个镜像:
docker rmi -f 镜像名1:TAG 镜像名2:TAG
# 根据镜像的id或者镜像的名称进行删除,如果不添加镜像的标签删除的就是最新的镜像# 示例:
docker rmi redis:7.0.10 # 删除redis:7.0.10镜像
执行效果如下所示:
- 根据镜像名称删除
- 根据镜像id删除
- 注意:如果一个镜像存在对应的容器,此时这个镜像是无法进行删除的。
- 删除所有镜像:
docker rmi $(docker images -q) # 慎用
2.5 帮助文档使用
docker中提供了很多命令,每一个命令也可以加很多的参数选项。把一个命令以及对应的参数选项都记住很显然是不太现实的。可以通过查看docker
帮助文档来学习docker的常用命令以及参数选项的使用。
帮助文档的使用如下所示:
# 查询docker可以使用到的命令
docker --help# 查询images命令的使用文档
docker images --help
3 docker容器操作
3.1 查询容器
相关命令如下所示:
命令:docker ps
格式:docker ps [options] # 可以添加一些参数选项,如果不添加表示查询本地所有正在运行的容器
示例: docker ps # 查看本地正在运行的容器
执行效果如下所示:
列介绍:
1、container id: 容器名称
2、image: 镜像名称
3、command: 容器启动时所执行的命令
4、created: 创建时间
5、status: 容器状态
6、ports: 端口映射情况
7、names: 容器的名称
常见参数选项:
-a,--all # 查询所有,包含未运行的容器
-q,--quiet # 查询容器的id示例1:docker ps -a # 查询所有的容器包含未运行的容器
示例2:docker ps -q # 查询容器的id
3.2 创建容器
- 容器分类:
1、交互型容器:具有和用户交互的输入和输出终端,容器创建后自动进入容器,退出容器后,容器自动关闭。
2、守护型容器:没有和用户交互终端,需要使用docker exec进入容器,退出后,容器不会关闭。
- 命令介绍:
命令: docker run
格式: docker run [OPTIONS] 镜像的名称:镜像标签/镜像id [COMMAND] [ARG...]类型参数选项:
-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
--name :为创建的容器命名。
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
- 交互式方式创建容器
以交互式方式创建并启动容器,启动完成后,直接进入当前容器。使用exit命令退出容器。需要注意的是以此种方式启动容器,如果退出容器,则容器会进入停止状态,可以理解成交互式容器 是前台容器
docker run -it --name=容器名称 镜像名称:标签 /bin/bash
# 比如:docker run -it --name=mycentos centos:7 /bin/bash
# docker run:表示创建容器
# -it:表示运行容器并进入它的命令行
# --name=mycentos:给当前的容器命名
# centos:7:使用该镜像创建
# /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash
执行效果如下所示:
# 准备测试镜像
docker pull centos:7# 交互方式创建
docker run -it --name=mycentos centos:7 /bin/bash
效果:
交互型容器创建好了以后,直接进入到容器的内部了。
退出当前容器:exit,退出之后,容器也退出了,没有删除
- 守护式方式创建容器
# 守护式容器和交互式容器的创建方式区别:
# -it 换成 -di
# 去掉后面的 /bin/bash
docker run -di --name=容器名称 镜像名称:标签
# 比如:docker run -di --name=mycentos10 centos:7
效果:
3.3 容器服务管理
容器管理的相关命令如下所示:
docker stop 容器名称/容器id # 关闭容器
docker start 容器名称/容器id # 启动容器
docker restart 容器名称/容器id # 重启容器
3.4 删除容器
删除容器的常见命令如下所示:
命令: docker rm
格式:docker rm 容器名称/容器的id # 删除容器
示例:docker rm mycentos10 # 删除mycentos10容器
注意:上述的命令只能删除已经关闭的容器,如果想删除正在运行的容器,可以通过添加 -f 参数进行实现。
删除所有的容器
docker rm $(docker ps -aq)
3.5 进入容器
进入容器命令如下所示:
命令:docker exec
格式:docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
常见的参数选项:
-t, --tty # 分配一个虚拟终端,通常和-i参数一起使用
-i,--interactive # 把交互界面一直保留,通常和-t参数一起使用示例1:docker exec -it mycentos10 /bin/bash # 进入到容器中同时打开一个shell窗口
执行效果如下所示:
3.6 其他命令
如下所示:
docker logs -f 容器名称/容器的id # 查询容器内进程日志,-f参数表示实时监控日志信息
docker inspect 容器名称/容器的id # 查看容器的详情信息
docker cp # 完成容器和宿主机之间的文件copy示例1: docker logs -f redis01 # 实时查看redis01这个容器中的日志信息
示例2: docker inspect redis01 # 查看容器的详情信息,主要就是:目录映射情况、端口映射情况、ip地址
示例3: docker cp a.txt redis01:/root # 把宿主机中a.txt文件拷贝到redis01的root目录中
示例4: docker cp redis01:/root/a.txt . # 把容器中的root目录下的a.txt文件拷贝到宿主机中当前目录中
3.7 备份与迁移
对某一个容器修改完毕以后,我们可以把最新的容器部署到其他的环境中。具体的流程操作如下所示:
涉及的docker命令:
docker commit 容器名称/容器的id 镜像名称 # 把docker容器保存成一个镜像
docker save -o 镜像tar文件名称 镜像名称/镜像id # 把镜像保存为tar文件
docker load -i 镜像tar文件名称 # 把tar文件恢复成为一个镜像
示例代码:
docker commit mycentos10 mycentos # 将mycentos10容器保存为一个镜像
docker save -o mycentos.tar mycentos # 将mycentos镜像保存为一个tar文件
docker rmi mycentos # 删除之前的mycentos镜像
docker load -i mycentos.tar # 将mycentos.tar恢复成一个镜像
4 docker数据卷操作
4.1 数据卷概述
思考问题:在Redis容器中存储的数据,如果Redis容器被删除了,数据是否还存在?
解决方案:将数据存储到Linux宿主机的磁盘目录中
数据卷概述:数据卷是docker所提供的一个虚拟目录,这个虚拟目录会对应宿主机的一个真实目录。在创建容器的时候就可以将这个数据卷挂载到容器中的某一个目录下,那么此时在该目录下所产生的数据就会存储到宿主机的目录下,实现了容器和宿主机之间的文件共享。
如下图所示:
4.2 常见命令
4.2.1 查看数据卷
命令如下所示:
docker volume ls
4.2.2 创建数据卷
命令如下所示:
docker volume create 数据卷名称
执行效果如下所示:
4.2.3 查询数据卷详情
命令如下所示:
docker volume inspect 数据卷名称
执行效果如下所示:
4.2.4 删除数据卷
命令如下所示:
docker volume rm 数据卷名称 # 删除指定的数据卷
4.3 数据卷挂载
数据卷创建好了以后,在创建容器的时候就可以通过-v参数,将创建好的数据卷挂载到容器中的某一个目录下。
命令如下所示:
格式: -v 数据卷名称:容器目录
示例:docker run -d --name=redis02 -p 6380:6379 -v redis-data:/data redis:7.0.10Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个--privileged=true参数即可
注意事项:
1、如果数据卷没有提前创建好,那么在创建容器的时候会自动创建对应的数据卷
2、数据卷挂载的时候数据卷名称前面没有/
3、容器目录不存在会自动创建
4、数据卷目录如果不为空,此时会使用数据卷目录内容覆盖容器目录内容
5、数据卷目录如果为空,容器目录不为空,此时就会使用容器目录内容覆盖数据卷目录
4.4 目录挂载
通过-v参数也可以将宿主机上的某一个目录挂载到容器中的某一个目录下。
命令如下所示:
格式: -v 宿主机目录:容器目录
示例:docker run -d --name redis03 -p 6381:6379 -v /redis-data:/data redis:7.0.10
注意事项:
1、如果宿主机目录没有提前创建好,那么在创建容器的时候会自动创建对应的宿主机目录
2、宿主机目录挂载的时候宿主机目录名称前面有/
3、容器目录不存在会自动创建
4、宿主机目录如果不为空,此时会使用宿主机目录内容覆盖容器目录内容
5、宿主机目录如果为空,容器目录不为空,此时就会将容器目录内容清空掉
5 Spring Boot项目部署
本章节主要讲解的就是如何把一个Spring Boot项目使用docker进行部署,以减少整个项目的维护成本。
5.1 dockerfile
5.1.1 dockerfile简介
前面我们所使用的镜像都是别人构建好的,但是别人构建好的镜像不一定能满足我们的需求。为了满足我们自己的某一些需求,此时我们就需要构建自己的镜像,怎么构建?使用dockerfile。
dockerfile就是一个文本文件,在这个文本文件中可以使用docker所提供的一些指令来指定我们构建镜像的细节,后期就可以使用这个dockerfile文件来构建自己的镜像。
dockerfile文件内容一般分为4部分:
1、基础镜像信息(必选)
2、维护者信息(可选)
3、镜像操作指令(可选)
4、容器启动时执行的指令(可选)
常用命令
指令 | 用法 | 作用 |
---|---|---|
FROM | FROM image_name:tag | 指定一个构建镜像的基础源镜像,如果本地没有就会从公共库中拉取,没有指定镜像的标签会使用默认的latest标签,可以出现多次,如果需要在一个dockerfile中构建多个镜像。 |
MAINTAINER | MAINTAINER user_name | 描述镜像的创建者,名称和邮箱 |
RUN | RUN “command” “param1” “param2” | 用来执行一些命令,可以写多条 |
ENV | ENV key value | 设置容器的环境变量,可以写多条。 |
ADD | ADD source_dir/file | 将宿主机的文件复制到容器内,如果是压缩文件,则复制后自动解压 |
ENTRYPOINT | ENTRYPOINT “command” “param1” “param2” | 用来指定容器启动时所执行的命令 |
5.1.2 入门案例
需求:使用dockerfile来构建一个包含Jdk17的centos7镜像
分析:
1、基础的镜像的应该选择centos:7
2、在自己所构建的镜像中需要包含Jdk17,就需要把Jdk17添加到centos:7的基础镜像中
3、为了方便的去使用自己构建的镜像中的Jdk17,就需要去配置环境变量
4、因为Jdk17仅仅是一个开发工具,并不是一个服务进程,因此在启动容器的时候可以不指定任何的执行命令
实现步骤:
1、将Jdk17的安装包上传到linux服务器的指定目录下
2、在Jdk17所在的目录下创建一个dockerfile文件
3、使用docker build命令构建镜像
4、使用docker images查看镜像构建情况
5、使用自己所构建的镜像创建容器,测试Jdk17的安装情况
代码实现
# 1、创建目录
mkdir –p /usr/local/dockerfilejdk17
cd /usr/local/dockerfilejdk17# 2、下载jdk-17_linux-x64_bin.tar.gz并上传到服务器(虚拟机)中的/usr/local/dockerfilejdk17目录
# 3、在/usr/local/dockerfilejdk17目录下创建dockerfile文件,文件内容如下:
vim dockerfileFROM centos:7
MAINTAINER atguigu
RUN mkdir -p /usr/local/java
ADD jdk-17_linux-x64_bin.tar.gz /usr/local/java/
ENV JAVA_HOME=/usr/local/java/jdk-17.0.7
ENV PATH=$PATH:$JAVA_HOME/bin# 4、执行命令构建镜像;不要忘了后面的那个 .
docker build -t centos7-jdk17 .# 5、查看镜像是否建立完成
docker images# 6、创建容器
docker run -it --name atguigu-centos centos7-jdk17 /bin/bash
5.2 案例介绍与需求分析
需求:将提供的Spring Boot项目使用容器化进行部署
分析:
1、Spring Boot项目中使用到了Mysql环境,因此需要先使用docker部署mysql环境
2、要将Spring Boot项目使用docker容器进行部署,就需要将Spring Boot项目构建成一个docker镜像
实现步骤:
1、使用docker部署mysql
2、使用dockerfile构建Spring Boot镜像
- 将Spring Boot打包成一个Jar包
- 把Jar包上传到Linux服务器上
- 编写dockerfile文件
- 构建Spring Boot镜像
3、创建容器进行测试
5.3 docker部署Mysql
使用docker部署Mysql步骤如下所示:
# 创建容器。 -e: 设置环境变量 --privileged=true 开启root用户权限
docker run -di --name=mysql -p 3306:3306 -v mysql_data:/var/lib/mysql -v mysql_conf:/etc/mysql --privileged=true -e MYSQL_ROOT_PASSWORD=1234 mysql:8.0.30# 进入容器
docker exec -it -e LANG=C.UTF-8 mysql /bin/bash
mysql -uroot -p # 登录mysql
并创建对一个的数据库和数据库表
创建数据库:docker
创建表:
CREATE TABLE `tb_school` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`address` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
添加测试数据
INSERT INTO `tb_school` VALUES (1, 'zhangsan', '北京市昌平区宏福科技园2号楼3层');
INSERT INTO `tb_school` VALUES (2, 'lisi', '上海市松江区谷阳北路166号大江商厦3层');
INSERT INTO `tb_school` VALUES (3, 'wangwu', '深圳市宝安区西部硅谷大厦B座C区一层');
INSERT INTO `tb_school` VALUES (4, 'zhaoliu', '西安市雁塔区和发智能大厦B座3层');
INSERT INTO `tb_school` VALUES (5, 'su7', '成都市成华区北辰星拱青创园综合楼3层');
INSERT INTO `tb_school` VALUES (6, 'laoba', '武汉市东湖高新区东湖网谷6号楼4层');
5.4 dockerfile构建镜像
5.4.1 项目打包
具体步骤:
1、在idea中部署资料\基础项目\ebuy-docker项目,并启动项目访问:http://localhost:8081/
2、执行mvn package命令进行项目打包
3、上传jar包到linux服务器上
5.4.2 dockerfile文件
dockerfile文件的内容如下所示:
FROM centos7-jdk17
MAINTAINER atguigu# 声明容器内主进程所对应的端口
EXPOSE 8081
ADD ebuy-docker-1.0-SNAPSHOT.jar /ebuy-docker-1.0-SNAPSHOT.jar# 相当于windows中的cd命令
WORKDIR /
ENTRYPOINT ["java" , "-jar" , "ebuy-docker-1.0-SNAPSHOT.jar"]
目录结构如下所示:
5.4.3 构建镜像
命令如下所示:
docker build -t ebuy-docker:v1.0 .
执行效果如下所示:
docker服务端开启远程访问#修改该文件
vim /lib/systemd/system/docker.service#找到ExecStart行,修改成如下内容
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H fd:// --containerd=/run/containerd/containerd.socksystemctl daemon-reload #重启守护进程
systemctl restart docker #重启docker
5.4.4 推送镜像
推送到阿里云镜像
-
开通阿里云镜像仓库(打开阿里云登录页,让学生扫码登录,演示从零到一开通过程)
-
登录镜像仓库
-
重命名镜像,按照阿里云规范
-
推送镜像
5.5 创建容器
命令如下所示:
docker run -d --name ebuy-docker -p 8081:8081 ebuy-docker:v1.0
访问测试: http://192.168.6.131:8081
6 docker compose
6.1 docker compose简介
1、Docker Compose是一个工具,用于定义和运行多容器应用程序的工具;
2、Docker Compose通过yml文件定义多容器的docker应用;
3、Docker Compose通过一条命令根据yml文件的定义去创建或管理多容器;
如下图所示:
Docker Compose 是用来做Docker 的多容器控制,有了 Docker Compose 你可以把所有繁复的 Docker 操作全都一条命令,自动化的完成。
官网地址:https://docs.docker.com/compose/install/linux/
6.2 下载与安装
下载与安装:
- 在安装docker时候已经完成了安装,直接查看版本号,查看是否安装成功
# 创建指定目录存储docker compose
mkdir -p /usr/local/lib/docker/cli-plugins# 下载并移动
curl -SL https://github.com/docker/compose/releases/download/v2.14.2/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose# 给docker-compose文件赋予可执行权限
sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose# 查看docker compose的版本
docker compose version
6.3 入门案例
需求:使用docker compose部署redis
docker-compose.yml文件的内容如下所示:
services:redis:image: redis:7.0.10container_name: redisports:- "6379:6379"volumes:- redis-data:/data
volumes:redis-data: {}
docker compose相关命令:
# 启动容器(如果不存在容器就创建、存在则修改)
docker compose -f docker-compose.yml up -d# 删除所有容器
docker compose -f docker-compose.yml down# 停止所有容器
docker compose -f docker-compose.yml stop# 启动所有容器
docker compose -f docker-compose.yml start# 重启所有容器
docker compose -f docker-compose.yml restart
docker compose文件中其他的常见指令参考官方文档:https://docs.docker.com/compose/compose-file/05-services/
6.4 编排Spring Boot项目
需求:使用docker compose部署第六章的spring boot项目
docker-compose.yml文件的内容如下所示:
services:mysql:container_name: mysqlimage: mysql:8.0.30ports:- "3306:3306"volumes:- mysql_data:/var/lib/mysql- mysql_conf:/etc/mysqlprivileged: trueenvironment:- "MYSQL_ROOT_PASSWORD=1234"ebuy:container_name: ebuyimage: ebuy-dockerports:- "8081:8081"
volumes:mysql_data: {}mysql_conf: {}
6.5 一键安装超多中间件
#Disable memory paging and swapping performance
sudo swapoff -a# Edit the sysctl config file
sudo vi /etc/sysctl.conf# Add a line to define the desired value
# or change the value if the key exists,
# and then save your changes.
vm.max_map_count=262144# Reload the kernel parameters using sysctl
sudo sysctl -p# Verify that the change was applied by checking the value
cat /proc/sys/vm/max_map_count
注意:
- 将下面文件中
kafka
的119.45.147.122
改为你自己的服务器IP。 - 所有容器都做了时间同步,这样容器的时间和linux主机的时间就一致了
准备一个 compose.yaml
文件,内容如下:
name: devsoft
services:redis:image: bitnami/redis:latestrestart: alwayscontainer_name: redisenvironment:- REDIS_PASSWORD=123456ports:- '6379:6379'volumes:- redis-data:/bitnami/redis/data- redis-conf:/opt/bitnami/redis/mounted-etc- /etc/localtime:/etc/localtime:romysql:image: mysql:8.0.31restart: alwayscontainer_name: mysqlenvironment:- MYSQL_ROOT_PASSWORD=123456ports:- '3306:3306'- '33060:33060'volumes:- mysql-conf:/etc/mysql/conf.d- mysql-data:/var/lib/mysql- /etc/localtime:/etc/localtime:rorabbit:image: rabbitmq:3-managementrestart: alwayscontainer_name: rabbitmqports:- "5672:5672"- "15672:15672"environment:- RABBITMQ_DEFAULT_USER=rabbit- RABBITMQ_DEFAULT_PASS=rabbit- RABBITMQ_DEFAULT_VHOST=devvolumes:- rabbit-data:/var/lib/rabbitmq- rabbit-app:/etc/rabbitmq- /etc/localtime:/etc/localtime:roopensearch-node1:image: opensearchproject/opensearch:2.13.0container_name: opensearch-node1environment:- cluster.name=opensearch-cluster # Name the cluster- node.name=opensearch-node1 # Name the node that will run in this container- discovery.seed_hosts=opensearch-node1,opensearch-node2 # Nodes to look for when discovering the cluster- cluster.initial_cluster_manager_nodes=opensearch-node1,opensearch-node2 # Nodes eligibile to serve as cluster manager- bootstrap.memory_lock=true # Disable JVM heap memory swapping- "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m" # Set min and max JVM heap sizes to at least 50% of system RAM- "DISABLE_INSTALL_DEMO_CONFIG=true" # Prevents execution of bundled demo script which installs demo certificates and security configurations to OpenSearch- "DISABLE_SECURITY_PLUGIN=true" # Disables Security pluginulimits:memlock:soft: -1 # Set memlock to unlimited (no soft or hard limit)hard: -1nofile:soft: 65536 # Maximum number of open files for the opensearch user - set to at least 65536hard: 65536volumes:- opensearch-data1:/usr/share/opensearch/data # Creates volume called opensearch-data1 and mounts it to the container- /etc/localtime:/etc/localtime:roports:- 9200:9200 # REST API- 9600:9600 # Performance Analyzeropensearch-node2:image: opensearchproject/opensearch:2.13.0container_name: opensearch-node2environment:- cluster.name=opensearch-cluster # Name the cluster- node.name=opensearch-node2 # Name the node that will run in this container- discovery.seed_hosts=opensearch-node1,opensearch-node2 # Nodes to look for when discovering the cluster- cluster.initial_cluster_manager_nodes=opensearch-node1,opensearch-node2 # Nodes eligibile to serve as cluster manager- bootstrap.memory_lock=true # Disable JVM heap memory swapping- "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m" # Set min and max JVM heap sizes to at least 50% of system RAM- "DISABLE_INSTALL_DEMO_CONFIG=true" # Prevents execution of bundled demo script which installs demo certificates and security configurations to OpenSearch- "DISABLE_SECURITY_PLUGIN=true" # Disables Security pluginulimits:memlock:soft: -1 # Set memlock to unlimited (no soft or hard limit)hard: -1nofile:soft: 65536 # Maximum number of open files for the opensearch user - set to at least 65536hard: 65536volumes:- /etc/localtime:/etc/localtime:ro- opensearch-data2:/usr/share/opensearch/data # Creates volume called opensearch-data2 and mounts it to the containeropensearch-dashboards:image: opensearchproject/opensearch-dashboards:2.13.0container_name: opensearch-dashboardsports:- 5601:5601 # Map host port 5601 to container port 5601expose:- "5601" # Expose port 5601 for web access to OpenSearch Dashboardsenvironment:- 'OPENSEARCH_HOSTS=["http://opensearch-node1:9200","http://opensearch-node2:9200"]'- "DISABLE_SECURITY_DASHBOARDS_PLUGIN=true" # disables security dashboards plugin in OpenSearch Dashboardsvolumes:- /etc/localtime:/etc/localtime:rozookeeper:image: bitnami/zookeeper:3.9container_name: zookeeperrestart: alwaysports:- "2181:2181"volumes:- "zookeeper_data:/bitnami"- /etc/localtime:/etc/localtime:roenvironment:- ALLOW_ANONYMOUS_LOGIN=yeskafka:image: 'bitnami/kafka:3.4'container_name: kafkarestart: alwayshostname: kafkaports:- '9092:9092'- '9094:9094'environment:- KAFKA_CFG_NODE_ID=0- KAFKA_CFG_PROCESS_ROLES=controller,broker- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://0.0.0.0:9094- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,EXTERNAL://192.168.6.101:9094- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9093- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER- ALLOW_PLAINTEXT_LISTENER=yes- "KAFKA_HEAP_OPTS=-Xmx512m -Xms512m"volumes:- kafka-conf:/bitnami/kafka/config- kafka-data:/bitnami/kafka/data- /etc/localtime:/etc/localtime:rokafka-ui:container_name: kafka-uiimage: provectuslabs/kafka-ui:latestrestart: alwaysports:- 8080:8080environment:DYNAMIC_CONFIG_ENABLED: trueKAFKA_CLUSTERS_0_NAME: kafka-devKAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9092volumes:- kafkaui-app:/etc/kafkaui- /etc/localtime:/etc/localtime:ronacos:image: nacos/nacos-server:v2.3.1container_name: nacosports:- 8848:8848- 9848:9848environment:- PREFER_HOST_MODE=hostname- MODE=standalone- JVM_XMX=512m- JVM_XMS=512m- SPRING_DATASOURCE_PLATFORM=mysql- MYSQL_SERVICE_HOST=nacos-mysql- MYSQL_SERVICE_DB_NAME=nacos_devtest- MYSQL_SERVICE_PORT=3306- MYSQL_SERVICE_USER=nacos- MYSQL_SERVICE_PASSWORD=nacos- MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true- NACOS_AUTH_IDENTITY_KEY=2222- NACOS_AUTH_IDENTITY_VALUE=2xxx- NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789- NACOS_AUTH_ENABLE=truevolumes:- /app/nacos/standalone-logs/:/home/nacos/logs- /etc/localtime:/etc/localtime:rodepends_on:nacos-mysql:condition: service_healthynacos-mysql:container_name: nacos-mysqlbuild:context: .dockerfile_inline: |FROM mysql:8.0.31ADD https://raw.githubusercontent.com/alibaba/nacos/2.3.2/distribution/conf/mysql-schema.sql /docker-entrypoint-initdb.d/nacos-mysql.sqlRUN chown -R mysql:mysql /docker-entrypoint-initdb.d/nacos-mysql.sqlEXPOSE 3306CMD ["mysqld", "--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci"]image: nacos/mysql:8.0.30environment:- MYSQL_ROOT_PASSWORD=root- MYSQL_DATABASE=nacos_devtest- MYSQL_USER=nacos- MYSQL_PASSWORD=nacos- LANG=C.UTF-8volumes:- nacos-mysqldata:/var/lib/mysql- /etc/localtime:/etc/localtime:roports:- "13306:3306"healthcheck:test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ]interval: 5stimeout: 10sretries: 10prometheus:image: prom/prometheus:v2.52.0container_name: prometheusrestart: alwaysports:- 9090:9090volumes:- prometheus-data:/prometheus- prometheus-conf:/etc/prometheus- /etc/localtime:/etc/localtime:rografana:image: grafana/grafana:10.4.2container_name: grafanarestart: alwaysports:- 3000:3000volumes:- grafana-data:/var/lib/grafana- /etc/localtime:/etc/localtime:rovolumes:redis-data:redis-conf:mysql-conf:mysql-data:rabbit-data:rabbit-app:opensearch-data1:opensearch-data2:nacos-mysqldata:zookeeper_data:kafka-conf:kafka-data:kafkaui-app:prometheus-data:prometheus-conf:grafana-data:
各中间件访问地址:
组件(容器名) | 介绍 | 访问地址 | 账号/密码 | 特性 |
---|---|---|---|---|
Redis(redis) | k-v 库 | 你的ip:6379 | 单密码模式:123456 | 已开启AOF |
MySQL(mysql) | 数据库 | 你的ip:3306 | root/123456 | 默认utf8mb4字符集 |
Rabbit(rabbit) | 消息队列 | 你的ip:15672 | rabbit/rabbit | 暴露5672和15672端口 |
OpenSearch(opensearch-node1/2) | 检索引擎 | 你的ip:9200 | 内存512mb;两个节点 | |
opensearch-dashboards | search可视化 | 你的ip:5601 | ||
Zookeeper(zookeeper) | 分布式协调 | 你的ip:2181 | 允许匿名登录 | |
kafka(kafka) | 消息队列 | 你的ip:9092 外部访问:9094 | 占用内存512mb | |
kafka-ui(kafka-ui) | kafka可视化 | 你的ip:8080 | ||
nacos(nacos) | 注册/配置中心 | 你的ip:8848 | nacos/nacos | 持久化数据到MySQL |
nacos-mysql(nacos-mysql) | nacos配套数据库 | 你的ip:13306 | root/root | |
prometheus(prometheus) | 时序数据库 | 你的ip:9090 | ||
grafana(grafana) | 你的ip:3000 | admin/admin | ||
相关文章:
docker的与使用
1 docker初体验 1.1 docker简介 问题:为什么会有docker出现? 一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对…...
解决ubuntu18.04无法进入系统桌面
解决ubuntu18.04无法进入系统桌面 解决ubuntu18.04无法进入系统桌面前言1、原因2、解决现象总结 前言 Vmware虚拟机运行跑Linux项目,没有关掉运行的进程就关机,导致系统无法进入系统桌面,一直卡在系统的初始化界面,按下快捷键发…...
Docker学习之容器虚拟化与虚拟机的区别(day11)
文章目录 前言一、问题描述二、具体内容1. 虚拟机(VM)2. 容器虚拟化(Docker)容器虚拟化的核心技术 三、总结1. 资源占用对比2. 适用场景3. 结论 前言 在现代软件开发和部署过程中,Docker 和虚拟机(VM&…...
无人机数据链技术及运行方式详解!
一、无人机数据链技术要点 1. 通信传输技术 频段选择: 常用频段包括 L波段(1-2 GHz)、C波段(4-8 GHz)、Ku/K波段(12-40 GHz),不同频段在传输距离、带宽和抗干扰性间权衡。 低…...
【JavaEE】MyBatis - Plus
目录 一、快速使用二、CRUD简单使用三、常见注解3.1 TableName3.2 TableFiled3.3 TableId 四、条件构造器4.1 QueryWrapper4.2 UpdateWrapper4.3 LambdaQueryWrapper4.4 LambdaUpdateWrapper 五、自定义SQL 一、快速使用 MyBatis Plus官方文档:MyBatis Plus官方文档…...
设计模式 三、结构型设计模式
一、代理模式 代理设计模式(Proxy Design Pattern)是一种结构型设计模式,它为其他对象提供了一个代理,以控制对这个对象的访问。 代理模式可以用于实现懒加载、安全访问控制、日志记录等功能。简单来说,代理模式 就是通…...
视频编码器的抉择:x264、x265、libaom、vvenc 对比测试实验
264、x265、libaom、vvenc 对比测试实验 测试机器配置:Apple M1 Pro -16G编码器版本(选择自己编译):所有源码都是当前最新更新的状态,此外各类编码具体的编译过程可参考我的相关系列博客。 编码器GitHubx264git clon…...
JMeter脚本录制(火狐)
录制前准备: 电脑: 1、将JMeter证书导入,(bin目录下有一个证书,需要安装这个证书到电脑中) 2、按winr,输入certmgr.msc,打开证书,点击下一步,输入JMeter证书…...
10、Linux C 网络编程(完整版)
1、网络发展历史和分层 1.1 Internet 的历史 起源: 1957 年:苏联发射第一颗人造卫星 "Sputnik"。 1958 年:美国总统艾森豪威尔成立 DARPA(国防部高级研究计划署)。 1968 年:DARPA 提出 "…...
拼多多 anti-token unidbg 分析
声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向分析 版本7.3-7.4 都试过加密没什…...
Swoole 的 Hyperf 框架和 Go 的 Gin 框架高并发原理以及技术实现对比分析
Swoole 的 Hyperf 框架和 Go 的 Gin 框架虽然都支持高并发,但它们的实现原理、底层机制和适用场景有显著差异。以下从 高并发原理、技术实现区别、优缺点 三个方面详细分析: 一、高并发实现原理 1. Hyperf (PHP Swoole) Hyperf 的高并发能力基于 Swoo…...
CSS3学习教程,从入门到精通,CSS3 媒体查询实现响应式布局语法指南(21)
CSS3 媒体查询实现响应式布局语法指南 一、媒体查询核心语法 1. 基础语法结构 media 媒体类型 and (媒体特性) {/* 匹配条件时应用的CSS规则 */ }2. 媒体类型(可省略) 类型值说明all所有设备(默认值)screen屏幕设备print打印机…...
C#中,什么是委托,什么是事件及它们之间的关系
1. 委托(Delegate) 定义与作用 委托是类型安全的函数指针,用于封装方法,支持多播(链式调用)。核心能力:将方法作为参数传递或异步回调。 使用场景 回调机制(如异步操作完…...
【LeetCode 热题100】347:前 K 个高频元素(详细解析)(Go语言版)
🚀 力扣热题 347:前 K 个高频元素(详细解析) 📌 题目描述 力扣 347. 前 K 个高频元素 给你一个整数数组 nums 和一个整数 k,请你返回其中出现频率 前 k 高的元素。你可以按 任意顺序 返回答案。 …...
②EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关
型号 协议转换通信网关 EtherCAT 转 Modbus TCP 配置说明 网线连接电脑到模块上的 WEB 网页设置网口,电脑所连网口的网段设置成 192.168.1.X(X 是除 8 外的任一数值)后,打开浏览器,地址栏输入 192.168.1.8 ÿ…...
微服务集成测试 -华为OD机试真题(A卷、Python)
题目描述 现在有n个容器服务,服务的启动可能有一定的依赖性(有些服务启动没有依赖),其次,服务自身启动加载会消耗一些时间。 给你一个n n 的二维矩阵useTime,其中useTime[i][i]10表示服务i自身启动加载需…...
k8s常用总结
1. Kubernetes 架构概览 主节点(Master): 负责集群管理,包括 API Server、Controller Manager、Scheduler 和 etcd 存储。 工作节点(Node): 运行 Pod 和容器,包含 kubelet、kube-pr…...
【算法】并查集基础讲解
一、定义 一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。思想是用一个数组表示了整片森林(parent),树的根节点唯一标识了一个集合,只要找到了某个元素的的树根,就能确定它在哪个集合里。 …...
探索PHP的未来发展与应用趋势
PHP,作为Web开发领域的常青树,自1995年诞生以来,始终在动态网页开发中占据重要席位。随着技术的不断演进,PHP也在持续更新,以适应现代开发需求。本文将深入探讨PHP的最新发展动态及其在2025年的应用趋势。 PHP 8&…...
C#调用ACCESS数据库,解决“Microsoft.ACE.OLEDB.12.0”未注册问题
C#调用ACCESS数据库,解决“Microsoft.ACE.OLEDB.12.0”未注册问题 解决方法: 1.将C#采用的平台从AnyCpu改成X64 2.将官网下载的“Microsoft Access 2010 数据库引擎可再发行程序包AccessDatabaseEngine_X64”文件解压 3.安装解压后的文件 点击下载安…...
ubuntu22.04.5安装docker,解决安装出现的错误,解决Docker hello-world没打印出来
文章目录 前言一 安装失败解决1结合具体报错分析2 首先怀疑是VPN的问题3 直接百度报错信息4最终解决问题 二 验证Docker hello-world没打印出来总结 前言 先说一下前面的情况,使用的是公司的工作站,登录公司一个帐号使用的公司网络,使用网上…...
HMTL+JS+CSS实现贪吃蛇游戏,包含有一般模式,困难模式,还有无敌模式
HMTLJSCSS实现贪吃蛇游戏,包含有一般模式,困难模式,还有无敌模式(可以穿墙死不了,从左边进去可以从右边出来),显示当前分数和最高分,吃到的球颜色可以叠加到蛇身体上 为了适配手机端…...
vue将页面导出成word
方法一:使用 html-docx-js html-docx-js 是一个轻量级的库,可以将 HTML 转换为 Word 文档。 安装依赖 首先安装 html-docx-js: Bash深色版本 npm install html-docx-js --save创建导出逻辑 在 Vue 组件中实现导出功能的代码如下࿱…...
Spring MVC 页面跳转方案与区别
SpringMVC 的页面跳转方案主要分为 转发(Forward) 和 重定向(Redirect) 两类,具体实现方式和区别如下: 一、页面跳转方案 1. 转发(Forward) 默认方式:直…...
Open GL ES ->纹理贴图,顶点坐标和纹理坐标组合到同一个顶点缓冲对象中进行解析
XML文件 <?xml version"1.0" encoding"utf-8"?> <com.example.myapplication.MyGLSurfaceView2 xmlns:android"http://schemas.android.com/apk/res/android"android:id"id/glSurfaceView"android:layout_width"matc…...
题解:AT_arc050_c [ARC050C] LCM 111
一道比较简单的题。(我绝对不会告诉你这题我改了很久) 题目意思很简单,我就不过多解释了,我们直接进入正题。 题目要我们求 a a a 个 1 1 1 组成的数与 b b b 个 1 1 1 组成的数的最小公倍数除以 m m m 后的余数。先不考虑…...
【408--考研复习笔记】计算机网络----知识点速览
目录 一、计算机网络体系结构 1.计算机网络的定义与功能: 2.网络体系结构相关概念: 3.OSI 七层模型与 TCP/IP 模型: 4.通信方式与交换技术: 电路交换 报文交换 分组交换 5.端到端通信和点到点通信: 6.计算机…...
ISIS报文
IS-IS 报文 目录 IS-IS 报文 一、报文类型与功能 二、报文结构解析 三、核心功能特性 四、典型应用场景 五、抓包数据分析 六、总结 IS-IS(中间系统到中间系统)协议报文是用于链路状态路由协议中网络设备间交换路由信息的关键载体,其设…...
FPGA——分秒计数器
文章目录 一、实验任务二、系统模块三、工程源码四、管脚信息五、运行结果参考资料总结 一、实验任务 在DE2-115板子上用 Verilog编程实现一个分秒计数器,并具备按键暂停、按键消抖功能。 二、系统模块 分频模块 高频时钟(如50MHz)分频得到…...
【Java】JVM
一、JVM体系结构 1、虚拟机概述 虚拟机(Virtual Machine):一台虚拟的计算机,指一种特殊的软件,他可以在计算机平台和终端用户之间创建一种环境,而终端用户则是基于这个软件所创建的环境来操作软件。虚拟机…...
vue中使用geoscene无法出现弹窗
项目场景: 平日对地图加载使用不复杂的情况下,我通常采用leaflet去加载地图做一些简单的操作。但是最近需要用到arcgis发布的地图服务加载三维场景,于是又用回了geoscene(arcgis国产化)。这下暴露出很多的问题&#x…...
【Go】数组
数组Array 重点: 数组是值类型 注意点: 1. 数组:是同一种数据类型的固定长度的序列。2. 数组定义:var a [len]int,比如:var a [5]int,数组长度必须是常量,且是类型的组成部分。一旦定义&…...
【运维】Centos硬盘满导致开机时处于加载状态无法开机解决办法
Centos硬盘存储过满导致无法加载 一、准备1.现象2.根因分析3.制定救援方案问题1:无法进入系统确定分析结论 问题2:磁盘数据过多 4.后处理 一、准备 1.现象 Centos虚拟机界面卡顿,随后进行了重启操作,发现重新启动界面一直卡在加…...
JVM——模型分析、回收机制
方法区:存储已被虚拟机加载的类元数据信息(元空间) 堆:存放对象实例,几乎所有的对象实例都在这里分配内存 虚拟机栈:虚拟机栈描述的是|ava方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局…...
kafka 4.x docker启动kafka4.0.0 docker-compose启动最新版kafka 如何使用docker容器启动最新版kafka
1. 镜像选择标签: https://hub.docker.com/r/bitnami/kafka/tags 2. 命令: docker pull bitnami/kafka:4.0.0 3. docker-compose.yml 启动kafka4.0.0: version: 3services:kafka:image: bitnami/kafka:4.0.0container_name: kafkaports:- &…...
BUUCTF-web刷题篇(6)
15.PHP 知识点: ①__wakeup()//将在反序列化之后立即调用(当反序列化时变量个数与实际不符是会绕过)我们可以通过一个cve来绕过:CVE-2016-7124。将Object中表示数量的字段改成比实际字段大的值即可绕过wakeup函数。条件:PHP5<…...
MySQL篇(一):慢查询定位及索引、B树相关知识详解
MySQL篇(一):慢查询定位及索引、B树相关知识详解 MySQL篇(一):慢查询定位及索引、B树相关知识详解一、MySQL中慢查询的定位(一)慢查询日志的开启(二)慢查询日…...
QT之QML(简单示例)
需求一:点击按钮弹出菜单,并且自定义菜单弹出位置。 mouse.x 和 mouse.y 获取的是相对于 MouseArea(在这个例子中是 Button)左上角的局部坐标。如果你想要在鼠标点击位置显示 Menu,你需要将这个局部坐标转换为相对于应…...
自动化释放linux服务器内存脚本
脚本说明 使用Linux的Cron定时任务结合Shell脚本来实现自动化的内存释放。 脚本用到sync系统命令 sync的作用:sync 是一个 Linux 系统命令,用于将文件系统缓存中的数据强制写入磁盘。 在你执行reboot、poweroff、shutdown命令时,系统会默认执…...
Linux中的权限管理
一、权限的概念 在 Linux 系统的架构里,权限是构建安全堡垒的基石,精准界定了不同用户对文件与目录的操作边界,对系统安全的维护以及数据完整性的保障起着决定性作用。 1.权限的三种基础类别: 权限对文件的影响对目录的影响 读(r…...
Java对象与JSON字符串的互转
最近,工作中会涉及到Java对象与JSON字符串相互转换,虽然说并不难,但打算还是梳理一番,主要内容有: JSON 字符串 转 普通对象 普通对象 转 JSON 字符串 JSON 字符串数组 转 List 集合对象 List 集合对象 转 JSON 字符串…...
[笔记.AI]向量化
(借助 DeepSeek-V3 辅助生成) 向量化的定义 向量化(Vectorization) 是将文本、图像、音频等非结构化数据转换为高维数值向量(即一组数字)的过程。这些向量能够捕捉数据的语义、特征或上下文信息&#x…...
NSSCTF(MISC)—[justCTF 2020]pdf
相应的做题地址:https://www.nssctf.cn/problem/920 binwalk分离 解压文件2AE59A.zip mutool 得到一张图片 B5F31内容 B5FFD内容 转换成图片 justCTF{BytesAreNotRealWakeUpSheeple}...
Angular的理解
Angular 是一个由 Google 维护的全功能前端框架,适合构建复杂的企业级应用。它采用 TypeScript 作为首选语言,提供了一套完整的解决方案,包括数据绑定、依赖注入、路由、表单处理等。 1. Angular 的核心概念 1.1 组件化架构 Angular 应用由…...
广告推荐算法:COSMO算法与A9算法的对比
COSMO算法与A9算法的概念解析 1. A9算法 定义与背景: A9算法是亚马逊早期为电商平台研发的核心搜索算法,主要用于优化商品搜索结果的排序和推荐,其核心逻辑围绕产品属性与关键词匹配展开。自2003年推出以来,A9通过分析商品标题…...
10. 七大排序(含四种版本快排及优化) ******
排序算法时间复杂度(平均)时间复杂度(最坏)时间复杂度(最好)空间复杂度稳定性主要使用场景直接插入排序O(n)O(n)O(n)O(1)稳定小规模数据或基本有序数据希尔排序O(n^1.3)O(n)O(n log n)O(1)不稳定中等规模数据,对稳定性无要求选择排序O(n)O(n)O(n)O(1)不稳定小规模数…...
以下是C/C++后台开发常见的高概率面试题
一、语言基础 多态的实现 通过虚函数表(vtable)实现动态绑定,运行时根据对象类型调用对应的函数。虚函数通过virtual关键字声明,子类可重写基类虚函数112。 指针与引用的区别 指针是变量,存储地址,支持多…...
CentOS-查询实时报错日志-查询前1天业务报错gz压缩日志
最新版本更新 https://code.jiangjiesheng.cn/article/364?from=csdn 推荐 《高并发 & 微服务 & 性能调优实战案例100讲 源码下载》 1. 查询实时报错日志 物理路径(带*的放在靠后,或者不用*) cd /home/logs/java-gz-log-dir && tail -2000f java-gz-l…...
破界·共生:生成式人工智能(GAI)认证重构普通人的AI进化图谱
在当今这个科技日新月异的时代,人工智能(AI)正以惊人的速度改变着我们的世界。从智能家居到自动驾驶,从医疗诊断到金融分析,AI的应用已经渗透到社会生活的方方面面。面对如此迅猛的发展态势,我们不禁要问:人工智能的未来将走向何方?普通人又该如何把握这一历史机遇,学…...
HTTP代理:网页加速的隐形引擎
目录 引言:网页加载速度为何至关重要? 一、HTTP代理的核心加速原理 二、四大加速黑科技详解 三、实战场景性能对比 四、代理加速的隐藏代价 五、未来发展趋势 结语:智能代理的选型指南 引言:网页加载速度为何至关重要&#…...