PHP之docker学习笔记
Docker学习笔记
- 前言: 之前学过一遍忘了 那就再来一遍
- 没啥好说的就是可以直接构建一个环境 然后方便部署
- 官网 http://www.docker.com
- 仓库 https://hub.docker.com
- Docker的基本组成 镜像 容器 仓库
安装与卸载
- 卸载
sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
- 安装
yum -y install gcc//
yum -y install gcc-c++
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# docker-ce是Docker引擎,docker-ce-cli是客户端
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 查询版本列表
yum list docker-ce --showduplicates | sort -r
# 指定版本安装17.09.0.ce版
# sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io docker-compose-plugin
sudo yum install docker-ce-17.09.0.ce docker-ce-cli-17.09.0.ce containerd.io docker-compose-plugin
# 新版本的Docker就是一个系统服务,可以直接使用启动系统服务方式启动
systemctl start docker
# 此时查看docker版本,可以看到Server: Docker Engine(Docker引擎)版本号
docker version
//卸载
systemctl stop docker
sudo yum remove docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/dockersudo rm -rf /var/lib/containerddocker run hello-world
- 阿里云镜像加速
- https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
- docker run 做了什么?先是自己找,然后去网上找镜像 然后拉到本地
docker常用命令
启动docker:systemctl start docker
停止Docker:systemctl stop docker
重启Docker:systemctl restart docker
查看状态:systemctl status docker
设置开机自启:systemctl enable docker
查看Docker版本docker version
查看Docker概要信息:docker info
查看Docker总体帮助文档:docker --help
列出本地镜像:docker images
参数:
● -a:列出所有镜像(含历史镜像)
● -q:只显示镜像ID
● -f:过滤
在远程仓库中搜索镜像:docker search 镜像名称
参数:
● -f:过滤
● --limit 数量:只展示前几项
下载镜像:docker pull 镜像名称[:tag]
不加 tag 时,默认下载最新的镜像(即tag为latest)。
查看占据的空间:docker system df
删除镜像:docker rmi -f 镜像名称/ID
可以使用空格分隔,删除多个镜像:docker rmi 镜像1 镜像2 镜像3
- docker 虚悬镜像是什么? 仓库名,标签都是none的镜像,俗称虚悬镜像
容器命令
docker pull ubuntu
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
常用的参数:
● --name:为容器指定一个名称
● -d:后台运行容器并返回容器ID,也即启动守护式容器
● -i:以交互模式(interactive)运行容器,通常与-t同时使用
● -t:为容器重新分配一个伪输入终端(tty),通常与-i同时使用。也即启动交互式容器(前台有伪终端,等待交互)
● -e:为容器添加环境变量
● -P:随机端口映射。将容器内暴露的所有端口映射到宿主机随机端口
● -p:指定端口映射
-p指定端口映射的几种不同形式:
● -p hostPort:containerPort:端口映射,例如-p 8080:80
● -p ip:hostPort:containerPort:配置监听地址,例如 -p 10.0.0.1:8080:80
● -p ip::containerPort:随机分配端口,例如 -p 10.0.0.1::80
● -p hostPort1:containerPort1 -p hostPort2:containerPort2:指定多个端口映射,例如-p 8080:80 -p 8888:3306
列出正在运行的容器:docker ps [OPTIONS]
常用参数:
● -a:列出当前所有正在运行的容器+历史上运行过的容器
● -l:显示最近创建的容器
● -n:显示最近n个创建的容器
● -q:静默模式,只显示容器编号
启动已经停止的容器:docker start 容器ID或容器名
重启容器:docker restart 容器ID或容器名
停止容器:docker stop 容器ID或容器名
强制停止容器:docker kill 容器ID或容器名
删除已经停止的容器:docker rm 容器ID或容器名
删除容器是 docker rm,删除镜像是 docker rmi,注意区分。
查看容器日志:docker logs 容器ID或容器名
查看容器内运行的进程:docker top 容器ID或容器名
查看容器内部细节:docker inspect 容器ID或容器名
进入正在运行的容器:docker exec -it 容器ID bashShell
重新进入:docker attach 容器ID
docker exec 和 docker attach 区别:
● attach直接进入容器启动命令的终端,不会启动新的进程,用exit退出会导致容器的停止
● exec是在容器中打开新的终端,并且可以启动新的进程,用exit退出不会导致容器的停止
如果有多个终端,都对同一个容器执行了 docker attach,就会出现类似投屏显示的效果。一个终端中输入输出的内容,在其他终端上也会同步的显示。
容器内文件拷贝到宿主机:docker cp 容器ID:容器内路径 目的主机路径
export:导出容器的内容流作为一个tar归档文件(对应import命令);
import:从tar包中的内容创建一个新的文件系统再导入为镜像(对应export命令);
示例:
# 导出
# docker export 容器ID > tar文件名
docker export abc > aaa.tar
# 导入
# cat tar文件 | docker import - 自定义镜像用户/自定义镜像名:自定义镜像版本号
cat aaa.tar | docker import - test/mytest:1.0.1
- 交互式容器(会返回一个终端给你使用)
-p 6379:6389 主机去访问的:docker暴露出来的 -it需要有交互
docker run -it --name=myu ubuntu /bin/bash
exit 退出
ctrl+p+q退出 容器不停止
- 守护式容器(后台运行)
docker run -d redis
docker 镜像
- Docker 中的文件存储驱动叫做 storage driver。
Docker 最早支持的stotage driver是 AUFS,它实际上由一层一层的文件系统组成,这种层级的文件系统叫UnionFS。
联合文件系统(UnionFS):Union 文件系统,是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite serveral directories into a single virtual filesystem)。
Union文件系统是Docker镜像的基础。镜像可以通过分层来进行集成,基于基础镜像可以制作具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
后来出现的docker版本中,除了AUFS,还支持OverlayFS、Btrfs、Device Mapper、VFS、ZFS等storage driver。 - bootfs和rootfs
bootfs(boot file system)主要包含 bootloader 和 kernel,bootloader主要是引导加载 kernel,Linux刚启动时会加载bootfs文件系统。
在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已经由 bootfs 转交给内核,此时系统也会卸载 bootfs。
rootfs(root file system),在bootfs之上,包含的就是典型Linux系统中的 /dev、/proc、/bin、/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu、CentOS等。
docker镜像底层层次:
对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接使用Host的Kernel,自己只需要提供rootfs就可以。所以,对于不同的Linux发行版,bootfs基本是一致的,rootfs会有差别,不同的发行版可以共用bootfs。 - docker commit 提交容器让他成为一个新的镜像
docker commit -m='' -a=‘作者’ 容器id 要创建的目标镜像名:[标签名]
要创建的镜像必须是运行中的镜像
-
推送到aliyun 直接上阿里云操作
-
docker registry 本地自己搭建的docker的镜像服务器
Docker Registry
Docker Registry是官方提供的工具,用于构建私有镜像仓库。
环境搭建
Docker Registry也是Docker Hub提供的一个镜像,可以直接拉取运行。
步骤:拉取镜像 启动Docker Registry
docker run -d -p 5000:5000 -v /app/myregistry/:/tmp/registry --privileged=true registry
docker run -it --privileged=true -v /宿主机绝对路径:/容器内目录 镜像名-v /app/myregistry/:/tmp/registry 容器数据卷,容器和主机的数据进行一个映射--privileged=true 放开权限验证(查看私服中的所有镜像)
curl http://192.168.xxx.xxx:5000/v2/_catalog
Registry会返回json格式的所有镜像目录
向Registry私仓中上传镜像
配置docker允许接收http请求
(配置方式和上传到nexus私仓相同)。
修改/etc/docker/daemon.json,添加insecure-registries允许http:
{"registry-mirros": ["https://xxxx.mirror.aliyuncs.com"],"insecure-registries": ["192.168.xxx.xxx:5000"]
}
然后重启docker:(新版本的docker会立即生效)
# centos6 的命令
sudo chkconfig daemon-reload
sudo service docker restart
# centos7 的命令
sudo systemctl daemon-reload
sudo systemctl restart docker
推送到私仓
步骤:添加一个对应私仓地址的tag
docker tag lee/myubuntu:1.0.1 192.168.xxx.xxx:5000/lee/myubuntu:1.0.1push到私仓
docker push 192.168.xxx.xxx:5000/lee/myubuntu:1.0.1查看私仓中镜像目录验证
curl http://192.168.xxx.xxx:5000/v2/_catalog
拉取验证:
docker pull 192.169.xxx.xxx:5000/lee/myubuntu:1.0.1
容器卷
- docker run -d -p 5000:5000 -v /app/myregistry/:/tmp/registry --privileged=true registry
- docker run -it --privileged=true -v /宿主机绝对路径:/容器内目录 镜像名
- docker inspect dockerpsid 查看详细信息
- 容器内部被限制只能读取不能写 docker run -it --privileged=true -v /主机:/容器:ro 镜像名 rw就是可读可写
- 容器2继承容器1的文件 docker run -it --privileged=true --volumes -from u1 --name u2 ubuntu
安装常用软件
安装mysql
- docker serach mysql
- docker pull mysql:5.7
- docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 配置的是root用户的密码
- docker exec -it 0dd7aa61f0d4 mysql -uroot -p123456
- docker exec -it 0dd7aa61f0d4 mysql -uroot -p123456 /bin/bash
简单版的Mysql会存在以下问题:
● 中文乱码
● 没有容器卷映射
启动docker容器后,可以正常的连接、创建数据库,创建表,插入数据。但是插入中文则会报错。
这是因为docker默认的字符集的问题,可以在mysql中使用以下命令查看数据库字符集:
show variables like ‘character%’;
返回的字符集中,character_set_database、character_set_server等都为latin1字符集,所以会报错。
而且因为启动容器时没有配置容器卷映射,当容器意外被删时,数据无法找回。 - 启动 Mysql 容器,并配置容器卷映射:
docker run -d -p 3306:3306 \--privileged=true \-v /app/mysql/log:/var/log/mysql \-v /app/mysql/data:/var/lib/mysql \-v /app/mysql/conf:/etc/mysql/conf.d \-e MYSQL_ROOT_PASSWORD=root \--name mysql \mysql:5.7
这个反斜杠只是起到到分割的作用 如果跑不通就删除反斜杠
在/app/mysql/conf下新建 my.cnf,通过容器卷同步给mysql实例,解决中文乱码问题:(是mysql标准的配置文件)
[client]
default-character-set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
docker restart mysql
安装redis
- docker pull redis:6.0.8
- 简单的启动Redis容器:docker run -p 6379:6379 -d redis:6.0.8
- 实际应用版Redis
步骤:
- 宿主机创建目录/app/redis
- 在/app/redis下创建文件redis.conf,主要修改以下几项配置
# 开启密码验证(可选)
requirepass 123
# 允许redis外地连接,需要注释掉绑定的IP
# bind 127.0.0.1
# 关闭保护模式(可选)
protected-mode no
# 注释掉daemonize yes,或者配置成 daemonize no。因为该配置和 docker run中的 -d 参数冲突,会导致容器一直启动失败
daemonize no
# 开启redis数据持久化, (可选)
appendonly yes
即最后的配置文件为:
3. 启动docker容器:(因为要使用自定义的配置文件,所以需要指定容器运行的命令为redis-server 容器内配置文件路径)
docker run -d -p 6379:6379 --name redis --privileged=true \-v /app/redis/redis.conf:/etc/redis/redis.conf \-v /app/redis/data:/data \redis:6.0.8 \redis-server /etc/redis/redis.conf
高级篇
mysql 主从复制
启动容器实例
docker run -p 3307:3306 \--name mysql-master \--privileged=true \-v /app/mysql-master/log:/var/log/mysql \-v /app/mysql-master/data:/var/lib/mysql \-v /app/mysql-master/conf:/etc/mysql \-e MYSQL_ROOT_PASSWORD=root \-d mysql:5.7
- 进入/app/mysql-master/conf,新建my.cnf配置文件: vim my.conf
[mysqld]
## 设置server_id, 同一个局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
重启容器实例
docker restart mysql-master
进入容器实例内
docker exec -it mysql-master /bin/bash
登录mysql,创建数据同步用户
-- 首先使用 mysql -uroot -p 登录mysql
-- 创建数据同步用户
create user 'slave'@'%' identified by '123456';
-- 授权
grant replication slave, replication client on *.* to 'slave'@'%';
flush privileges;
安装从服务器容器实例(端口号3308):
启动容器服务:
docker run -p 3308:3306 \--name mysql-slave \--privileged=true \-v /app/mysql-slave/log:/var/log/mysql \-v /app/mysql-slave/data:/var/lib/mysql \-v /app/mysql-slave/conf:/etc/mysql \-e MYSQL_ROOT_PASSWORD=root \-d mysql:5.7
进入/app/mysql-slave/conf目录,创建my.cnf配置文件:
[mysqld]
## 设置server_id, 同一个局域网内需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断
## 如:1062错误是指一些主键重复,1032是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置只读(具有super权限的用户除外)
read_only=1
修改完配置需要重启slave容器实例
docker restart mysql-slave
在主数据库中查看主从同步状态:
进入主数据库容器:
docker exec -it mysql-master /bin/bash
进入Mysql
mysql -uroot -p
查看主从同步状态
show master status;
主要查看返回结果的文件名File、当前位置Position
mall-mysql-bin.000001 769
进入从数据库容器,配置主从复制:
docker exec -it mysql-slave /bin/bash
进入数据库
mysql -uroot -p
配置从数据库所属的主数据库:
-- 格式:
-- change master to master_host='宿主机ip',master_user='主数据库配置的主从复制用户名',master_password='主数据库配置的主从复制用户密码',master_port=宿主机主数据库端口,master_log_file='主数据库主从同步状态的文件名File',master_log_pos=主数据库主从同步状态的Position,master_connect_retry=连接失败重试时间间隔(秒);change master to master_host='192.168.44.128',master_user='slave',master_password='123456',master_port=3307,master_log_file='mall-mysql-bin.000002',master_log_pos=154,master_connect_retry=30;
查看主从同步状态:
# \G 可以将横向的结果集表格转换成纵向展示。
# slave status的字段比较多,纵向展示比友好
show slave status \G;
除了展示刚刚配置的主数据库信息外,主要关注 Slave_IO_Running、Slave_SQL_Running。目前两个值应该都为 No,表示还没有开始。
开启主从同步:
start slave;
再次查看主从同步状态,Slave_IO_Running、Slave_SQL_Running都变为Yes。
主从复制测试:
在主数据库上新建库、使用库、新建表、插入数据
create database db01;
use db01;
create table t1 (id int, name varchar(20));
insert into t1 values (1, 'abc');
在从数据库上使用库、查看记录
show databases;
use db01;
select * from t1;
- 如果运行不起来就关闭防火墙
sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo systemctl stop iptables
sudo systemctl disable iptables
- 面试题 1~2亿条数据需要缓存,请问如何设计这个存储案例
- 哈希取余数进行存储优点:简单,缺点:不利于扩容
- 一致性哈希算法分区:为了解决分布式数据缓存变动,
- 哈希槽分区:
Redis集群(3主3从)
- 先空一下(回头加强一下redis再回来搞这个)
DockerFile
Dockerfile编写:
● 每条保留字指令都必须为大写字母,且后面要跟随至少一个参数
● 指令按照从上到下顺序执行
● #表示注释
● 每条指令都会创建一个新的镜像层并对镜像进行提交
Docker引擎执行Docker的大致流程:
- docker从基础镜像运行一个容器
- 执行一条指令并对容器做出修改
- 执行类似docker commit的操作提交一个新的镜像层
- docker再基于刚提交的镜像运行一个新容器
- 执行Dockerfile中的下一条指令,直到所有指令都执行完成
- FROM
基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板。Dockerfile第一条必须是FROM
# FROM 镜像名
FROM hub.c.163.com/library/tomcat
- FROM
# FROM 镜像名
FROM hub.c.163.com/library/tomcat
-MAINTAINER
镜像维护者的姓名和邮箱地址
# 非必须
MAINTAINER ZhangSan zs@163.com
- RUN
容器构建时需要运行的命令。
有两种格式:
# 等同于在终端操作的shell命令
# 格式:RUN <命令行命令>
RUN yum -y install vim
- EXPOSE
- 当前容器对外暴露出的端口。
# EXPOSE 要暴露的端口
# EXPOSE <port>[/<protocol] ....
EXPOSE 3306 33060
- WORKDIR
- 指定在创建容器后, 终端默认登录进来的工作目录。
ENV CATALINA_HOME /usr/local/tomcat
WORKDIR $CATALINA_HOME
- USER
指定该镜像以什么样的用户去执行,如果不指定,默认是root。(一般不修改该配置)
# USER <user>[:<group>]
USER patrick
- ENV
用来在构建镜像过程中设置环境变量。
这个环境变量可以在后续的任何RUN指令或其他指令中使用
# 格式 ENV 环境变量名 环境变量值
# 或者 ENV 环境变量名=值
ENV MY_PATH /usr/mytest# 使用环境变量
WORKDIR $MY_PATH
- ADD
将宿主机目录下(或远程文件)的文件拷贝进镜像,且会自动处理URL和解压tar压缩包。
COPY src dest
COPY ["src", "dest"]
# <src源路径>:源文件或者源目录
# <dest目标路径>:容器内的指定路径,该路径不用事先建好。如果不存在会自动创建
- CMD
指定容器启动后要干的事情。
# CMD <命令>
CMD echo "hello world"
构建镜像
创建名称为Dockerfile的文件,示例:
FROM ubuntu
MAINTAINER lee<lee@xxx.com>ENV MYPATH /usr/local
WORKDIR $MYPATHRUN apt-get update
RUN apt-get install net-toolsEXPOSE 80CMD echo $MYPATH
CMD echo "install ifconfig cmd into ubuntu success ....."
CMD /bin/bash
编写完成之后,将其构建成docker镜像。
命令:
# 注意:定义的TAG后面有个空格,空格后面有个点
# docker build -t 新镜像名字:TAG .
docker build -t ubuntu:1.0.1 .
虚悬镜像
虚悬镜像:仓库名、标签名都是 的镜像,称为 dangling images(虚悬镜像)。
在构建或者删除镜像时可能由于一些错误导致出现虚悬镜像。
例如:# 构建时候没有镜像名、tag
docker build .
虚悬镜像一般是因为一些错误而出现的,没有存在价值,可以删除:
# 删除所有的虚悬镜像
docker image prune
构建
- 暂时为空
docker network
docker安装并启动服务后,会在宿主机中添加一个虚拟网卡。
在Docker服务启动前,使用 ifconfig 或 ip addr 查看网卡信息:
● ens33或eth0:本机网卡
● lo:本机回环网络网卡
● 可能有virbr0(CentOS安装时如果选择的有相关虚拟化服务,就会多一个以网桥连接的私网地址的virbr0网卡,作用是为连接虚拟网卡提供NAT访问外网的功能。如果要移除该服务,可以使用 yum remove libvirt-libs.x86_64)
使用 systemctl start docker启动Docker服务后,会多出一个 docker0 网卡。
作用:
● 容器间的互联和通信以及端口映射
● 容器IP变动时候可以通过服务名直接网络通信而不受到影响
Docker容器的网络隔离,是通过Linux内核特性 namespace和 cgroup 实现的
docker网络命令
查看Docker网络模式:docker network ls
如果没有修改过docker network,则默认有3个网络模式:
● bridge
● host
● none
添加Docker网络:
docker network add xxx
删除Docker网络:
docker network rm xxx
查看网络元数据:
docker network inspect xxx
删除所有无效的网络:
docker network prune
Docker 网络模式
Docker 的网络模式:
网络模式 简介 使用方式
bridge为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,默认为该模式 --network bridge
host 容器将不会虚拟出自己的网卡、配置自己的IP等,而是使用宿主机的IP和端口 --network host
none 容器有独立的 Network namespace,但并没有对齐进行任何网络设置,如分配 veth pari和 网桥连接、IP等
container 新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等
查看某个容器的网络模式:
通过inspect获取容器信息,最后20行即为容器的网络模式信息
docker inspect 容器ID | tail -n 20
透过生活进入生命
相关文章:

