docker(二)镜像详解、镜像构建、镜像优化

news2024/11/26 18:26:12

文章目录

  • 前言
  • 一、docker镜像详解
    • 1.镜像分层结构
    • 2.镜像的表示
  • 二、镜像构建
    • 1.commit提交
    • 2.Dockerfile
      • Dockerfile 命令详解
  • 三、镜像优化
    • 1.缩减镜像层
    • 2.多阶段构建
    • 3.使用最精简的基础镜像


前言


一、docker镜像详解

1.镜像分层结构

在这里插入图片描述在这里插入图片描述

  • 共享宿主机的kernel
  • base镜像提供的是最小的Linux发行版(base镜像:不同发行版的/文件系统)
  • 同一docker主机支持运行多种Linux发行版
  • 采用分层结构的最大好处是:共享资源

镜像通过分层,如果本地已经有了,不管这一层属于哪个镜像,因为每一层都有独立的标识(都是唯一的),只要docker判断有这一层,那它就不会进行重复的拉取。包括在上传仓库的时候也是一样的,仓库内存储时也是按照层来存储的,如果远程仓库有这一层了,就不需要重复上传了,节省了带宽。
在这里插入图片描述
docker使用 Copy-on-Write 的机制(可写容器层),当我们想保存一个数据的时候,由于镜像是只读的,当我们创建容器时,是在镜像层的上面创建一个可写容器层,所有对容器的修改都会放置在可写容器层上,只要这个容器不被释放,这个数据一直存在,除非把这个容器删掉。如果想保存,把可写容器层进行打包,即把它创建成一个镜像层,一旦成为镜像层它就变成只读模式了(最多127层)。

镜像层数量可能会很多,所有镜像层会联合在一起组成一个统一的文件系统。如果不同层中有一个相同路径的文件,比如 /a,上层的 /a会覆盖下层的 /a,也就是说用户只能访问到上层中的文件 /a。在容器层中,用户看到的是一个叠加之后的文件系统。
添加文件:在容器中创建文件时,新文件被添加到容器层中。 读取文件:在容器中读取某个文件时,Docker会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后打开并读入内存。
修改文件:在容器中修改已存在的文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后修改之。
删除文件:在容器中删除文件时,Docker 也是从上往下依次在镜像层中查找此文件。找到后,会在容器层中记录下此删除操作。
只有当需要修改时才复制一份数据,这种特性被称作Copy-on-Write。可见,容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。这样就解释了我们前面提出的问题:容器层记录对镜像的修改,所有镜像层都是只读的,不会被容器修改,所以镜像可以被多个容器共享。

2.镜像的表示

在这里插入图片描述
镜像的表示分为四部分:红色的部分是镜像中心域名,黄色的部分是镜像命名空间,我们可以根据命名空间进行权限控制等操作,绿色是镜像的名称,每个镜像有一个版本(即标签)。Docker官方的镜像不需要镜像中心的域名,有一些镜像可以省略命名空间。

base 镜像简单来说就是不依赖其他任何镜像,完全从0开始建起,其他镜像都是建立在他的之上,可以比喻为大楼的地基,docker镜像的鼻祖。
base 镜像有两层含义:
(1)不依赖其他镜像,从 scratch 构建;
(2)其他镜像可以之为基础进行扩展。
所以,能称作 base 镜像的通常都是各种 Linux 发行版的 Docker 镜像,
比如 Ubuntu, Debian, CentOS 等。

二、镜像构建

1.commit提交

docker commit 构建新镜像三部曲

  • 运行容器
  • 修改容器
  • 新的镜容器保存为镜像
  • 缺点:
    效率低、可重复性弱、容易出错
    使用者无法对镜像进行审计,存在安全隐患
    运行容器
    # docker run -it --name demo demo:v1
    修改容器 (以下命令在容器内运行)
    # echo helloworld > testfile
    将容器保存为新的镜像
    # docker commit demo demo:v2
    查看镜像
    # docker images demo:v1

