Docker 学习笔记:从入门到部署,实战演练全流程!
📌 开篇:为什么要学 Docker?
还在为环境不一致、部署麻烦、依赖冲突头疼吗?Docker 让一切变得简单!作为现代开发和运维的神器,Docker 让我们可以用 一句命令 解决 “在我电脑上能跑” 的问题。今天,我们就来系统整理一下 Docker 的学习笔记,让你轻松上手,并能在实际项目中用得上!
Docker 常用命令
镜像命令
docker images
docker images 查看所有本地的主机上的镜像
[root@VM-16-5-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 6 months ago 13.3kB
执行解释
KEY | 结果解释 |
---|---|
REPOSITORY | 镜像的仓库源 |
TAG | 镜像的标签 |
IMAGE ID | 镜像的ID |
CREATED | 镜像的创建时间 |
SIZE | 镜像的大小 |
命令参数可选项 -a -q
[root@VM-16-5-centos ~]# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 6 months ago 13.3kB
[root@VM-16-5-centos ~]# docker images -q
feb5d9fea6a5
docker search
docker search 搜索镜像
[root@VM-16-5-centos ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12393 [OK]
mariadb MariaDB Server is a high performing open sou… 4770 [OK]
docker pull
docker pull 拉取镜像
# 下载镜像 docker pull 镜像名[:tag]
[root@VM-16-5-centos ~]# docker pull mysql
Using default tag: latest # 如果不写tag,默认就是latest
latest: Pulling from library/mysql
f003217c5aae: Pull complete # 分层下载,docker image的核心 联合文件系统
65d94f01a09f: Pull complete
43d78aaa6078: Pull complete
a0f91ffbdf69: Pull complete
59ee9e07e12f: Pull complete
04d82978082c: Pull complete
70f46ebb971a: Pull complete
db6ea71d471d: Pull complete
c2920c795b25: Pull complete
26c3bdf75ff5: Pull complete
9ec1f1f78b0e: Pull complete
4607fa685ac6: Pull complete
Digest: sha256:1c75ba7716c6f73fc106dacedfdcf13f934ea8c161c8b3b3e4618bcd5fbcf195 # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址
# docker pull mysql命令等价于 docker pull docker.io/library/mysql:latest# 指定版本下载 前提官网仓库需要有
[root@VM-16-5-centos ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
f003217c5aae: Already exists
65d94f01a09f: Already exists
43d78aaa6078: Already exists
a0f91ffbdf69: Already exists
59ee9e07e12f: Already exists
04d82978082c: Already exists
70f46ebb971a: Already exists # 有依赖已经有的就不会再次下载
ba61822c65c2: Pull complete
dec59acdf78a: Pull complete
0a05235a6981: Pull complete
c87d621d6916: Pull complete
Digest: sha256:1a73b6a8f507639a8f91ed01ace28965f4f74bb62a9d9b9e7378d5f07fab79dc
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
docker rmi
docker rmi -f 镜像ID删除镜像
[root@VM-16-5-centos ~]# docker rmi -f f26e21ddd20d
Untagged: mysql:5.7
Untagged: mysql@sha256:1a73b6a8f507639a8f91ed01ace28965f4f74bb62a9d9b9e7378d5f07fab79dc
Deleted: sha256:f26e21ddd20df245d88410116241f3eef1ec49ce888856c95b85081a7250183d
Deleted: sha256:c607cd1716e1e3f52d37b391b9e48207c15b9de687c49539c42b7c7411b8a845
Deleted: sha256:18d0239fa88c234ffcde52288f532ac4f69d052964d6605df32fb2e3a197bbf9
Deleted: sha256:8d1d80a87e029e4729a56a87e38d54b9ef2ca1af404e13af1feadeba53745529
Deleted: sha256:1ac7c17dadb8b439a4034925f290a2f9288068b4192669bed1a614c4057c0c1b
# 删除所有镜像 (其中docker images -aq查询所有镜像ID)
[root@VM-16-5-centos ~]# docker rmi -f $(docker images -aq)
# 删除多个容器
[root@VM-16-5-centos ~]# docker rmi -f 容器ID1 容器ID2 容器ID3
容器命令
说明:我们有了镜像才可以创建容器,下载一个centos镜像来测试
docker pull centos
新建容器并且启动
docker run [可选参数] image
# 参数说明
--name="Name" 容器名称 用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 eg. -p 8080:8080-p ip:主机端口:容器端口-p 主机端口:容器端口 (常用)-p 容器端口-p 随机指定端口
# 测试
docker run -it centos /bin/bash # 启动并且进入容器
exit # 退出容器
列出所有运行的容器
docker ps # 列出当前正在运行的容器
docker ps -a # 列出当前正在运行的容器 + 列出历史已经运行的容器
docker ps -n=? # 显示最近创建的容器
docker ps -q # 只显示正在运行容器的编号
退出容器
exit # 直接容器停止并退出
Ctrl + P + Q # 容器不停止退出
删除容器
docker rm 容器id # 删除指定容器,不能删除正在运行的容器,如果强制删除,需要rm -f
docker rm -f $(docker ps -aq) # 删除所有容器
启动和停止容器
docker start 容器id
docker restart 容器id
docker stop 容器id
docker kill 容器id
进入容器
进入容器命令
# 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置以实现# 进入容器命令命令
# 方式一 docker exec -it 容器id bashShell
docker exec -it 容器id /bin/bash
[root@VM-16-5-centos ~]# docker exec -it 8b0d2f432376 /bin/bash# 方式二 docker attach 容器id
[root@VM-16-5-centos ~]# docker attach 03d21bad4539
[root@03d21bad4539 /]# #正在执行的代码# 区别# docker exec # 进入容器后开启一个新的终端,可以在里面操作 【常用】
# docker attach # 进入容器正在执行的终端,不会启动新的进程
常用命令
后台启动容器命令
# 命令 docker run -d 镜像# 执行完成之后出现问题 docker ps 发现centos 停止# 原因:docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止# 测试
docker run -it centos /bin/bash # 启动并且进入容器
Ctrl + P + Q # 容器不停止退出
docker ps # 此方式存在进程# 测试过程
[root@VM-16-5-centos ~]# docker run -it centos /bin/bash
[root@265fad67c23c /]# [root@VM-16-5-centos ~]#
[root@VM-16-5-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
265fad67c23c centos "/bin/bash" 56 seconds ago Up 55 seconds naughty_dhawan
[root@VM-16-5-centos ~]# docker logs -f -t --tail 10 265fad67c23c
查看日志
docker logs -f -t --tail [行数] [容器id]
# eg.
[root@VM-16-5-centos ~]# docker logs -f -t --tail 10 265fad67c23c
2022-04-11T16:28:25.267052701Z bash: hostory: command not found
2022-04-11T16:28:29.301653166Z [root@265fad67c23c /]# history
2022-04-11T16:28:29.301684360Z 1 ls
2022-04-11T16:28:29.301713366Z 2 ll
2022-04-11T16:28:29.301717403Z 3 hostory
2022-04-11T16:28:29.301721227Z 4 history
2022-04-11T16:28:32.148697734Z [root@265fad67c23c /]# pwd
2022-04-11T16:28:32.148726863Z /
2022-04-11T16:28:32.354371895Z [root@265fad67c23c /]#
2022-04-11T16:28:32.557457658Z [root@265fad67c23c /]#
测试过程
[root@VM-16-5-centos ~]# docker run -d centos /bin/sh -c "while true;do echo kamila; sleep 1; done"
9f4e032553ee5bdebcc3f7db594276a4317a5ee96e7f035dff14fbb7c8f9d7d8
[root@VM-16-5-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9f4e032553ee centos "/bin/sh -c 'while t…" 8 seconds ago Up 7 seconds xenodochial_elion
[root@VM-16-5-centos ~]# docker logs -f -t --tail 5 9f4e032553ee
2022-04-11T16:39:19.477204322Z kamila
2022-04-11T16:39:20.479143262Z kamila
2022-04-11T16:39:21.481326571Z kamila
关于 /bin/sh 直接执行 shell 脚本
[root@57e9286eec0d /]# /bin/sh -c "echo kamila8"
kamila8
[root@57e9286eec0d /]# /bin/bash -c "echo kamila8"
kamila8
查看容器中进程信息
[root@VM-16-5-centos ~]# docker top 57e9286eec0d
查看镜像源数据
[root@VM-16-5-centos ~]# docker inspect 57e9286eec0d
进入当前正在运行的容器
进入容器命令命令
# 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置以实现# 进入容器命令命令
# 方式一 docker exec -it 容器id bashShell
docker exec -it 容器id /bin/bash# 方式二 docker attach 容器id
[root@VM-16-5-centos ~]# docker attach 03d21bad4539
[root@03d21bad4539 /]# #正在执行的代码# 区别# docker exec # 进入容器后开启一个新的终端,可以在里面操作 【常用】
# docker attach # 进入容器正在执行的终端,不会启动新的进程
从容器拷贝文件到外部主机上
docker cp 容器id:容器内的路径 当前主机目的目录
[root@VM-16-5-centos tmp0403]# docker cp 03d21bad4539:/tmp0412/readme /tmp/tmp0403/# 拷贝是一个手动过程,后续使用 -v 卷技术,可以实现自动同步 eg. 容器内/home 与 主机 /home 对应同步
Docker 部署实践
部署 Nginx
# 拉取镜像
docker pull nginx
# 启动镜像
docker run -d --name nginx01 -p 80:80 nginx
# 运行测试
[root@VM-16-5-centos ~]# docker run -d --name nginx01 -p 8080:80 nginx
479af478aa8eabfa6d980924b9c40c9b44c6a6e1d542d38b0b03e4c7e0e8325f
[root@VM-16-5-centos ~]# curl localhost:8080
# -d 后台运行
# --name 给容器取名
# -p 宿主机端口:容器内部端口# 进入nginx 进入容器
[root@VM-16-5-centos ~]# docker exec -it nginx01 /bin/bash
root@0a44ad83dfe5:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginxexit # 退出容器
我们每次改动 nginx 配置文件,都需要进入容器内部?十分麻烦,我要是可以在容器外部提供一个映射路径,达到在容器修改文件名,容器内部就可以自动修改?使用 -v 数据卷技术进行处理。run -v /user/share/nginx /nginx/conf 这样可以在主机上修改文件并且容器内保持同步。
部署 Tomcat
下载指定 Tomcat 版本需要先看下官网是否有对应版本,查询地址:https://hub.docker.com/
# 官网使用示例 官网方法用完即删除 -it --rm
docker run -it --rm tomcat:9.0
# 拉取镜像
[root@VM-16-5-centos ~]# docker pull tomcat:9.0
# 启动镜像 -d 后台运行
docker run -d --name tomcatv9 -p 81:8080 tomcat# 进入容器
[root@VM-16-5-centos ~]# docker exec -it tomcatv9 /bin/bash# 由于下载镜像阉割版
root@a4e43d29503d:/usr/local/tomcat# cp -r webapps.dist/* webapps/# 拷贝完目录之后再次访问81可以正常进入tomcat
💡🤔 思考问题:以后部署项目,如果每次都要进入容器是不是十分麻烦?我要是可以在容器外部提供一个映射路径,webapps,我们在外部放置项目,就自动同步到内部就好了。
Docker 镜像
如何自己打包镜像
docker commit 提交容器成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
官网 Tomcat 修改为例
# 启动一个默认的tomcat# 发现tomcat是没有webapps应用 # 自己拷贝自定义的目录至webapps目录下面
root@b3e1c2ff8af0:/usr/local/tomcat# cp -r webapps.dist/* webapps
# 修改完成之后将我们操作过的容器通过commit提交镜像
docker commit -a="ljs" -m="add weapps..." b3e1c2ff8af0 tomcat02:1.0
Docker 镜像加速
使用腾讯云 Docker 镜像源加速镜像下载
执行以下命令,打开 /etc/docker/daemon.json 配置文件。
vim /etc/docker/daemon.json
按 i切换至编辑模式,添加以下内容,并保存。
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com"
]
}
执行以下命令,重启 Docker 即可。示例命令以 CentOS 7 为例。
sudo systemctl restart docker
Docker 容器数据卷
什么是容器数据卷?
🤔 docker 理念回顾
📌 如果数据都存在容器中,那我们删除容器,数据就会丢失!
📌 解决方案:数据可以持久化。例如MySQL,需要将数据存储下来。容器之间可以有一个数据共享的技术!Docker 中产生的数据,同步到本地!这就是数据卷的技术!
✅ 我们可以通过目录的挂载,将我们的容器内的目录,挂载到Linux上面!将容器中MySQL文件系统挂载出来,/usr/mysql挂载到Linux主机的/home/mysql下,即容器的持久化和同步操作!容器间的数据可以进行共享!
使用数据卷
# 方式一:使用命令直接挂载 -v
docker run -it -v 主机目录:/容器目录 centos /bin/bash[root@VM-16-5-centos ~]# docker run -it -v /home/ceshi:/home centos /bin/bash# 主机/home目录新建文件会同步至容器/home/ceshi 同样容器内新建也会同步至主机的对应目录下# 容器信息查看
[root@VM-16-5-centos ceshi]# docker inspect 60bb7ebd0884 ..."Mounts": [{"Type": "bind","Source": "/home/ceshi", # docker容器内地址"Destination": "/home", # 主机地址"Mode": "","RW": true,"Propagation": "rprivate"}],...# 即使容器停止,主机上目录更改的文件在容器启动时会出现一样的效果
实战:安装MySQL
思考:MySQL数据持久化
# 获取镜像
docker pull mysql:5.7
# 运行容器
# -v 映射配置文件和数据目录
# -e 配置MySQL密码
# -p 端口映射
# -d 后台运行
docker run -d -p 3310:3306 -v /hmoe/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d --name mysql01 mysql:5.7# 删除容器
docker rm -f mysql01
# 挂载到本地的数据卷依旧没有丢失,这就实现容器的数据持久化功能
具名和匿名挂载
# 匿名挂载 -v 容器内路径; -P 随机映射端口; -p 3306:3360 指定映射端口
docker run -d -P -name -v /etc/nginx nginx
# 查看所有卷的情况 docker volume --help
[root@VM-16-5-centos home]# docker volume ls
DRIVER VOLUME NAME
local 0a419b7ad1d86e8e4d9710a694fc396382a9b214e2a1cdffbb10af3ff6f27752
[root@VM-16-5-centos home]#
# 具名挂载
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
# 查看卷情况
[root@VM-16-5-centos home]# docker volume ls
DRIVER VOLUME NAME
local 0a419b7ad1d86e8e4d9710a694fc396382a9b214e2a1cdffbb10af3ff6f27752
local juming-nginx
# 通过 -v 卷名:容器内路径# 查看卷详情具体位置
[root@VM-16-5-centos home]# docker volume juming-nginx
[{"CreatedAt": "2022-04-16T16:21:45+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data","Name": "juming-nginx","Options": null,"Scope": "local"}
]
# 没有指定目录的情况下容器的卷都在/var/lib/docker/volumes目录下面
docker所有容器内的卷,没有指定目录的情况下都在/var/lib/docker/volumes目录下面,我们可以通过具名挂载的方式方便找到我们的卷,大多数情况在使用具名挂载的方式。
# 挂载
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主机路径::容器内路径 # 指定路径挂载
数据卷容器
数据卷容器间同步,即多个容器mysql容器间同步。
# 启动3个容器# 启动 docker01
[root@VM-16-5-centos ~]# docker run -it --name docker01 kamila/centos
[root@6e4374ed8b07 /]# # 启动 docker02
[root@VM-16-5-centos ~]# docker run -it --name docker02 --volumes-from docker01 kamila/centos
[root@6de1e5911994 /]# # 此时volume01 volume02 目录同步# 启动 docker03
[root@VM-16-5-centos ~]# docker run -it --name docker03 --volumes-from docker01 kamila/centos# 容器间数据完全同步
[root@9a1c6a43bb81 volume01]# touch docker03
[root@9a1c6a43bb81 volume01]# ls -l
total 0
-rw-r--r-- 1 root root 0 Apr 18 14:24 docker01
-rw-r--r-- 1 root root 0 Apr 18 14:24 docker02
-rw-r--r-- 1 root root 0 Apr 18 14:27 docker03# 删除容器docker01
[root@VM-16-5-centos ~]# docker rm -f 6e4374ed8b07
6e4374ed8b07# docker03 docke02 数据仍然存在
MySQL数据同步
多个MySQL数据同步实现
# 第一个MySQL
docker run -d -p 3312:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d --name mysql02 mysql:5.7# 第二个MySQL
docker run -d -p 3313:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d --name mysql03 --volumes-from mysql02 mysql:5.7# 数据库数据同步
结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。但是一旦父容器持久化到本地,这个时候容器删除,本地数据不会删除。
DockerFile
DockerFile 介绍
Dockerfile 就是用来构建 docker 镜像的构建文件!命令脚本!通过脚本生成镜像,镜像是一层一层的,每个命令就是一层。
DockerFile 构建过程
# docker 测试挂载目录
[root@VM-16-5-centos ~]# cd /home/
[root@VM-16-5-centos home]# mkdir docker-test-volume# 进入目录
[root@VM-16-5-centos home]# cd docker-test-volume/
# 创建脚本文件
[root@VM-16-5-centos docker-test-volume]# vi dockerfile1
脚本文件内容
# 文件中内容 指令大写 每一个指令就是一层镜像 VOLUME挂载
FROM centosVOLUME ["volume01","volume02"]CMD echo "- - - - end - - - -"CMD /bin/bash
构建命令
# 构建命令 .代表当前目录
docker build -f dockerfile1 -t kamila/centos .[root@VM-16-5-centos docker-test-volume]# docker build -f dockerfile1 -t kamila/centos .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos---> 5d0da3dc9764
Step 2/4 : VOLUME ["volume01","volume02"]---> Running in 8b129a37455e
Removing intermediate container 8b129a37455e---> 010771923d9b
Step 3/4 : CMD echo "- - - - end - - - -"---> Running in e47388cba239
Removing intermediate container e47388cba239---> 557e5b6304dd
Step 4/4 : CMD /bin/bash---> Running in b8368c5e839f
Removing intermediate container b8368c5e839f---> adb3afd6cf9b
Successfully built adb3afd6cf9b
Successfully tagged kamila/centos:latest# 查看构建结果
[root@VM-16-5-centos docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kamila/centos latest adb3afd6cf9b 39 seconds ago 231MB# 运行镜像
[root@VM-16-5-centos docker-test-volume]# docker run -it adb3afd6cf9b /bin/bash
[root@0ef312830664 /]# # 挂载目录 volume01 volume02 该方式为匿名挂载
[root@0ef312830664 /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x 5 root root 360 Apr 18 13:31 dev
drwxr-xr-x 1 root root 4096 Apr 18 13:31 etc
drwxr-xr-x 2 root root 4096 Nov 3 2020 home
lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------ 2 root root 4096 Sep 15 2021 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 2020 media
drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt
drwxr-xr-x 2 root root 4096 Nov 3 2020 opt
dr-xr-xr-x 134 root root 0 Apr 18 13:31 proc
dr-xr-x--- 2 root root 4096 Sep 15 2021 root
drwxr-xr-x 11 root root 4096 Sep 15 2021 run
lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 2020 srv
dr-xr-xr-x 13 root root 0 Apr 3 14:06 sys
drwxrwxrwt 7 root root 4096 Sep 15 2021 tmp
drwxr-xr-x 12 root root 4096 Sep 15 2021 usr
drwxr-xr-x 20 root root 4096 Sep 15 2021 var
drwxr-xr-x 2 root root 4096 Apr 18 13:31 volume01
drwxr-xr-x 2 root root 4096 Apr 18 13:31 volume02# 容器内与容器外挂载目录共享情况查看
[root@VM-16-5-centos ~]# docker inspect 容器id
...
dockerfile 方式构建镜像通常经常使用,假设构建镜像的时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!
Docker 使用流程总结
1️⃣ 编写 Dockerfile 📝 —— 定义容器环境和应用运行方式。
2️⃣ 构建镜像 (docker build) 🔨 —— 将 Dockerfile 生成可复用的镜像。
3️⃣ 运行容器 (docker run) 🚀 —— 基于镜像启动应用。
4️⃣ 发布镜像 (docker push) 🌍 —— 将镜像上传到远程仓库,便于共享与部署。
DockerFile指令
FROM # 基础镜像
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤:tomcat镜像,tomcat的压缩包(添加内容)
WORKDIR # 镜像工作目录
VOLUME # 容器卷 挂载目录位置
EXPOSE # 指定暴露端口
CMD # 指定容器启动时要运行的命令 eg. cmd echo "start." 只有最后一个会生效
ENTRYPOINT # 指定容器启动时要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承 Dockerfile 时就会运行 ONBUILD 的指令
COPY # 将文件拷贝到目录中
ENV # 构建时设置环境变量
实战
编写构建自己的 dockerfile 文件!
# 编写自己的dockerfile文件
[root@VM-16-5-centos home]# cd dockerfile/
/home/dockerfile[root@VM-16-5-centos dockerfile]# vim mydockerfile-centosFROM centosMAINTAINER kamila<pitt1997@foxmail.com>ENV MYPATH /usr/localWORKDIR $MYPATH# RUN yum -y install vim# RUN yum -y install net-toolsEXPOSE 80CMD echo $MYPATHCMD echo "- - - end - - - "CMD /bin/bash# 开始构建
[root@VM-16-5-centos dockerfile]# docker build -f mydockerfile-centos -t mycentos:0.1 .# docker history构建历史查看
[root@VM-16-5-centos dockerfile]# docker history 12766a6745ee
IMAGE CREATED CREATED BY SIZE COMMENT
12766a6745ee 2 weeks ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B
<missing> 2 weeks ago /bin/sh -c #(nop) EXPOSE 80 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENTRYPOINT ["/docker-entr… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) COPY file:09a214a3e07c919a… 4.61kB
<missing> 2 weeks ago /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7… 1.04kB
<missing> 2 weeks ago /bin/sh -c #(nop) COPY file:0b866ff3fc1ef5b0… 1.96kB
<missing> 2 weeks ago /bin/sh -c #(nop) COPY file:65504f71f5855ca0… 1.2kB
<missing> 2 weeks ago /bin/sh -c set -x && addgroup --system -… 61.1MB
<missing> 2 weeks ago /bin/sh -c #(nop) ENV PKG_RELEASE=1~bullseye 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV NJS_VERSION=0.7.2 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.21.6 0B
<missing> 2 weeks ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B
<missing> 3 weeks ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ADD file:966d3669b40f5fbae… 80.4MB
Docker 实战
Docker 实战 Redis 集群
[root@VM-16-5-centos ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 52:54:00:ff:ad:5e brd ff:ff:ff:ff:ff:ffinet 10.0.16.5/22 brd 10.0.19.255 scope global eth0valid_lft forever preferred_lft foreverinet6 fe80::5054:ff:feff:ad5e/64 scope link valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:af:7f:9c:8e brd ff:ff:ff:ff:ff:ffinet 172.17.0.1/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft foreverinet6 fe80::42:afff:fe7f:9c8e/64 scope link valid_lft forever preferred_lft forever
# 创建一个网卡
[root@VM-16-5-centos ~]# docker network create redis --subnet 172.18.0.0/16
4c7bfbe5589e7189f3d266760aaeb4b377a62e24d83a64cc8bbfd90d59af0341# 查看网络状况
[root@VM-16-5-centos ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
72ced6575972 bridge bridge local
d3878b871e93 host host local
f35cc32d849d none null local
4c7bfbe5589e redis bridge local# redis网卡网络情况
[root@VM-16-5-centos ~]# docker network inspect redis
[{"Name": "redis","Id": "4c7bfbe5589e7189f3d266760aaeb4b377a62e24d83a64cc8bbfd90d59af0341","Created": "2022-04-24T21:19:08.514356554+08:00","Scope": "local","Driver": "bridge","EnableIPv6": false,"IPAM": {"Driver": "default","Options": {},"Config": [{"Subnet": "172.18.0.0/16"}]},"Internal": false,"Attachable": false,"Ingress": false,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {},"Options": {},"Labels": {}}
]
[root@VM-16-5-centos ~]# # 创建6个redis服务# 脚本创建 (可直接后台执行)
for port in $(seq 1 6); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF > /mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.18.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done# 已创建完6个节点
# 172.18.0.11
docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.18.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf# 172.18.0.12
docker run -p 6372:6379 -p 16372:16379 --name redis-2 \
-v /mydata/redis/node-2/data:/data \
-v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.18.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf# 172.18.0.13
docker run -p 6373:6379 -p 16373:16379 --name redis-3 \
-v /mydata/redis/node-3/data:/data \
-v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.18.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf# 172.18.0.14
docker run -p 6374:6379 -p 16374:16379 --name redis-4 \
-v /mydata/redis/node-4/data:/data \
-v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.18.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf# 172.18.0.15
docker run -p 6375:6379 -p 16375:16379 --name redis-5 \
-v /mydata/redis/node-5/data:/data \
-v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.18.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf# 172.18.0.16
docker run -p 6376:6379 -p 16376:16379 --name redis-6 \
-v /mydata/redis/node-6/data:/data \
-v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.18.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf# 删除所有容器
[root@VM-16-5-centos conf]# docker rm -f $(docker ps -aq)# 进入容器
[root@VM-16-5-centos conf]# docker exec -it redis-1 /bin/sh
/data # ls
appendonly.aof nodes.conf# 创建集群
/data # redis-cli --cluster create 172.18.0.11:6379 172.18.0.12:6379 172.18.0.13:6379 172.18.0.14:6379 172.18.0.15:6379 172.18.0.16:6379 --cluster-
replicas 1# 创建成功查看集群详情/data # redis-cli -c
127.0.0.1:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:168
cluster_stats_messages_pong_sent:177
cluster_stats_messages_sent:345
cluster_stats_messages_ping_received:172
cluster_stats_messages_pong_received:168
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:345127.0.0.1:6379> cluster nodes
4d06ba47c680ae2b306f58978592f5c8aa7a2a85 172.18.0.16:6379@16379 slave 1fbdbfddc999de27b73418dff637a2191a13658d 0 1650896979000 6 connected
9ad5eea3c3f2959070d72ba84372b6a79b925ff8 172.18.0.13:6379@16379 master - 0 1650896980471 3 connected 10923-16383
29cc13afdb5c8213e5c3bf8814177bba0ef7ff98 172.18.0.14:6379@16379 slave 9ad5eea3c3f2959070d72ba84372b6a79b925ff8 0 1650896980570 4 connected
98c09c14c4f12d6184d7ff5e11cd911b3ee6e0a4 172.18.0.11:6379@16379 myself,master - 0 1650896978000 1 connected 0-5460
eded85ab704ebcc66ffc1ba2f41d3f77e8f8335a 172.18.0.15:6379@16379 slave 98c09c14c4f12d6184d7ff5e11cd911b3ee6e0a4 0 1650896979000 5 connected
1fbdbfddc999de27b73418dff637a2191a13658d 172.18.0.12:6379@16379 master - 0 1650896980000 2 connected 5461-10922
127.0.0.1:6379>
🎯 总结:学会 Docker,你就赢了一半!
Docker 不仅让开发部署更简单,还让运维管理更高效。如果你想真正掌握它,就从 动手实践 开始!希望这篇学习笔记能帮到你,如果有用记得点赞 + 收藏 + 分享,让更多人受益!
👀 你还想了解哪些 Docker 进阶玩法?欢迎留言讨论! 😃
相关文章:
Docker 学习笔记:从入门到部署,实战演练全流程!
📌 开篇:为什么要学 Docker? 还在为环境不一致、部署麻烦、依赖冲突头疼吗?Docker 让一切变得简单!作为现代开发和运维的神器,Docker 让我们可以用 一句命令 解决 “在我电脑上能跑” 的问题。今天&#x…...
本地搭建DeepSeek R1模型 + 前端
本地搭建DeepSeek R1模型 前端 配置: 操作系统:windows11 CPU:i5 13600KF GPU:英伟达4070 12GB 内存:16G DDR5 硬盘:1TB 模型安装 本文采用Ollama进行安装。Ollama安装比较简单。 官网࿱…...
MyBatis增删改查:静态与动态SQL语句拼接及SQL注入问题解析
MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作。本文将深入探讨 MyBatis 中的增删改查操作,重点讲解静态与动态 SQL 语句的拼接,并分析 S…...
Unity入门学习笔记(Day01)
一.认识unity工作面板 1.1.project window(项目面板) 显示当前项目中的所有文件和目录,包含了项目里面所有的资源文件 1.2.console window(输出面板) 显示当前游戏开发中生成的警告错误 1.3.hierarchy window&…...
教务考试管理系统-Sprintboot vue
一、前言 1.1 实践目的和要求 本次实践的目的是为了帮助学生强化对实践涉及专业技术知识的理解,掌握专业领域中软件知识的应用方法,并了解软件工程在具体行业领域的发展趋势。通过培养学生利用软件工程方法分析、设计并完成具体行业软件开发的能力&…...
GHCTF2025--Web
upload?SSTI! import os import refrom flask import Flask, request, jsonify,render_template_string,send_from_directory, abort,redirect from werkzeug.utils import secure_filename import os from werkzeug.utils import secure_filenameapp Flask(__name__)# 配置…...
文件上传漏洞(upload-labs)
目录 Pass-01(前端绕过) (1)JavaScript (2)Burpsuite(改后缀) Pass-02(IMME类型 ) burpsuite(改文件类型) Pass-03(黑名单绕过) …...
图片的拖拽+缩放
效果图: <script setup lang"ts"> import { onMounted, ref } from vue; import ImgBg from /assets/img/bg.jpg import Img1 from /assets/img/1.jpgconst innerStyle ref({left: 0,top: 0,width: 100,height: 0 }) const wrapStyle ref({width:…...
Windows软件插件-音视频文件读取器
下载本插件 本插件读取音频和视频文件,输出音频样本和视频样本,音频样本为16位PCM,采样率48000;视频样本为RGB32。大部分音频和视频文件格式都可以读取。本插件类型为DLL。 本插件是通过创建媒体基础“源读取器”对象实现读取音视…...
考研数一复习之拉格朗日中值定理求解函数极限
最近在复习考研数学,只是简单做题过于乏味,因此便总结了一些笔记,后续若有空,也会将自己的复习笔记分享出来。本篇,我们将重点讲解拉格朗日中值定理在求解函数极限中的应用。同时,作者本人作为python领域创作者,还将在本文分享使用sympy求解高数中函数极…...
聊天服务器分布式改造
目前的聊天室是单节点的,无论是http接口还是socket接口都在同一个进程,无法承受太多人同时在线,容灾性也非常差。因此,一个成熟的IM产品一定是做成分布式的,根据功能分模块,每个模块也使用多个节点并行部署…...
C++11的一些特性
目录 一、C11简介 二、统一的列表初始化 2.1 {}初始化 2.2 std::initializer_list 三、声明 3.1 auto 3.2 decltype 3.3 nullptr 四、范围for循环 五、智能指针 5.1 RAII 5.2 智能指针的原理 5.3 std::auto_ptr…...
【打卡day3】字符串类
例如统计字符个数,字符大小写转换 题目描述:输入一行字符串,计算A-Z大写字母出现的次数 思路: 1 定义一个整型数组,初始化为0,存储每个字母出现的次数,下标0对应字母A, 2,定义字…...
图像滑块对比功能的开发记录
背景介绍 最近,公司需要开发一款在线图像压缩工具,其中的一个关键功能是让用户直观地比较压缩前后的图像效果。因此,我们设计了一个对比组件,它允许用户通过拖动滑块,动态调整两张图像的显示区域,从而清晰…...
【音视频】ffplay常用命令
一、 ffplay常用命令 -x width:强制显示宽度-y height:强制显示高度 强制以 640*360的宽高显示 ffplay 2.mp4 -x 640 -y 360 效果如下 -fs 全屏显示 ffplay -fs 2.mp4效果如下: -an 禁用音频(不播放声音)-vn 禁…...
初识Linux
文章目录 初识Linux:从开源哲学到技术生态的全面解析一、Linux的背景与发展简史:从代码实验到数字基础设施1.1 起源与开源基因1.2 技术哲学之争1.3 GNU/Linux的融合 二、开源:Linux的核心竞争力与生态力量2.1 法律保障与四大自由2.2 社区协作…...
基于遗传算法的IEEE33节点配电网重构程序
一、配电网重构原理 配电网重构(Distribution Network Reconfiguration, DNR)是一项优化操作,旨在通过改变配电网中的开关状态,优化电力系统的运行状态,以达到降低网损、均衡负载、改善电压质量等目标。配电网重构的核…...
manus对比ChatGPT-Deep reaserch进行研究类学术相关数据分析!谁更胜一筹?
没有账号,只能挑选一个案例 一夜之间被这个用全英文介绍全华班出品的新爆款国产AI产品的小胖刷频。白天还没有切换语言的选项,晚上就加上了。简单看了看团队够成,使用很长实践的Monica创始人也在其中。逐渐可以理解,重心放在海外产…...
线程通信---java
线程 我们知道,线程是进程的最小执行单位,一个进程可以拥有多个线程,那么就会引入两个问题: 多个线程之间如何进行通信多个线程对同一个数据进行操作,如何保证程序正确执行,也就是线程安全问题 线程的常…...
python面试常见题目
1、python 有几种数据类型 数字:整形 (int),浮点型 (float)布尔 ( bool):false true字符串 (string)列表 (list)元组 (tuple)字典 &…...
Python中与字符串操作相关的30个常用函数及其示例
以下是Python中与字符串操作相关的30个常用函数及其示例: 1. str.capitalize() 将字符串的第一个字符大写,其余字符小写。 s "hello world" print(s.capitalize()) # 输出: Hello world2. str.lower() 将字符串中的所有字符转换为小写。…...
2025年渗透测试面试题总结-小某鹏汽车-安全工程师(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 小鹏汽车-安全工程师 一、XXE漏洞与SSRF漏洞 1. XXE(XML External Entity)漏洞…...
kafka + flink +mysql 案例
假设你有两个Kafka主题:user_activities_topic 和 product_views_topic,并且你希望将user_activities_topic中的数据写入到user_activities表,而将product_views_topic中的数据写入到product_views表。 maven <dependencies><!-- …...
Windows下配置Flutter移动开发环境以及AndroidStudio安装和模拟机配置
截止 2025/3/9 ,版本更新到了 3.29.1 ,但是为了防止出现一些奇怪的bug,我安装的还是老一点的,3.19,其他版本的安装同理。AndroidStudio用的是 2024/3/1 版本。 — 1 环境变量(Windows) PUB_H…...
【工具类】Springboot 项目日志打印项目版本和构建时间
博主介绍:✌全网粉丝22W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
p5.js:模拟 n个彩色小球在一个3D大球体内部弹跳
向 豆包 提问:编写一个 p5.js 脚本,模拟 42 个彩色小球在一个3D大球体内部弹跳。每个小球都应留下一条逐渐消失的轨迹。大球体应缓慢旋转,并显示透明的轮廓线。请确保实现适当的碰撞检测,使小球保持在球体内部。 cd p5-demo copy…...
RISC-V医疗芯片工程师复合型转型的路径与策略
从RISC-V到医疗芯片:工程师复合型转型的路径与策略 一、引言 1.1 研究背景 在科技快速发展的当下,芯片技术已然成为推动各行业进步的核心驱动力之一。其中,RISC-V 架构作为芯片领域的新兴力量,正以其独特的优势迅速崛起,对整个芯片产业的格局产生着深远影响。RISC-V 架…...
HTML 文本格式化
HTML 文本格式化 在构建网页的过程中,文本的格式化是一个至关重要的环节。HTML(HyperText Markup Language)提供了丰富的标签和属性来帮助我们实现各种文本格式化的需求。本文将详细介绍HTML中常见的文本格式化方法,包括字体、颜…...
基于RNN+微信小程序+Flask的古诗词生成应用
项目介绍 平台采用B/S结构,后端采用主流的Flask框架进行开发,古诗词生成采用RNN模型进行生成,客户端基于微信小程序开发。是集成了Web后台开发、微信小程序开发、人工智能(RNN)等多个领域的综合性应用,是课…...
【算法】图论 —— Dijkstra算法 python
引入 求非负权边的单源最短路 时间复杂度 O( m l o g n mlogn mlogn) 模板 https://www.luogu.com.cn/problem/P4779 import heapq as hq def dijkstra(s): # dis表示从s到i的最短路 dis [float(inf)] * (n 1) # vis表示i是否出队列 vis [0] * (n 1) q [] dis[s…...
Java:LocalDatTime(代替Calendar)、ZoneDateTime(时区时间)
文章目录 Local(代替Calendar)方法:获取当前代码 LocalDate(年月日星期)LocalTime(时分秒纳秒)LocalDateTime(最常用:年月日时分秒纳秒)ZoneId 时区表示方法 ZoneDateTime(时区时间)方法世界标准时间&#…...
HOW - React 如何在在浏览器绘制之前同步执行 - useLayoutEffect
目录 useEffect vs useLayoutEffectuseEffectuseLayoutEffect主要区别总结选择建议注意事项 useLayoutEffect 使用示例测量 DOM 元素的尺寸和位置示例:自适应弹出框定位 同步更新样式以避免闪烁示例:根据内容动态调整容器高度 图像或 Canvas 绘制前的准备…...
PyTorch系列教程:编写高效模型训练流程
当使用PyTorch开发机器学习模型时,建立一个有效的训练循环是至关重要的。这个过程包括组织和执行对数据、参数和计算资源的操作序列。让我们深入了解关键组件,并演示如何构建一个精细的训练循环流程,有效地处理数据处理,向前和向后…...
VS2019,VCPKG - 为VS2019添加VCPKG
文章目录 VS2019,VCPKG - 为VS2019添加VCPKG概述笔记前置条件迁出vcpkg到本地验证库安装更新已经安装的库删除指定的包安装VS2019能用的boostvcpkg 2025.02.14 版本可以给VS2019用用VCPKG的好处备注END VS2019,VCPKG - 为VS2019添加VCPKG 概述 开源工程用到了VCPKG管理的包。…...
linux下 jq 截取json文件信息
背景:通过‘登录名‘ 获取该对象的其他个人信息如名字。 环境准备:麒麟操作系统V10 jq安装包 jq安装包获取方式:yum install jq 或 使用附件中的rpm 或 git自行下载 https://github.com/stedolan/jq/releases/download/ 实现过程介绍&am…...
测试大语言模型在嵌入式设备部署的可能性-ollama本地部署测试
前言 当今各种大语言模型百花齐放,为了方便使用者更加自由的使用大模型,将大模型变成如同棒球棍一样每个人都能用,并且顺手方便的工具,本地私有化具有重要意义。 本次测试使用ollama完成模型下载,过程简单快捷。 1、进…...
C语言基础系列【21】memcpy、memset
博主介绍:程序喵大人 35- 资深C/C/Rust/Android/iOS客户端开发10年大厂工作经验嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手《C20高级编程》《C23高级编程》等多本书籍著译者更多原创精品文章,首发gzh,见文末👇…...
云曦春季开学考复现(2025)
Crypto 划水的dp和dq 下载附件后是简单的RSA算法题,之所以说简单是因为给了公钥e 趁热打铁,昨天刚学的RSA,既然有p有q,也有e,而np*q,可以算出欧拉函数值phi(p-1)*(q-1&…...
探秘 Netty 通信中的 SslHandler 类:保障网络通信安全的基石
引言 在当今数字化时代,网络安全是每一个应用程序都必须重视的关键因素。尤其是在数据传输过程中,防止数据被窃取、篡改至关重要。Netty 作为一个高性能的网络编程框架,为开发者提供了强大的功能来构建可靠的网络应用。其中,SslH…...
Llama factory微调后的模型怎么通过ollama发布
接上一篇博客:用Llama Factory单机多卡微调Qwen2.5时报torch.OutOfMemoryError: CUDA out of memory的解决办法_llama-factory cuda out of memory-CSDN博客 把Lora模块和其基模型merge到一起之后,就可以通过ollama之类的框架提供服务了。不过还是有些格式转换的工作要做: …...
ubuntu 20.04下ZEDmini安装使用
提前安装好显卡驱动和cuda,如果没有安装可以参考我的这两篇文章进行安装: ubuntu20.04配置YOLOV5(非虚拟机)_ubuntu20.04安装yolov5-CSDN博客 ubuntu20.04安装显卡驱动及问题总结_乌班图里怎么备份显卡驱动-CSDN博客 还需要提前…...
CmBacktrace的学习跟移植思路
学习移植CmBacktrace需要从理解其核心功能、适用场景及移植步骤入手,结合理论学习和实践操作。以下是具体的学习思路与移植思路: 一、学习思路 理解CmBacktrace的核心功能 CmBacktrace是针对ARM Cortex-M系列MCU的错误追踪库,支持自动诊断Har…...
Android Glide 缓存模块源码深度解析
一、引言 在 Android 开发领域,图片加载是一个极为常见且关键的功能。Glide 作为一款被广泛使用的图片加载库,其缓存模块是提升图片加载效率和性能的核心组件。合理的缓存机制能够显著减少网络请求,降低流量消耗,同时加快图片显示…...
蓝桥杯备赛:炮弹
题目解析 这道题目是一道模拟加调和级数,难的就是调和级数,模拟过程比较简单。 做法 这道题目的难点在于我们在玩这个跳的过程,可能出现来回跳的情况,那么为了解决这种情况,我们采取的方法是设定其的上限步数。那么…...
死锁问题分析工具
使用 gdb 调试 gdb ./your_program (gdb) run (gdb) thread apply all bt还可以分析pthread_mutex内部,查看owen字段分析哪个线程占用的锁,一个可能的 pthread_mutex 内部结构可以大致表示为: typedef struct pthread_mutex_t {int state; …...
装饰器模式--RequestWrapper、请求流request无法被重复读取
目录 前言一、场景二、原因分析三、解决四、更多 前言 曾经遇见这么一段代码,能看出来是把request又重新包装了一下,核心信息都不会改变 后面了解到这叫 装饰器模式(Decorator Pattern) :也称为包装模式(Wrapper Pat…...
MTK Android12 桌面上显示文件管理器图标
文章目录 需求解决 需求 在MTK平台上,Android12的文件管理器图标未显示在桌面,但在设置里面可以看到,文件管理器是安装的。根据客户要求,需要将文件管理器的图标显示在桌面上。解决 路径:packages/apps/DocumentsUI/…...
SpringBoot实现文件上传
1. 配置文件上传限制 application.yml spring:servlet:multipart:max-file-size: 10MBmax-request-size: 10MB2. 创建文件上传控制器 import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import…...
【开源免费】基于SpringBoot+Vue.JS青年公寓服务平台(JAVA毕业设计)
本文项目编号 T 233 ,文末自助获取源码 \color{red}{T233,文末自助获取源码} T233,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...
django中视图作用和视图功能 以及用法
在 Django REST Framework(DRF)中,视图(View)是处理 HTTP 请求并返回响应的核心组件。DRF 提供了多种视图类,适用于不同的场景和需求。以下是 DRF 中常见的视图类及其作用、使用方法的详细说明: 一、DRF 视图的分类 DRF 的视图可以分为以下几类: 基于函数的视图(Func…...