查看指定ID的容器信息
$ docker inspect
查看有所有镜像
$ docker images
上传镜像到Docker Hub
先去https://hub.docker.com/官网申请一个docker hub 帐号
$ docker login # 登录Docker Hub
$ docker images #查看本地镜像
$ docker tag <镜像名> <用户名/镜像名> #将镜像转让我的账号下
$ docker push <用户名>/<镜像名>
安装Docker
ubuntu
第一步、检查是否支持Docker
$ uname -a
#检查内核版本,必须高于3.10
$ ls -l /sys/class/misc/device-mapper
#检查存储驱动
第二步、安装docker
$ wget -qO- https://get.docker.com/ | sh
Centos7
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
删除所有的Docker
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
sudo yum-config-manager \
–add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
使用 Docker 仓库进行安装
sudo yum install -y docker-ce docker-ce-cli containerd.io
如果提示您接受 GPG 密钥,请选是。
配置国内的镜像源
mkdir -p /etc/docker/
echo ‘{“registry-mirrors”:[“http://hub-mirror.c.163.com”,“https://registry.docker-cn.com”]}’ > /etc/docker/daemon.json
systemctl daemon-reload && systemctl restart docker
容器的基本操作
普通容器
启动容器
$ docker run [<用户名>/]<镜像名>[:tag] [命令]
在启动的容器中安装Ping
docker run <用户名>/<镜像名> apt-get install -y ping
启动交会容器
$ docker run [–name=<名称>] -i -t <镜像全名> /bin/bash
-i 表示一直保持输入
-t 表示打开tty终端
–name 自定义名称
查看容器
$ docker ps [-a][-l]
-a 查看所有的容器
-l 查看最新的容器
查看指定ID的容器信息
$ docker inspect
启动/停止容器
$ docker [-i] start/stop <容器>
-i表示持续输入
删除容器
$ docker rm <容器>
守护式容器
特点
-
可以长期运行
-
没有交互会话
-
非常适合运行应用服务
命令
方法一
$ docker run -i -t <镜像> /bin/bash
ctrl+p ctrl+q 退出bash,但没关闭容器
$ docker attach <正在运行容器>
重新进入正在运行的容器
方法二
$ docker run -d <镜像> <命令>
-d 后台守护
查看容器日志
$ docker logs [-f][-t][–tail=n] 容器名
-f 持续输出日志
-t 日志加上时间戳
–tail 返回最后的多少行
查看运行中的容器的进程
$ docker top <容器>
在运行的容器中启动新的进程
$ docker exec [-d][-i][-t] <容器名> [命令]
-d 后台运行
-i 交会运行
-t 打开终端
停止容器
$ docker kill/stop <容器名>
kill 直接停止
stop 等待进程结束后停止
设置端口映射
$ docker run [-P][-p | :] …
-P 映射容器中所有的端口
-p 指定映射容器中某几个端口
eg:
$ docker run -P -i -t ubuntu /bin/bash # 映射所有的端口
$ docker run -p 80 -i -t ubuntu /bin/bash # 映射80端口
$ docker run -p 8080:80 -i -t ubuntu /bin/bash # 将内部的80映射为8080
$ docker run -p 127.0.0.1:8080:80 -i -t ubuntu /bin/bash # 将内部的80端口映射为127.0.0.1:8080
注意:如果使用5、6行的方法进行映射,外部端口是随机分配的
管理镜像
概念
-
TAG:标签
-
默认:latest
-
这里多少为版本
-
eg:docker pull node:12.1.1 下载nodejs12.1.1版本
基本操作
显示所有的镜像
$ docker images [-q][-a] [仓库]
-q 只看id
-a 查看所有
查看镜像的详细
$ docker inspace <镜像名>
删除镜像
$ docker rmi [-f] <镜像名>
-f 强制删除
查找镜像
方法1:镜像dockerhub上查找
方法2:
$ docker search [–automated][-no-trunc][-s ] <镜像名>
–automated 只显示自动化选项
–no-trunc 不分页显示
-s 显示的最低num的stat镜像
下载镜像
$ docker pull [-a] <镜像名>
-a 下载匹配的所有镜像
标记镜像到某个仓库
$ docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
上传镜像到DockerHub
$ docker images #查看本地镜像
$ docker tag <镜像名> <用户名/镜像名> #将镜像转让我的账号下
$ docker push <用户名/镜像名:Tag> #上传镜像
打包镜像
打包镜像有两种方法,推荐使用Dockerfie方法
使用commit打包
将部署好的容器进行打包。
$ docker commit [-a][-m][-p] <容器> <用户名/镜像名:版本>
-a “” 镜像作者
-m “” 打包备注
-p 不停止镜像打包
使用Dockerfile文件打包
第一步:创建Dockerfile文件
#Dockerfile
FORM <基础镜像:Tag>
MAINTAINER <用户名> “联系方式” #新版本推荐使用 LABEL maintainer=value
RUN <linux命令>
…
EXPOSE <端口号>
说明:
这个
EXPOSE
指令实际上并不发布端口。它作为构建映像的人和运行容器的人之间的一种文档类型,而这些港口将被发布。若要在运行容器时实际发布端口,请使用-p
旗上docker run
若要发布和映射一个或多个端口,或-P
标志以发布所有公开的端口,并将它们映射到高阶端口。
第二步:执行docker build命令
$ docker build [-t <镜像名>][–no-cache] <上下文路径>
-t 镜像名称
–no-cache 不使用缓存构建
上下文路径:
docker build 会将这个路径下所有的文件都打包上传给 Docker 引擎,
引擎内将这些内容展开后,就能获取到所有指定上下文中的文件了
注意不要将
/
作为<上下文路径>,因为他会把硬盘上所有的数据发给docker守护进程.
.dockerignore
创建.dockerignore
文件,通过在该文件里添加匹配目录,可以在执行docker build -t xxx .
命令时不上传匹配的目录。
#.dockerignore
/temp #匹配根目录下的子目录内所有的以temp开头的文件和文件夹
//temp* #匹配根目录下的子目录的子目录内所有的以temp开头的文件和文件夹
*/temp #匹配所有目录内的以temp开头的文件和文件夹
!my* #在排除文件及文件夹中允许上传my开头的文件及文件夹
Docker远程访问
Docker的配置文件在Centos7
/lib/systemd/system/docker.service
Docker守护进程Linux上配置文件的默认位置是
/etc/docker/daemon.json
或者通过--config-file
参数可用于指定非默认位置。
Docker守护进程启动选项
-
-H unix:///var/run/docker.sock
-
-H fd://(默认)
配置开始
第一步:配置远程的Docker
vi /lib/systemd/system/docker.service
修改[Service]->ExecStart
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H 0.0.0.0:2375
重启Docker
systemctl daemon-reload && systemctl restart docker
第二步:配置本地的系统环境变量
windows
set DOCKER_HOST=tcp://远程ip
Centos7
export DOCKER_HOST=tcp://远程ip
注意:以上配置都是临时的
测试
docker info
是否有结果
如果想更准确的测试,可以先将远程的Docker守护进程配置一个labels,然后执行命令即可
提示:
其实配置远程还有一种方法就是配置docker守护进程的配置文件
daemon.json
通过配置该文件下的hosts
内的值也可以实现,需要注意的是这两种方法只需要使用其中一种即可。
docker.service
[Service]->ExecStart
ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock
daemon.json
{
“hosts”:[
"0.0.0.0:2375",
"unix:///var/run/docker.sock"
]
}
Dockerfile指令
关键知识点
- 上下文路径:
上下文路径 是在使用`docker build`的时候最后一个参数锁指定的路径,通过该路径`docker客户端`会将该路径的下的所有文件都会发送给`docker守护进程`,然后在用户执行`COPY`和`ADD`的时候进行文件复制。如果有不想发送的文件可以向`.dockerignore`中写入匹配忽略路径。
- RUN的执行过程
RUN cd /app
RUN echo "hello" > world.txt
每一个 `RUN` 都是启动一个容器、执行命令、然后提交存储层文件变更。第一层 `RUN cd /app` 的执行仅仅是当前进程的工作目录变更,一个内存上的变化而已,其结果不会造成任何文件变更。而到第二层的时候,启动的是一个全新的容器,跟第一层的容器更完全没关系,自然不可能继承前一层构建过程中的内存变化。
FORM
这个
FROM
指令初始化新构建阶段,并设置基础镜像以后的指令。因此Dockerfile
必须有FROM
指令。Image可以是任何有效的Image它特别容易从公共储存库下载。
FROM [–platform=<平台>] [:] [AS ]
–platform 指定平台 如,linux/amd64, linux/arm64,或windows/amd64;默认自动
image 镜像名称
tag 类似于版本
As 起别名
ARG
ARG是在当前文件中设置变量,通过ARG定义变量可以在该文件内引用。
ARG VERSION=latest
FROM busybox:${VERSION} # FORM busybox:latest
LABEL
LABEL
指令将元数据添加到Image中。一个LABEL
是键值对。若要在LABEL
值内使用引号和反斜杠,就像在命令行解析中一样。
LABEL = = = …
例子:
LABEL “com.example.vendor”=“ACME Incorporated”
LABEL com.example.label-with-value=“foo”
LABEL version=“1.0”
LABEL description="This text illustrates \
that label-values can span multiple lines."
EXPOST
EXPOSE
指令通知Docker容器在运行时侦听指定的网络端口。您可以指定端口是否侦听TCP或UDP,如果未指定协议,则默认为TCP。
实际上他并无卵用。这里指定的端口仅仅只是作为文档给其他的人看。
EXPOSE [/…]
port 端口号
protocol 协议 tcp或udp
ENV
设置环境变量,该环境变量类似于linux中export的设置方法,区别在于他是永久的,所以他可以在后续的shell命令里使用该值。
ENV
ENV = =…
例子:
ENV HI HELLO
RUN echo “${HI}” # Hello
COPY
复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
COPY [–chown=:] <源路径1>… <目标路径>
COPY [–chown=:] [“<源路径1>”,… “<目标路径>”]
[–chown=:] 用户改变复制到容器内文件的拥有者和属组。
<源路径> 源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则
ADD
ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:
- ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
- ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
RUN
执行shell命令
CMD <shell 命令>
CMD [“<可执行文件或命令>”,“”,“”,…]
CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
- CMD 在docker run 时运行。
- RUN 是在 docker build。
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
CMD <shell 命令>
CMD [“<可执行文件或命令>”,“”,“”,…]
CMD [“”,“”,…] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
ENTRYPOINT
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
但是, 如果运行 docker run 时使用了 --entrypoint 选项,此选项的参数可当作要运行的程序覆盖 ENTRYPOINT 指令指定的程序。
优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,以下示例会提到。
ENTRYPOINT [“”,“”,“”,…]
WORKDIR
指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。
docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。
WORKDIR <工作目录路径>
USER
用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。
USER <用户名>[:<用户组>]
HEALTHCHECK
用于指定某个程序或者指令来监控 docker 容器服务的运行状态。
HEALTHCHECK [选项] CMD <命令> #设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
HEALTHCHECK [选项] CMD <命令> # CMD 后面跟随的命令使用,可以参考 CMD 的用法。
ONBUILD
他不会在本次docker build的时候执行,会在子镜像构建的时候执行后面的<Dockerfile指令>。
ONBUILD <Dockerfile指令>
MAINTAINER (官方不推荐)
这个是将该镜像的维护人的信息写到镜像中,这是一个旧版的写法。
MAINTAINER
代替方案
LABEL maintainer=
SHELL
通过该指令可以指定使用的shell解释器。
SHELL [“<Shell解释器>”, “<默认参数>”]
VOLUME
定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。
作用:
- 避免重要的数据,因容器重启而丢失,这是非常致命的。
- 避免容器不断变大。
VOLUME [“<路径1>”, “<路径2>”…]
VOLUME <路径>
Dockerfile的构建原理
docker会在执行每条Dockerfile的指令时会对FROM
引入的基础镜像进行操作。
每操作一步会运行镜像->生成容器->修改容器->提交容器->生成新的镜像->删除容器,然后在新的镜像上继续修改提交,反复如此,最后生成出最终镜像。这些在中间生成的镜像被称为中间层镜像。
我们可以通过docker history <镜像名>
来看生成镜像的过程。
Dockerfile源文件和上下文目录
2020/01/18 11:34 17 .dockerignore
2020/01/18 14:52 277 Dockerfile
2020/01/18 14:45
生成一个node的docker环境
FROM centos
LABEL maintainer=“wm 15804854160@163.com”
RUN curl --silent --location https://rpm.nodesource.com/setup_12.x | bash - \
&& yum -y install nodejs
WORKDIR /root/project
COPY ./ ./
RUN cd src \
&& npm install
EXPOSE 8080:80
构建过程
E:\PJ\程序设计\docker容器技术\dome\nodejsDockerfile>docker build -t demo .
Sending build context to Docker daemon 22.02kB
Step 1/7 : FROM centos
—> 470671670cac
Step 2/7 : LABEL maintainer=“wm 15804854160@163.com” #修改镜像
—> Running in 0a9bdf29772d #运行0a9bdf29772d容器
Removing intermediate container 0a9bdf29772d #删除0a9bdf29772d容器
—> 6bed20c22168 #生成新的镜像
Step 3/7 : RUN curl --silent --location https://rpm.nodesource.com/setup_12.x | bash - && yum -y install nodejs
—> Running in a6f52a14bfbc
Installing the NodeSource Node.js 12.x repo…
Inspecting system…
-
rpm -q --whatprovides redhat-release || rpm -q --whatprovides centos-release || rpm -q --whatprovides cloudlinux-release || rpm -q --whatprovides sl-release
-
uname -m
Confirming “el8-x86_64” is supported…
- curl -sLf -o /dev/null ‘https://rpm.nodesource.com/pub_12.x/el/8/x86_64/nodesource-release-el8-1.noarch.rpm’
As yum will try to install Node.js from the AppStream repository
instead of the NodeSource repository, the AppStream’s version of Node.js has to be disabled.
Run sudo yum module enable -y nodejs
to reactivate the AppStream’s Node.js repository.
- yum module disable -y nodejs
CentOS-8 - AppStream 1.3 MB/s | 5.9 MB 00:04
CentOS-8 - Base 190 kB/s | 4.0 MB 00:21
CentOS-8 - Extras 367 B/s | 2.1 kB 00:05
Dependencies resolved.
================================================================================
Package Architecture Version Repository Size
================================================================================
Disabling modules:
nodejs
Transaction Summary
================================================================================
Complete!
Downloading release setup RPM…
-
mktemp
-
curl -sL -o ‘/tmp/tmp.w4Aojk1oBL’ ‘https://rpm.nodesource.com/pub_12.x/el/8/x86_64/nodesource-release-el8-1.noarch.rpm’
Installing release setup RPM…
- rpm -i --nosignature --force ‘/tmp/tmp.w4Aojk1oBL’
Cleaning up…
- rm -f ‘/tmp/tmp.w4Aojk1oBL’
Checking for existing installations…
- rpm -qa ‘node|npm’ | grep -v nodesource
Run sudo yum install -y nodejs
to install Node.js 12.x and npm.
You may also need development tools to build native addons:
sudo yum install gcc-c++ make
To install the Yarn package manager, run:
curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
sudo yum install yarn
Node.js Packages for Enterprise Linux 8 - x86_6 37 kB/s | 94 kB 00:02
Last metadata expiration check: 0:00:01 ago on Sun Jan 19 08:42:03 2020.
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
nodejs x86_64 2:12.14.1-1nodesource nodesource 22 M
Installing dependencies:
python2 x86_64 2.7.16-12.module_el8.1.0+219+cf9e6ac9 AppStream 109 k
python2-libs x86_64 2.7.16-12.module_el8.1.0+219+cf9e6ac9 AppStream 6.0 M
python2-pip-wheel
noarch 9.0.3-14.module_el8.1.0+219+cf9e6ac9 AppStream 1.2 M
python2-setuptools-wheel
noarch 39.0.1-11.module_el8.1.0+219+cf9e6ac9 AppStream 289 k
Installing weak dependencies:
python2-pip noarch 9.0.3-14.module_el8.1.0+219+cf9e6ac9 AppStream 2.0 M
python2-setuptools
noarch 39.0.1-11.module_el8.1.0+219+cf9e6ac9 AppStream 643 k
Enabling module streams:
python27 2.7
Transaction Summary
================================================================================
Install 7 Packages
Total download size: 32 M
Installed size: 104 M
Downloading Packages:
(1/7): python2-2.7.16-12.module_el8.1.0+219+cf9 165 kB/s | 109 kB 00:00
(2/7): python2-pip-9.0.3-14.module_el8.1.0+219+ 571 kB/s | 2.0 MB 00:03
(3/7): python2-pip-wheel-9.0.3-14.module_el8.1. 409 kB/s | 1.2 MB 00:02
(4/7): python2-libs-2.7.16-12.module_el8.1.0+21 1.5 MB/s | 6.0 MB 00:03
(5/7): python2-setuptools-39.0.1-11.module_el8. 1.7 MB/s | 643 kB 00:00
(6/7): python2-setuptools-wheel-39.0.1-11.modul 805 kB/s | 289 kB 00:00
(7/7): nodejs-12.14.1-1nodesource.x86_64.rpm 1.7 MB/s | 22 MB 00:12
Total 1.8 MB/s | 32 MB 00:17
warning: /var/cache/dnf/AppStream-02e86d1c976ab532/packages/python2-2.7.16-12.module_el8.1.0+219+cf9e6ac9.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
CentOS-8 - AppStream 1.6 MB/s | 1.6 kB 00:00
Importing GPG key 0x8483C65D:
Userid : “CentOS (CentOS Official Signing Key) security@centos.org”
Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Key imported successfully
warning: /var/cache/dnf/nodesource-c1a37d2599ffab0c/packages/nodejs-12.14.1-1nodesource.x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID 34fa74dd: NOKEY
Node.js Packages for Enterprise Linux 8 - x86_6 1.6 MB/s | 1.6 kB 00:00
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
最后
由于篇幅限制,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!有需要的程序猿(媛)可以帮忙点赞+点击【学习资料】即可免费领取!
1.8 MB/s | 32 MB 00:17
warning: /var/cache/dnf/AppStream-02e86d1c976ab532/packages/python2-2.7.16-12.module_el8.1.0+219+cf9e6ac9.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
CentOS-8 - AppStream 1.6 MB/s | 1.6 kB 00:00
Importing GPG key 0x8483C65D:
Userid : “CentOS (CentOS Official Signing Key) security@centos.org”
Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Key imported successfully
warning: /var/cache/dnf/nodesource-c1a37d2599ffab0c/packages/nodejs-12.14.1-1nodesource.x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID 34fa74dd: NOKEY
Node.js Packages for Enterprise Linux 8 - x86_6 1.6 MB/s | 1.6 kB 00:00
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-R78Fuq3N-1713437868697)]
[外链图片转存中…(img-qbHCtDl4-1713437868698)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
[外链图片转存中…(img-i2M86pzn-1713437868698)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
[外链图片转存中…(img-R72I7O3C-1713437868698)]
最后
由于篇幅限制,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!有需要的程序猿(媛)可以帮忙点赞+点击【学习资料】即可免费领取!
[外链图片转存中…(img-v7VRzw0c-1713437868699)]
[外链图片转存中…(img-sky0eZ9l-1713437868699)]