使用docker info 可以看到此时我们用的是docker官方的仓库;
在这里插入图片描述
拉取一个具有一个小工具的镜像:
在这里插入图片描述
由于busybox是基础镜像不是应用镜像,基础镜像不像应用镜像可以打到后台,只能以交互式方式打开:
在这里插入图片描述
使用下面这个指令可以看到容器的构建历史:
在这里插入图片描述

[root@server1 ~]# docker run -it --name demo busybox      ##生成容器demo
/ # touch file1                         ##ctrl+d: 退出容器后容器自动关闭
                                        ##   -it:以交互式的方式创建容器
/ # touch file2                         ##ctrl+pq: 退出容器后继续在后台运行
                                        
##已经停止的容器,删除后,创建的文件会丢失,因为容器内的变更都保存在可写容器层,生命周期和容器一致
显示所有容器
[root@server1 ~]# docker ps -a

启动容器
[root@server1 ~]# docker start  demo

进入容器
[root@server1 ~]# docker attach  demo

提交容器变更到新的镜像
[root@server1 ~]# docker commit -m "add files" demo demo:v1    ##通过容器生成镜像(保存了更改至新的镜像层)

[root@server1 ~]# docker history demo:v1
IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
2b25ea847e4e   9 seconds ago   sh                                              39B       add files                                       ##比旧的镜像多的部分
827365c7baf1   13 days ago     /bin/sh -c #(nop)  CMD ["sh"]                   0B
<missing>      13 days ago     /bin/sh -c #(nop) ADD file:3f2f2548e5ddec788…   4.86MB

Ctrl+d就退出容器了,此时容器会被stop掉,但是并不会被删除. 我们再启动容器就可以再次进入容器,我们还可以使用 ctrl+p+q 三个键同时按下,就可以将其打入后台运行而不是stop掉,我们也可以手动stop掉容器,我们将刚刚创建的容器删除再进去,就会发现我们刚刚创建的文件已经没有了, 这是因为我们在容器层把这个容器释放掉以后就没有了,如果我们想将数据保存下来,就需要将我们自己的镜像打包
对比源镜像和我们自己打包的镜像,只比源镜像多了一层,就是我们刚刚创建文件的命令:
commit提交的缺点:我们发现在删除时它也只删除了一层,就是我们刚刚创建文件的那一层,基础的busybox镜像它是不会删除的。我们发现这种构建方式不是非常方便,他的缺点有 效率低、可重复性弱、容易出错,使用者无法对镜像进行审计,存在安全隐患 。这种方式不利于安全审计

无法审计: 当我们使用docker history 时无法看见对容器进行了什么具体的操作,只能看见一个sh命令

在这里插入图片描述
只要当busybox和demo:v1共享的两层都被删除,镜像才被删除;
在这里插入图片描述
[root@server1 ~]# docker commit -m “add files” demo demo:v1
##通过容器生成镜像(保存了更改至新的镜像层),虽然删除了容器demo,但是重新运行镜像,创建的file仍然在
在这里插入图片描述
删除镜像
[root@server1 docker]# docker rmi demo:v1

2.Dockerfile

dockerfile的创建原理—>相当于一个一个进行提交

创建Dockerfile(注:名字只能是Dockerfile,因为默认读取的文件名称为Dockerfile)
[root@server1 ~]# mdkir docker         
[root@server1 ~]# cd docker/
[root@server1 docker]#  cp ~/nginx-1.23.3.tar.gz .

基于什么基础镜像做什么操作:
[root@server1 docker]# vim Dockerfile
FROM centos:7
ADD nginx-1.23.3.tar.gz /mnt
WORKDIR /mnt/nginx-1.23.3
RUN yum install -y gcc make pcre-devel openssl-devel
RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc
RUN ./configure --with-http_ssl_module --with-http_stub_status_module
RUN make
RUN make install
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