PHP之docker学习笔记
Docker学习笔记 前言: 之前学过一遍忘了 那就再来一遍没啥好说的就是可以直接构建一个环境 然后方便部署官网 http://www.docker.com仓库 https://hub.docker.comDocker的基本组成 镜像 容器 仓库 安装与卸载 卸载 sudo yum remove docker \docker-client \dock…...

基于树莓派4B与STM32的UART串口通信实验(代码开源)
在现代嵌入式系统中,树莓派和STM32的结合使用已成为一种流行趋势,它们各自承担不同的角色,实现优势互补。树莓派以其强大的计算能力处理复杂算法,而STM32则以其高效的控制能力执行实际的硬件操作。本文将详细介绍如何实现基于树莓…...

【云服务器系列】基于华为云OBS实现Picgo和Typora的完美融合
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

IIC协议
一、IIC协议 1.1 IIC协议概述 IIC全称Inter-Integrated Circuit (集成电路总线) 是由PHILIPS(飞利浦)公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备。IIC属于半双工同步通信方式 特点 简单性和有效性。 由于接口直接在组件之上,…...

如何在linux系统上部署nginx
1)首先去 nginx.org/download 官网下载你所需要的版本 我这里是下载的 nginx-1-23-3.tar.gz 2)然后执行 yum -y install lrzsz 安装文件上传软件 执行 rz 选择你下载nginx的位置进行上传 yum -y install lrzsz 3)执行 tar -zxvf nginx-1.23…...

