docker 高阶 心已赠人 2023-10-03 08:14 35阅读 0赞 #### 文章目录 #### * * * * 简介 * 一、dockerfile * * 1、基础知识 * 2、dockerfile 指令 * 3、centos 简单测试 * 4、CMD 和 ENTRYPOINT 区别 * 5、实战 tomcat * 二、docker 网络 * * 1、初识docker网络 * 2、查看网络详情 * 4、docker 容器通信原理 * 三、容器互联 * 四、自定义网络 * * 1、常用命令 * 2、网络模式 * 3、自定义网络 * 4、新建网络 * 5、启动容器 * 6、小结 * 五、网络联通 * 六、实战:部署 redis 集群 ##### 简介 ##### 学习docker教程 [https://www.bilibili.com/video/BV1og4y1q7M4?p=30&spm\_id\_from=pageDriver][https_www.bilibili.com_video_BV1og4y1q7M4_p_30_spm_id_from_pageDriver]主要以记笔记为主,可能有些描述不太准确,希望能帮到你 ##### 一、dockerfile ##### ###### 1、基础知识 ###### * 每个保留关键字都必须是大写字母 * 执行从上而下顺序执行 * \#表示注释 * 每个指令都会去创建提交一个新的镜像,并提交 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70] docke 镜像逐渐成为企业交付的标准 Dockerfile 构建镜像的步骤 Dockerimage 通过docker 构建生成镜像 Docker 容器:容器就是镜像运行起来提供服务 ###### 2、dockerfile 指令 ###### `FROM # 基础镜像,一切从这里开始构建` `MAINTAINER # 镜像是谁写的,名字,邮箱等` `RUN # 镜像构建时需要运行的命令` `ADD # 步骤:tomcat 镜像、tomcat压缩包! 添加内容(类似从宿主机copy)` `WORKDIR # 镜像的工作目录(设置当前工作目录,类似创建容器时的 /bin/bash)` `VOLUME # 设置挂载卷,挂载目录` `EXPOSE # 端口配置,暴露端口,不暴露需要创建时通过 -p 指定` `RUN # 指定容器启动后要干的事情` `CMD # 指定这个容器启动时运行的命令、类似创建容器是指定 echo 输出等,只有最后一个生效,可被覆盖替代` `ENTRYPOINT # 指定这个容器启动时要运行的命令,可以追加命令` `ONBULID # 当构建一个被继承的 Dockerfile 这个时候就会运行 ONBUILD 指令,触发指令` `COPY # 类似 ADD 命令,将文件拷贝到镜像中` `ENV # 构建的时候设置环境变量` ###### 3、centos 简单测试 ###### Docker Hub 中 99% 的镜像都是从 FROM scratch 开始,然后配置需要的软件和配置进行构建 ①、构建一个简单的 centos FROM centos MAINTAINER yelingyun<2684789qq.com> ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install vim RUN yum -y install net-tools EXPOSE 80 CMD echo $MYPATH CMD echo "------end------ " CMD /bin/bash ②、生成镜像 # -f 指 dockerfile 的文件目录,-t 指生成镜像名以及 tag docker build -f dockerfile -t my_dock_centos:9.99 . ![在这里插入图片描述][20210616002042194.png] ③、测试镜像 启动镜像 docker run -it --name docker\_centos my\_dock\_centos:9.99 ![在这里插入图片描述][2021061600280795.png] 启动镜像之后默认进入设置的工作目录,可以正常使用 vim 编辑命令 ④、docker history mysql:latest 查询镜像的制作过程 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 1] ###### 4、CMD 和 ENTRYPOINT 区别 ###### ①、测试 CMD FROM centos CMD ["ls","-a"] 如上,可以正常打印容器的目录 若使用 docker run cmd\_test -l ,会报错,因为使用 -l 会替换 ls -a,提示 -l 不是一个命令,并不会达到预期效果(ls -al) ![在这里插入图片描述][2021061600443654.png] 可以使用 docker run cmd\_test ls -al 达到预期效果,因为如此使用,会用 ls -al 代替 ls -a ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 2] ②、测试 ENTRYPOINT 可追加命令,CMD 是替换 FROM centos ENTRYPOINT ["ls","a"] docker run ent\_test 相当于执行 ls -a ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 3] docker run ent\_test -l 相当于执行 ls -a -l 命令 ![在这里插入图片描述][20210616005403279.png] dockerfile 中许多命令十分相似,CMD 和 ENTRYPOINT 最大的区别就是 CMD 替换,ENTRYPOINT 是追加 ###### 5、实战 tomcat ###### dockerfile 使用压缩包创建 FROM centos MAINTAINER yelingyun<2689942@qq.com> # readme.md 可以写一些文件说明 COPY readme.md /usr/local/readme.md # 将两个压缩包添加进容器的 /usr/local 会自动解压,使用 COPY 不会自动解压 ADD jdk-8u161-linux-x64.tar.gz /usr/local ADD apache-tomcat-8.5.55.tar.gz /usr/local # 安装 vim 命令 RUN yum -y install vim # 设置工作目录( 使用 docker exec -it ye_diy_tomcat /bin/bash 进入容器,当前目录为 /usr/local) ENV MYPATH /usr/local WORKDIR $MYPATH # 配置 Java 和 tomcat 环境变量 ENV JAVA_HOME /usr/local/jdk1.8.0_161 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.55 ENV CATLINA_BASH /usr/local/apache-tomcat-8.5.55 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin # 暴露 8080 端口 EXPOSE 8080 # 启动容器时运行命令(启动tomcat,查看日志) CMD /usr/local/apache-tomcat-8.5.55/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.55/logs/catalina.out 使用dockerfile 制作镜像(如果文件名为 dockerfile 可以不添加 -f 指定dockerfile 文件目录,会去当前目录自动查找) `docker build -t div_tomcat` . ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 4] 启动镜像 docker run -d -p 8080:8080 --name ye_diy_tomcat -v /home/lighthouse/tomcat/test:/url/local/apache-tomcat-8.5.55/webapps/test -v /home/lighthouse/tomcat/tomcatlogs/:/url/local/apache-tomcat-8.5.55/logs diy_tomcat ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 5] docker 创建-发布-启动流程 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 6] ##### 二、docker 网络 ##### ###### 1、初识docker网络 ###### 宿主机 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 7] 查看容器内部地址 容器启动有一个 eth0@if223 的ip,docker 分配的 ![在这里插入图片描述][20210617234819166.png] Linux 宿主机,可以ping 通容器内部 ![在这里插入图片描述][20210617235023685.png] 每启动一个docker 容器,docker 就会给每个容器分配一个 ip ,如果宿主机安装 docker ,就会有一个网卡 docker0 桥接模式,使用的技术是veth-pair技术! ###### 2、查看网络详情 ###### ①、启动容器 tomcat01 * tomcat01容器内部 ![在这里插入图片描述][20210618000257868.png] * 宿主机 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 8] ②、启动容器 tomcat02 * tomcat02 内部 ![在这里插入图片描述][20210618000228312.png] * 宿主机 ![在这里插入图片描述][20210618000158689.png] ③、小结 * 发现容器分配的网卡,都是一对一对出现的 * veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连正因为有这个特性,veth-pair充当一个桥梁,连接各种虚拟网络设备的 * openstac,Docker容器之间的连接,oVs的连接,都是使用veth-pair技术 tomcat01 ping tomcat02 ![在这里插入图片描述][2021061800104734.png] ###### 4、docker 容器通信原理 ###### ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 9] 结论: * tomcat01 和 tomcat02 是公用的一个路由器,docker0。 * 所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用IP ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 10] 小结: Docker 使用 Linux 桥接技术(Veth-pair),docker 中所有的网络接口都是虚拟的,虚拟转发效率高 只要容器删除,对应的一堆网桥就没有了 ##### 三、容器互联 ##### 直接使用容器名不能 ping 通 ![在这里插入图片描述][202106180031272.png] 使用 --link docker run -d -P --name tomcat03 --link tomcat02 --link tomcat01 tomcat docker exec -it tomcat03 ping tomcat01 docker exec -it tomcat03 ping tomcat02 使用 --link 可以 ping 通 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 11] tomcat03 使用了 --link 可以 ping 通 tomcat02 ,tomcat02 没有使用 --link 不能 ping 通 tomcat03 ![在这里插入图片描述][20210618003610954.png] 查看 docker 网络配置 docker network ls ![在这里插入图片描述][20210618004102503.png] 查看详细配置 docker network inspect ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 12] 包含的容器 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 13] 查看 tomcat03 详细连接 docker inspect tomcat03 ![在这里插入图片描述][2021061800491561.png] docker exec -it tomcat03 cat /etc/hosts ![在这里插入图片描述][20210618005115848.png] docker0 不支持容器名访问 ##### 四、自定义网络 ##### ###### 1、常用命令 ###### docker network --help ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 14] 查看所有 docker 网络 docker network ls ![在这里插入图片描述][20210618005719859.png] ###### 2、网络模式 ###### * bridge : 桥接模式(默认,自己创建使用) * none:不配置网络 * host:和宿主机共享网络 * container:容器网络联通(用的少,局限大) 测试 docker run -d -P --name tomcat01 tomcat # 等同于下面,默认会加 --net bridge docker run -d -P --name tomcat01 --net bridge tomcat # docker0 默认,域名不能访问,--link 可以连接打通 ###### 3、自定义网络 ###### 创建网络 docker network create --help ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 15] ###### 4、新建网络 ###### # --driver bridge 默认桥接,--subnet 子网(不是子网掩码,子网掩码应该为 255.255.0.0) --gateway 网关 docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet docker network ls ![在这里插入图片描述][202106180111094.png] 详细信息 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 16] ###### 5、启动容器 ###### docker run -d -P --name tomcat-net-01 --net mynet tomcat docker run -d -P --name tomcat-net-02 --net mynet tomcat 查看 mynet 网络详情 `docker network inspect mynet` ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 17] 测试能否 ping 通 发现直接使用 IP 或者容器名都可以 ping 通,不需要再使用 --link ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 18] ###### 6、小结 ###### 我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络! 好处: * redis -不同的集群使用不同的网络,保证集群是安全和健康的 * mysql -不同的集群使用不同的网络,保证集群是安全和健康的 * 两个集群之间也可以连通 ##### 五、网络联通 ##### 之前的连接,容器之间都是属于同一个网段,如 tomcat-net-01(IP:192.168.0.2),tomcat-net-02(IP:192.168.0.3),容器之间可以正常联通,但是 tomcat01(IP:172.17.0.2)和 tomcat-net-01(IP:192.168.0.2)不在相同网段,不能直接 ping 通,需要使用 connect连接才可以 ping 通。 不同网段之间连通,tomcat01 使用默认 docker0 网络, tomcat-net-01 使用docker自定义网络mynet ![在这里插入图片描述][20210620214748226.png] `docker exec -it tomcat01 ping tomcat-net-01` 测试发现不同 ping 通 ![在这里插入图片描述][20210620214417213.png] 使用 docker network connect 连接 docker network connect --help 注意: Connect a container to a network,网络和容器连接,不是网络之间连接 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 19] 使用 mynet 网络连接 tomcat01(bridge网路) 容器 注意:不要使用bridge网络,bridge不能使用容器名连接,bridge需要使用 --link,自定义网络可以使用容器名连接 docker network connect mynet tomcat01 查看 mynet 网络 详情, docker network inspect mynet ,发现 tomcat01 容器加入了 mynet 网络 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 20] 测试 tomcat01(bridge网络)ping tomcat-net-01(mynet 网络) 成功 ping 通,使用 connect 可以将不同网段的容器进行互联 ![在这里插入图片描述][20210620223645793.png] ##### 六、实战:部署 redis 集群 ##### ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 21][] 运行 shell 脚本,创建六个 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.38.0.1${port} cluster-announce-port 6379 cluster-announce-bus-port 16379 appendonly yes EOF done 启动六个 redis 容器,端口递增 docker run -p 6371:6379 -p 16376: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.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf 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.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf 六个 redis 容器如下 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 22] 进入 redis-1 容器 docker exec -it redis-1 /bin/sh 注意使用 /bin/sh 不是 /bin/bash,进入容器默认工作目录 /data ![在这里插入图片描述][2021062023243723.png] 创建 redis 集群 redis-cli --cluster create 172.38.0.11:6379 127.38.0.12:637 9 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:63 79 --cluster-replicas 1 输入 yes 集群配置完毕 ![在这里插入图片描述][20210620232852948.png] 测试集群 进入redis-cli 集群,`redis-cli -c` 查看集群信息 `cluster info` ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 23] 查询集群节点`cluster nodes` ![在这里插入图片描述][20210620233555949.png] 插入一个值,添加到 13 中了 ![在这里插入图片描述][20210620233634996.png] 关闭 redis-3 容器,依旧可以在 redis-1 中获取到,集群部署测试成功 [https_www.bilibili.com_video_BV1og4y1q7M4_p_30_spm_id_from_pageDriver]: https://www.bilibili.com/video/BV1og4y1q7M4?p=30&spm_id_from=pageDriver [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70]: https://img-blog.csdnimg.cn/20210615234129772.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3,size_16,color_FFFFFF,t_70 [20210616002042194.png]: https://img-blog.csdnimg.cn/20210616002042194.png [2021061600280795.png]: https://img-blog.csdnimg.cn/2021061600280795.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 1]: https://img-blog.csdnimg.cn/20210616003305386.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3,size_16,color_FFFFFF,t_70 [2021061600443654.png]: https://img-blog.csdnimg.cn/2021061600443654.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 2]: https://img-blog.csdnimg.cn/20210616004703307.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3,size_16,color_FFFFFF,t_70 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 3]: https://img-blog.csdnimg.cn/20210616005341642.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3,size_16,color_FFFFFF,t_70 [20210616005403279.png]: https://img-blog.csdnimg.cn/20210616005403279.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 4]: https://img-blog.csdnimg.cn/20210617005206201.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3,size_16,color_FFFFFF,t_70 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 5]: https://img-blog.csdnimg.cn/20210617104239330.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3,size_16,color_FFFFFF,t_70 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 6]: https://img-blog.csdnimg.cn/20210617233246168.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3,size_16,color_FFFFFF,t_70 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 7]: https://img-blog.csdnimg.cn/20210617234332768.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3,size_16,color_FFFFFF,t_70 [20210617234819166.png]: https://img-blog.csdnimg.cn/20210617234819166.png [20210617235023685.png]: https://img-blog.csdnimg.cn/20210617235023685.png [20210618000257868.png]: https://img-blog.csdnimg.cn/20210618000257868.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 8]: https://img-blog.csdnimg.cn/2021061800001217.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3,size_16,color_FFFFFF,t_70 [20210618000228312.png]: https://img-blog.csdnimg.cn/20210618000228312.png [20210618000158689.png]: https://img-blog.csdnimg.cn/20210618000158689.png [2021061800104734.png]: https://img-blog.csdnimg.cn/2021061800104734.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 9]: https://img-blog.csdnimg.cn/20210618001454684.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3,size_16,color_FFFFFF,t_70 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 10]: https://img-blog.csdnimg.cn/2021061800210085.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3,size_16,color_FFFFFF,t_70 [202106180031272.png]: https://img-blog.csdnimg.cn/202106180031272.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 11]: https://img-blog.csdnimg.cn/20210618003415425.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3,size_16,color_FFFFFF,t_70 [20210618003610954.png]: https://img-blog.csdnimg.cn/20210618003610954.png [20210618004102503.png]: https://img-blog.csdnimg.cn/20210618004102503.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 12]: https://img-blog.csdnimg.cn/20210618004328681.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3,size_16,color_FFFFFF,t_70 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 13]: https://img-blog.csdnimg.cn/20210618004501987.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3,size_16,color_FFFFFF,t_70 [2021061800491561.png]: https://img-blog.csdnimg.cn/2021061800491561.png [20210618005115848.png]: https://img-blog.csdnimg.cn/20210618005115848.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 14]: https://img-blog.csdnimg.cn/20210618005604104.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3,size_16,color_FFFFFF,t_70 [20210618005719859.png]: https://img-blog.csdnimg.cn/20210618005719859.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 15]: https://img-blog.csdnimg.cn/20210618010703481.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3,size_16,color_FFFFFF,t_70 [202106180111094.png]: https://img-blog.csdnimg.cn/202106180111094.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 16]: https://img-blog.csdnimg.cn/20210618011424283.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3,size_16,color_FFFFFF,t_70 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 17]: https://img-blog.csdnimg.cn/20210618011808358.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3,size_16,color_FFFFFF,t_70 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 18]: https://img-blog.csdnimg.cn/20210618012121891.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3,size_16,color_FFFFFF,t_70 [20210620214748226.png]: https://img-blog.csdnimg.cn/20210620214748226.png [20210620214417213.png]: https://img-blog.csdnimg.cn/20210620214417213.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 19]: https://img-blog.csdnimg.cn/20210620215032332.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3,size_16,color_FFFFFF,t_70 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 20]: https://img-blog.csdnimg.cn/20210620223416797.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3,size_16,color_FFFFFF,t_70 [20210620223645793.png]: https://img-blog.csdnimg.cn/20210620223645793.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 21]: https://img-blog.csdnimg.cn/20210620225909368.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3,size_16,color_FFFFFF,t_70 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 22]: https://img-blog.csdnimg.cn/20210620232254283.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3,size_16,color_FFFFFF,t_70 [2021062023243723.png]: https://img-blog.csdnimg.cn/2021062023243723.png [20210620232852948.png]: https://img-blog.csdnimg.cn/20210620232852948.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3_size_16_color_FFFFFF_t_70 23]: https://img-blog.csdnimg.cn/20210620233354128.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTM4MDk3,size_16,color_FFFFFF,t_70 [20210620233555949.png]: https://img-blog.csdnimg.cn/20210620233555949.png [20210620233634996.png]: https://img-blog.csdnimg.cn/20210620233634996.png
相关 高阶函数 高阶函数是接受函数作为参数并且/或者返回函数作为输出的函数. 函数作为参数传递是JavaScript规范的一部分.JavaScript作为一门语言将函数作为数据,允许函数替代 男娘i/ 2023年07月06日 06:10/ 0 赞/ 135 阅读
相关 高阶组件 什么是高阶组件? 高阶部位是一种用于复用组件逻辑的高级技术,它并不是React API的一部分。而是从React演化而来的一种模式。具体地说,高阶组件就是一个接受一个组 亦凉/ 2023年06月17日 11:53/ 0 赞/ 95 阅读
相关 高数——高阶导数 高阶导数的用处 高阶导数非常有用,二阶导可以判断函数图像的凹凸性;泰勒级数公式是用系数含有n阶导的x的幂次方表示的,而泰勒级数的作用非常强大,它可以把非常复杂的函数变成容 灰太狼/ 2023年06月08日 10:53/ 0 赞/ 117 阅读
相关 Docker进阶 容器数据卷 什么是容器数据卷 将应用和环境打包成一个镜像! 数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化 MySQL,容器删除了, 水深无声/ 2023年01月13日 10:54/ 0 赞/ 288 阅读
相关 高阶函数(1) 高阶函数 高阶函数至少满足以下条件: 函数可以作为参数被传递 函数可以作为返回值输出 JavaScript中高阶函数类型 1.回调函数 淩亂°似流年/ 2022年06月07日 12:10/ 0 赞/ 344 阅读
相关 CSS高阶 列表属性,设置不显示样式 ol,ul{ list-style: none; } 文本属性 <!DOCTYPE html> <html lang=" 梦里梦外;/ 2022年05月29日 13:41/ 0 赞/ 277 阅读
相关 高阶函数 百度百科的解释: 在数学和计算机科学中,高阶函数是至少满足下列一个条件的函数: ①接受一个或多个函数作为输入; ②输出一个函数 第一个条件就是:函数作为参数传入 灰太狼/ 2021年08月19日 15:42/ 0 赞/ 616 阅读
还没有评论,来说两句吧...