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。如果使…...
DanKoe 视频笔记:致富之路:三个关键决策
在本节课中,我们将要学习决定个人能否实现财富积累的三个核心决策。这些决策并非关于具体的赚钱技巧,而是关于如何从根本上重塑你的思维方式和行为模式,为创造财富铺平道路。 概述 许多人渴望财富,但往往不得其法。真正的致富之…...
实战指南:基于同一份OpenSpec,用快马平台同步生成前后端代码,确保联调无忧
最近在开发一个电商平台时,我们团队遇到了前后端联调效率低下的问题。由于接口文档和实际代码存在差异,经常出现前端调用参数和后端接收不一致的情况。后来我们发现,基于OpenSpec规范同步生成前后端代码可以完美解决这个问题,这里…...
ai辅助部署openclaw:让快马智能适配ubuntu环境与反爬策略
AI辅助部署OpenClaw:让快马智能适配Ubuntu环境与反爬策略 最近在尝试用OpenClaw抓取一些动态加载的网站数据,发现直接部署基础版本根本行不通。目标网站不仅有动态渲染的内容,还设置了各种反爬机制。好在发现了InsCode(快马)平台的AI辅助开发…...
无片外电容的LDO电路设计手册:完整IP现成电路,包含过温与过流保护、带隙与BUFFER,性能...
无片外电容LDO电路设计 完整IP现成电路,具有过温保护和过流保护,带隙,BUFFER都有 性能指标已流片验证 同时有相关文献、各模块电路功能分析简化计算笔记,适合学习入门不适合纵向可以附赠一些自己学习时觉得比较有帮助的资料。 有好…...
douyin-downloader完全指南:音频高效提取的创新方法
douyin-downloader完全指南:音频高效提取的创新方法 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support…...
轻流MCP|让AI从「会回答」走向「能参与实际业务」
当越来越多企业开始把 AI 引入日常工作,一个现实问题也越来越突出: AI 怎么真正接入业务系统,而不是只停留在聊天层? 过去,很多 AI 更擅长回答问题、生成内容、整理信息。它可以帮助人更快完成写作、总结和分析&#x…...
102. 在控制平面主机名更改后恢复 Rancher 配置的 RKE2 集群
Environment 环境 Rancher provisioned RKE2 downstream cluster control plane node hostname changed, without removing the node from the cluster. Rancher 配置了 RKE2 下游集群控制平面节点的主机名更改,但未将该节点从集群中移除。 Procedure 程序It is …...
LibreCAD:完全免费的2D CAD软件终极指南,告别昂贵许可证
LibreCAD:完全免费的2D CAD软件终极指南,告别昂贵许可证 【免费下载链接】LibreCAD LibreCAD is a cross-platform 2D CAD program written in C17. It can read DXF/DWG files and can write DXF/PDF/SVG files. It supports point/line/circle/ellipse…...
从“看见光点”到“看懂世界”:视觉重建让这个世界变得更近一些
三十多年前,“让盲人重新看见”更像一句带有未来感的科学想象。而今天,这件事已经进入临床试验和真实的人体研究。视觉重建之所以被视为脑机接口里最具挑战性的方向之一,不只是因为它要解决“能不能刺激大脑”的问题,更因为它要回…...
从拆解到驱动:手把手教你用IMX6ULL驱动OV5640摄像头模块(附完整代码)
从拆解到驱动:手把手教你用IMX6ULL驱动OV5640摄像头模块(附完整代码) 1. 硬件连接与接口解析 OV5640作为一款500万像素的CMOS图像传感器,支持DVP和MIPI两种接口模式。在IMX6ULL平台上,我们选择使用DVP并行接口进行连接…...