香港网站服务器抵御恶意攻击的一些措施
香港网站服务器因为在互联网中扮演着重要的角色,因此也在面临着网络中各种恶意攻击的威胁,为了确保香港网站服务器的安全和稳定运行,可以通过安全措施来进行防御,本文就来分享一些香港网站服务器来抵御恶意攻击的关键措施。 一、网…...

实战:docker部署filesite.io完美解决家庭相册需求-2024.8.10(测试成功)
https://wiki.onedayxyy.cn/docs/filesite.io-photot-install-full...

美团到店面经
redis中大key引起的问题 1、阻塞请求 Big Key对应的value较大,我们对其进行读写的时候,需要耗费较长的时间,这样就可能阻塞后续的请求处理。Redis的核心线程是单线程,单线程中请求任务的处理是串行的,前面的任务完不成…...

【CSS入门】第五课 - font字体
这一节,我们说一说font这个字体。做网页开发,网页中几乎不可能没有文字的,为了使网页更漂亮,用户体验更好。人们可算是绞尽脑汁,其中一部分就是在字体上下的大功夫。 接下来,我们学习一下,font…...

STM32-门电路-储存器-寄存器-STM32f1-MCU-GPIO-总线-keil5-点led-寄存器编程
1、门电路 门电路组成简单加法器: 二进制对电路的影响: 0和1代表无和有; 以下图例,演示与门:左1右1输出1; 电平标准:使用不同的电压表示数字0和1; 高电平:1࿱…...