建议将Dockerfile放在一个空目录下,因为在构建过程中可能要用到一些外部资源,将这些资源都放在这个空目录下,不要放在根下,因为在构建时,它会将目录下的所有文件都发给docker引擎去构建, 放在根下的话,发的数据就太大了。

构建镜像
[root@server1 docker]# docker build -t webserver:v1 .
          注:构建时的 "." 意思是构建所需的所有文件都来自当前目录。
          此时就可以对镜像进行审计了,即镜像构建的步骤都能看见:
[root@server1 docker]# docker images webserver
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
webserver    v1        bfd6774cc216   8 seconds ago   494MB

[root@server1 docker]# docker history  webserver:v1

清理所有停止的容器
[root@server1 docker]# docker container prune

启动容器
[root@server1 docker]# docker run -d --name web1 webserver:v1

可以看见镜像构建的步骤,若此时我们只想进去查看或者操作一下镜像,退出就自动删除容器:
而且使用Dockerfile创建镜像还有缓存特性,比如我们构建时遗忘了一层,我们再重新编辑Dockerfile,可以看到在构建时,之前的三层都是 Using cache 使用缓存,只有新加的一层构建了
注:由于镜像是一层一层叠加的,如果我们改了第二层,那么后面的所有层都要重新构建。
在这里插入图片描述
构建成功
在这里插入图片描述
查看容器详情
[root@server1 docker]# docker inspect web1
数据卷挂载
在这里插入图片描述
自动分配的ip
在这里插入图片描述
访问容器
[root@server1 docker]# curl 172.17.0.2
在这里插入图片描述
补充:
我们可以使用docker inspect nginx 来查看官方nginx是怎么封装的:
在这里插入图片描述
我们先把之前创建的demo镜像全部删掉
[root@server1 docker]# vim Dockerfile ##自己编写Dockerfile 安装nginx:
在这里插入图片描述
构建:
在这里插入图片描述
构建完成后的图片参照前面

Dockerfile 命令详解

dockerfile常用指令

  • FROM:指定base镜像,如果本地不存在会从远程仓库下载。
  • MAINTAINER:设置镜像的作者,比如用户邮箱等。
  • COPY:把文件从build context复制到镜像 支持两种形式:COPY src dest 和 COPY [“src”,“dest”] src必须指定build context中的文件或目录(文件一定要放在Dockerfile同一目录下)
  • ADD 用法与COPY类似,不同的是src可以是归档压缩文件,文件会被自动解压到dest,也可以自动下载URL并拷贝到镜像: ADD html.tar /var/www ADD http://ip/html.tar /var/www
  • ENV设置环境变量,变量可以被后续的指令使用: ENV HOSTNAME sevrer1.example.com
  • EXPOSE如果容器中运行应用服务,可以把服务端口暴露出去: EXPOSE 80(对外暴露的端口)
  • VOLUME申明数据卷,通常指定的是应用的数据挂在点: VOLUME[“/var/www/html”]
  • WORKDIR为RUN、CMD、ENTRYPOINT、ADD和COPY指令设置镜像中的当前工作目录,如果目录不存在会自动创建。
  • RUN在容器中运行命令并创建新的镜像层,常用于安装软件包: RUN yum install -y vim
  • CMD 与 ENTRYPOINT这两个指令都是用于设置容器启动后执行的命令,但CMD会被dockerrun后面的命令行覆盖,而ENTRYPOINT不会被忽略,一定会被执行。 dockerrun后面的参数可以传递给ENTRYPOINT指令当作参数。Dockerfile中只能指定一个ENTRYPOINT,如果指定了很多,只有最后一个有效。

三、镜像优化

1.缩减镜像层

[root@server1 docker]# vim Dockerfile
FROM centos:7 as build
ADD nginx-1.23.3.tar.gz /mnt
WORKDIR /mnt/nginx-1.23.3
RUN yum install -y gcc make pcre-devel openssl-devel && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --with-http_ssl_module --with-http_stub_status_module && make && make install && cd .. && rm -fr nginx-1.23.3 && yum clean all
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

[root@server1 docker]# docker build -t webserver:v2 .