【动态规划算法题记录】343. 整数拆分 | 96.不同的二叉搜索树
整数拆分 题目🔗 题目描述 给定一个正整数 n ,将其拆分为 k个正整数的和(k > 2),并使这些整数的乘积最大化。 返回你可以获得的最大乘积 。 思路分析 dp数组含义:dp[i]表示整数i拆分后的最大乘积。…...

网页上预览Excel文件
如何运行: 需要发布在服务器 如Tomcat 实例图片: 需要展示的文件: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>excel预览</title><link rel"stylesheet" href"…...

Unity射击游戏开发教程:(31)制造一定追踪行为的敌人
在本文中,我们将介绍如何在两种敌人行为之间切换。本文是前两篇文章的延续,分别介绍了敌人躲避玩家射击以及敌人不断旋转并向玩家射击的情况。我只是介绍如何在这两种行为之间进行转换。 这种新的敌人行为的目标: 当不开火时,敌人可以躲避玩家的射击。射击时,敌人无法躲避…...

springboot mybatis plus 固定查询条件及可选查询条件的组合查询,使用QueryWrapper.and()来解决。
1、我们在写查询SQL的时候,经常会碰到,比如,同一个类别下的某一个编号的物料信息,或者是同一批次的物料库存问题等等。 所属类别fid物料编号bm物料批次pc110.01.0220240807110.01.0320240807 210.02.0120240805 2、那么我…...

使用ollama取代openai的api进行graphRAG失败记录
pip install ollama pip install langchain_ollama graph_documents llm_transformer.convert_to_graph_documents(split_documents) print(graph_documents) 偶尔会成功,但是大部分是失败的: 报错记录如下,暂时没想到好的办法ÿ…...

MyBatis 配置与测试方式
目录 一,什么是MyBatis 二,准备工作 创建项目 配置数据库连接 持久层代码 单元测试 一,什么是MyBatis 简单来说,MyBatis 是一款优秀的持久层框架,用于简化JDBC的开发,能更简单完成程序与数据库之间…...

C#实现代理服务器
在C#中实现一个简单的代理服务器,可以使用System.Net.Sockets命名空间下的TcpListener类来监听客户端的连接请求,并使用TcpClient来处理与客户端的通信。以下是一个简单的代理服务器示例: using System; using System.IO; using System.Net;…...

react的路由实战使用
环境配置:vitetsreact18 1、安装包 npm i react-router-dom 2、 根路由配置以及路由挂载 a、在src下面创建router文件夹配置简单的路由信息: router/index.tsx import { createBrowserRouter } from "react-router-dom"; import UserLogin…...

python 字典转成类 构建类
目录 python 字典转成类 复杂嵌套示例: 动态实例化类 太好用了! python 字典转成类 class DictToClass:def __init__(self, dictionary):for key, value in dictionary.items():if isinstance(value, dict):# 如果值是字典,递归转换为类的实例setattr(self, key, DictToC…...