[root@server1 docker]# docker images  webserver
REPOSITORY   TAG       IMAGE ID       CREATED             SIZE
webserver    v2        caf0f80f2332   4 seconds ago       317MB
webserver    v1        bfd6774cc216   About an hour ago   494MB

可以看到webserver:v2 比 webserver:v1 小一点。

2.多阶段构建

分成两阶段,将构建阶段的nginx二进制程序拷贝到新的镜像中。

[root@server1 docker]# vim Dockerfile
FROM centos:7 as build
ADD nginx-1.23.3.tar.gz /mnt
WORKDIR /mnt/nginx-1.23.3
RUN yum install -y gcc make pcre-devel openssl-devel && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --with-http_ssl_module --with-http_stub_status_module && make && make install && cd .. && rm -fr nginx-1.23.3 && yum clean all

FROM centos:7
COPY --from=build /usr/local/nginx /usr/local/nginx
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

[root@server1 docker]# docker build -t webserver:v3 .

[root@server1 docker]# docker images  webserver
REPOSITORY   TAG       IMAGE ID       CREATED             SIZE
webserver    v3        1ac964f2cefe   29 seconds ago      205MB
webserver    v2        caf0f80f2332   3 minutes ago       317MB
webserver    v1        bfd6774cc216   About an hour ago   494MB

可以看到多阶段构建效果非常明显,最终的镜像只比源镜像大了1M。(源镜像204M)

3.使用最精简的基础镜像

我们想要再减小镜像的大小就只能更换基础镜像了。上github搜索谷歌的包distroless:
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

导入基础镜像
[root@server1 ~]# docker load -i base-debian11.tar

[root@server1 ~]# mkdir new
[root@server1 ~]# cd new/
[root@server1 new]# vim Dockerfile
FROM nginx:latest as base

# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
ARG TIME_ZONE

RUN mkdir -p /opt/var/cache/nginx && \
    cp -a --parents /usr/lib/nginx /opt && \
    cp -a --parents /usr/share/nginx /opt && \
    cp -a --parents /var/log/nginx /opt && \
    cp -aL --parents /var/run /opt && \
    cp -a --parents /etc/nginx /opt && \
    cp -a --parents /etc/passwd /opt && \
    cp -a --parents /etc/group /opt && \
    cp -a --parents /usr/sbin/nginx /opt && \
    cp -a --parents /usr/sbin/nginx-debug /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/ld-* /opt && \
    cp -a --parents /usr/lib/x86_64-linux-gnu/libpcre* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libz.so.* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libc* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libdl* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libpthread* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libcrypt* /opt && \
    cp -a --parents /usr/lib/x86_64-linux-gnu/libssl.so.* /opt && \
    cp -a --parents /usr/lib/x86_64-linux-gnu/libcrypto.so.* /opt && \
    cp /usr/share/zoneinfo/${TIME_ZONE:-ROC} /opt/etc/localtime

FROM gcr.io/distroless/base-debian11

COPY --from=base /opt /

EXPOSE 80 443

ENTRYPOINT ["nginx", "-g", "daemon off;"]

[root@server1 new]# docker build -t webserver:v4 .

[root@server1 new]# docker images  webserver
REPOSITORY   TAG       IMAGE ID       CREATED             SIZE
webserver    v4        c0c4e1d49f3d   4 seconds ago       34MB
webserver    v3        1ac964f2cefe   12 minutes ago      205MB
webserver    v2        caf0f80f2332   15 minutes ago      317MB
webserver    v1        bfd6774cc216   About an hour ago   494MB

在这里插入图片描述
在这里插入图片描述

[root@server1 new]# docker run -d --name web1 webserver:v4
[root@server1 new]# curl 172.17.0.2
在这里插入图片描述


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

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

相关文章

【LeetCode】1487. 保证文件名唯一