springboot 过滤器
1、过滤器的实现 springboot中过滤器通过实现接口Filter并重写init、doFilter、destroy三个方法。在三个方法中加入自己的业务逻辑处理。 【注意】Filter接口的完整包名在不同的jdk版中中的变化。这里示例中使用的版本为 open-jdk17。完整名称 jakarta.servlet.Filter。如果使…...

【C语言篇】深入理解指针1
文章目录 内存和地址内存编址 指针变量和地址取地址操作符指针变量和解引用操作符指针变量指针变量类型解引用操作符指针变量的大小 指针变量类型的意义指针的解引用指针-整数void*指针 const修饰指针指针运算指针-整数指针-指针指针的关系运算 野指针野指针成因如何规避野指针…...

IAP程序升级 与 电脑BIOS 的关系
IAP (In-Application Programming) 程序升级 IAP程序升级是一种技术,允许设备在运行过程中更新其自身的固件或软件,而不需要外部工具或设备的介入。这种技术特别适用于嵌入式系统和物联网(IoT)设备。其主要由三部分构成࿰…...

Java使用MQTT协议
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种轻量级的、基于发布/订阅模式的物联网通信协议。它构建于TCP/IP协议之上,由IBM在1999年发布。MQTT的主要特点包括: 轻量级与高效:M…...

等级+时间的优先级算法
简介 本算法为等级与时间结合计算对应优先级逻辑 等级越高者优先级越高 同等级下,时间越小者优先级越高 实现 主方法 calculatePriority import com.zk.blog.enums.TypeEnum; import org.apache.commons.lang3.StringUtils;/*** program: * description:* autho…...

物流仓库安全视频智能管理方案:构建全方位、高效能的防护体系
一、背景分析 随着物流行业的快速发展和仓储需求的日益增长,仓库安全成为企业运营中不可忽视的重要环节。传统的人工监控方式不仅效率低下,且难以做到全天候、无死角覆盖,给仓库资产和人员安全带来潜在风险。因此,引入仓库安全视…...

jackson反序列化漏洞
jackson反序列化漏洞 反序列化漏洞触发根因jackson介绍jackson反序列化漏洞关键点enableDefaultTypingactivateDefaultTypingJsonTypeInfo 漏洞触发场景漏洞复现环境引入依赖pocactivateDefaultTypingenableDefaultTypingJsonTypeInfo 参考 很久没写blog,最近慢慢开…...

Java | Leetcode Java题解之第328题奇偶链表
题目: 题解: class Solution {public ListNode oddEvenList(ListNode head) {if (head null) {return head;}ListNode evenHead head.next;ListNode odd head, even evenHead;while (even ! null && even.next ! null) {odd.next even.nex…...

100 Exercises To Learn Rust 挑战!准备篇
公司内部的学习会非常活跃!我也参与了Rust学习会,并且一直在研究rustlings。最近,我发现了一个类似于rustlings的新教程网站:Welcome - 100 Exercises To Learn Rust。 rustlings是基于Rust的权威官方文档《The Rust Programming…...

瑞_RabbitMQ_初识MQ
文章目录 1 初识MQ1.1 同步调用1.1.1 同步调用的优势1.1.2 同步调用的缺点 1.2 异步调用1.2.1 异步调用的角色1.2.2 异步调用的优势1.2.3 异步调用的缺点1.2.4 异步调用的场景 1.3 MQ技术选型 2 RabbitMQ2.1 安装2.1.1 资源准备2.1.2 安装步骤 2.2 RabbitMQ架构2.3 RabbitMQ管理…...

系统内存管理:虚拟内存、内存分段与分页、页表缓存TLB以及Linux内存管理
虚拟内存 虚拟内存是一种操作系统提供的机制,用于将每个进程分配的独立的虚拟地址空间映射到实际的物理内存地址空间上。通过使用虚拟内存,操作系统可以有效地解决多个应用程序直接操作物理内存可能引发的冲突问题。 在使用虚拟内存的情况下࿰…...