1487. 保证文件名唯一 题目描述 给你一个长度为 n 的字符串数组 names 。你将会在文件系统中创建 n 个文件夹&#xff1a;在第 i 分钟&#xff0c;新建名为 names[i] 的文件夹。 由于两个文件 不能 共享相同的文件名&#xff0c;因此如果新建文件夹使用的文件名已经被占用&a…

pytorch-模型训练中过拟合和欠拟合问题。从模型复杂度和数据集大小排查问题

评价了机器学习模型在训练数据集和测试数据集上的表现。如果你改变过实验中的模型结构或者超参数&#xff0c;你也许发现了&#xff1a;当模型在训练数据集上更准确时&#xff0c;它在测试数据集上却不一定更准确。这是为什么呢&#xff1f; 训练误差和泛化误差 在解释上述现象…

常用Swagger注解汇总

常用Swagger注解汇总 前言 在实际编写后端代码的过程中&#xff0c;我们可能经常使用到 swagger 注解&#xff0c;但是会用不代表了解&#xff0c;你知道每个注解都有什么属性吗&#xff1f;你都用过这些属性吗&#xff1f;了解它们的作用吗&#xff1f;本文在此带大家总结一下…

6-2 SpringCloud快速开发入门:声明式服务消费 Feign实现消费者

声明式服务消费 Feign实现消费者 使用 Feign实现消费者&#xff0c;我们通过下面步骤进行&#xff1a; 第一步&#xff1a;创建普通 Spring Boot工程 第二步&#xff1a;添加依赖 <dependencies><!--SpringCloud 集成 eureka 客户端的起步依赖--><dependency>…

图解LeetCode——剑指 Offer 34. 二叉树中和为某一值的路径

一、题目 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。 二、示例 2.1> 示例 1&#xff1a; 【输入】root [5,4,8,11,null,13,4,7,2,null,null,5,1], t…

从 ChatGPT 爆火回溯 NLP 技术

ChatGPT 火遍了全网&#xff0c;多个话题频频登上热搜。见证了自然语言处理&#xff08;NLP&#xff09;技术的重大突破&#xff0c;体验到通用技术的无限魅力。GPT 模型是一种 NLP 模型&#xff0c;使用多层变换器&#xff08;Transformer&#xff09;来预测下一个单词的概率分…

cuda编程以及GPU基本知识

目录CPU与GPU的基本知识CPU特点GPU特点GPU vs. CPU什么样的问题适合GPU&#xff1f;GPU编程CUDA编程并行计算的整体流程CUDA编程术语&#xff1a;硬件CUDA编程术语&#xff1a;内存模型CUDA编程术语&#xff1a;软件线程块&#xff08;Thread Block&#xff09;网格&#xff08…

新界面Moonbeam DApp上线,替你先尝试了一番!

作者&#xff1a;充电中的小恐龙 请注意&#xff0c;本篇内容来自Moonbeam社区成员的无偿分享&#xff0c;与Moonbeam官方和Moonbeam中文社区无关。本文内容仅供参考&#xff0c;对于内容的准确性和实效性&#xff0c;请自行谨慎判断。 本文撰写于DApp上线Beta版本之时&#…

数据库开发(一文概括mysql基本知识)

Mysql 是最流行的关系型数据库管理系统&#xff0c;在 WEB 应用方面 MySQL 是最好的 关系型数据库(Relational Database Management System&#xff1a;关系数据库管理系统)应用软件之一。mysql在问开发中&#xff0c;几乎必不可少&#xff0c;因为其他的可能是要收费的&#x…

【运维】Linux定时任务 定时执行脚本

【运维】Linux定时任务 定时执行脚本 在安装完成操作系统后&#xff0c;默认会安装 crond 服务工具&#xff0c;且 crond 服务默认就是自启动的。crond 进程每分钟会定期检查是否有要执行的任务&#xff0c;如果有&#xff0c;则会自动执行该任务。 五分钟执行一次sh脚本 进入编…

taobao.item.update.delisting( 商品下架 )

&#xffe5;开放平台基础API必须用户授权 单个商品下架输入的num_iid必须属于当前会话用户 公共参数 请求地址: HTTP地址 http://gw.api.taobao.com/router/rest 公共请求参数: 公共响应参数: 点击获取key和secret 请求参数 响应参数 请求示例 TaobaoClient client new …

6-3 SpringCloud快速开发入门: Feign实现负载均衡的服务消费

Feign实现负载均衡的服务消费 负载均衡&#xff1a;Spring Cloud 提供了 Ribbon来实现负载均衡&#xff0c;使用 Ribbo直接注入一个 RestTemplate对象即可&#xff0c;RestTemplate已经做好了负载均衡的配置&#xff1b; 在 Spring Cloud下&#xff0c;使用 Feign也是直接可以实…

实时的软件生成 —— Prompt 编程打通低代码的最后一公里?

PS&#xff1a;这也是一篇畅想&#xff0c;虽然经过了一番试验&#xff0c;依旧有一些不足&#xff0c;但是大体上站得住脚。传统的软件生成方式需要程序员编写大量的代码&#xff0c;然后进行测试、发布等一系列繁琐的流程。而实时生成技术则是借助人工智能技术&#xff0c;让…

在CANoe/CANalyzer中观察CAN Message报文的周期Cycle

案例背景&#xff1a; 该篇博文将告诉您&#xff0c;如何直观的&#xff0c;图示化的&#xff0c;查看CAN网络中各CAN Message报文的周期变化。 优质博文推荐阅读&#xff08;单击下方链接&#xff0c;即可跳转&#xff09;&#xff1a; Vector工具链 CAN Matrix DBC CAN M…

市场份额下降,股价暴跌,金山云要想实现盈利还需要更长的时间

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 IPO后股价表现与估值变化 金山云&#xff08;KC&#xff09;于2020年5月在纳斯达克进行了IPO上市&#xff0c;当时IPO价格为17美元。根据S&P Capital IQ的数据&#xff0c;截至2020年6月1日&#xff0c;金山云的股价已…

linux基本功系列之uname实战

文章目录前言一. uname命令介绍二. 语法格式及常用选项三. 参考案例3.1 输出全部信息3.2 输出内核名称及版本3.3 输出网络节点的主机名3.4 输出主机硬件架构3.5 输出操作系统名称3.6 显示版本信息总结前言 大家好&#xff0c;又见面了&#xff0c;我是沐风晓月&#xff0c;本文…

深度学习-【语义分割】学习笔记4 膨胀卷积(Dilated convolution)

文章目录膨胀卷积为什么需要膨胀卷积gridding effect连续使用三次膨胀卷积——1连续使用三次膨胀卷积——2连续使用三次膨胀卷积——3Understanding Convolution for Semantic Segmentation膨胀卷积 膨胀卷积&#xff0c;又叫空洞卷积。 左边是普通卷积&#xff0c;右边是膨胀…

python的多线程编程之锁

1、 背景概述 在上篇文章中&#xff0c;主要讲述了python中的socket编程的一些基本方面&#xff0c;但是缺少关于锁的相关概念&#xff0c;从而在这篇文章中进行补充。 由于在python中&#xff0c;存在了GIL&#xff0c;也就是全局解释器锁&#xff0c;从而在每次进行获得cpu的…

网络通信--Linux

文章目录网络通信的基础通信模型IP地址和端口port网络套接字网络字节序初识UDP与TCP两种协议sockaddr结构体家族认识一些网络常用基础函数UDP实现简单通信TCP实现简单通信总结网络通信的基础 网络通信是建立在多层协议之下&#xff0c;最终利用数据传输线路进行数据通信。首先…

Web Spider案例 网洛克 第三题 AAEncode加密 练习(七)

声明 此次案例只为学习交流使用&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;切勿用于其他非法用途&#xff1b; 文章目录声明一、资源推荐二、逆向目标三、抓包分析 & 下断分析逆向3.1 抓包分析3.2 下断分析逆向拿到混淆JS代码3.3 AAEncode解决方…