10.Docker(一)-----安装、初步使用、镜像、Dockerfile常用指令、通过Dockerfile文件封装nginx镜像并优化

2023-10-31

一、简介

  • Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
  • 一个完整的Docker有以下几个部分组成:
    • DockerClient客户端
    • Docker Daemon守护进程
    • Docker Image镜像
    • DockerContainer容器

二、安装

1.安装配置

[root@server1 ~]# vim /etc/yum.repos.d/westos.repo #配置软件仓库
[root@server1 ~]# cat /etc/yum.repos.d/westos.repo	#查看配置
[root@server1 ~]# yum repolist 	#检测仓库
[root@server1 ~]# yum install -y docker-ce		#安装docker
[root@server1 ~]# systemctl enable --now docker	#开启docker服务,并设置为开机自启
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@server1 ~]# docker info		#查看 

仓库配有的安装包

在这里插入图片描述

安装

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

桥接

如果docker info 出现如下错误
在这里插入图片描述

[root@server1 ~]# sysctl -a | grep bridge-nf-call-iptables		#查看是1的话不用修改,也不会出现上述问题	
net.bridge.bridge-nf-call-iptables = 0		#修改为1
[root@server1 ~]# vim /etc/sysctl.d/docker.conf
[root@server1 ~]# cat /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
[root@server1 ~]# sysctl  --system
[root@server1 ~]# docker info
Registry: https://index.docker.io/v1/

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

2.导入马里奥游戏

## 下载马里奥游戏
[root@server1 ~]# lftp 172.25.15.250		
lftp 172.25.15.250:~> cd pub/images/
lftp 172.25.15.250:/pub/images> get mario.tar 
207414272 bytes transferred                   
lftp 172.25.15.250:/pub/images> exit
[root@server1 ~]# ls
mario.tar
[root@server1 ~]# docker load -i mario.tar 		#将游戏导入容器
4aeeaca5ce76: Loading layer  197.2MB/197.2MB
708fd576a927: Loading layer  208.9kB/208.9kB
90222f49bc4c: Loading layer  4.608kB/4.608kB
5f70bf18a086: Loading layer  1.024kB/1.024kB
dbe97b1b7330: Loading layer  1.536kB/1.536kB
44e5704d49fb: Loading layer  9.912MB/9.912MB
Loaded image: mario:latest
[root@server1 ~]# docker run -d --name demo -p 80:8080 mario	#运行
5ad30696ec3ce7c9efd33e5964f29333cb4dcd30e99c4d610f8195c2423f394c

在这里插入图片描述

浏览器访问172.25.15.1

在这里插入图片描述

3.删除

[root@server1 ~]# docker ps -a		#查看进程,所有的  (docker ps 正在运行的)
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
5ad30696ec3c        mario               "python3 -m http.ser…"   6 minutes ago       Up 6 minutes        0.0.0.0:80->8080/tcp   demo
[root@server1 ~]# docker rm -f demo	#删除
demo
[root@server1 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

在这里插入图片描述

4.导入2048游戏

##下载2048游戏
[root@server1 ~]# lftp 172.25.15.250
lftp 172.25.15.250:~> cd pub/images/
cd ok, cwd=/pub/images
lftp 172.25.15.250:/pub/images> get game2048.tar 
57176576 bytes transferred                        
lftp 172.25.15.250:/pub/images> exit
[root@server1 ~]# ls
game2048.tar  mario.tar
[root@server1 ~]# docker load -i game2048.tar 
011b303988d2: Loading layer   5.05MB/5.05MB
36e9226e74f8: Loading layer  51.46MB/51.46MB
192e9fad2abc: Loading layer  3.584kB/3.584kB
6d7504772167: Loading layer  4.608kB/4.608kB
88fca8ae768a: Loading layer  629.8kB/629.8kB
Loaded image: game2048:latest
[root@server1 ~]# docker run -d --name demo -p 80:80 game2048
6fb8beeaea6ae156afba03cca436e4b3dca01d023b7a92bb73979e41abbbc176
[root@server1 ~]# 

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

三、镜像

1.镜像的分层结构

容器层以下所有镜像层都是只读的
docker从上往下依次查找文件
容器层保存镜像变化的部分,并不会对镜像本身进行任何修改
一个镜像最多127层

2.退出方式

  • 编辑镜像时
    • ctrl+d #退出并删除
    • ctrl+qp #直接退出,进程进入后台

3.分层

[root@server1 ~]# cd /var/lib/docker/
[root@server1 docker]# docker pull busybox	#
Using default tag: latest
latest: Pulling from library/busybox
Digest: sha256:0f354ec1728d9ff32edcd7d1b8bbdfc798277ad36120dc3dc683be44524c8b60
Status: Image is up to date for busybox:latest
docker.io/library/busybox:latest
[root@server1 docker]# docker run -it --name demo busybox	#运行创建一个名字为demo的容器
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # touch file1
/ # touch file2
/ # touch file3
/ # touch file4
/ # touch file5
/ # ls
bin    etc    file2  file4  home   root   tmp    var
dev    file1  file3  file5  proc   sys    usr
/ # 
[root@server1 docker]# docker ps		#查看正在运行的
[root@server1 docker]# docker ps -a	#所有
[root@server1 docker]# docker start demo		#启动容器demo
[root@server1 docker]# docker container attach demo		#继续编辑镜像

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

[root@server1 docker]# docker commit demo demo:v1	#创建v1镜像
[root@server1 docker]# docker commit history demo:v1	#查看V1镜像
[root@server1 docker]# docker history busybox:latest
[root@server1 docker]# docker rmi demo:v1	#删除v1镜像
[root@server1 docker]# docker images

在这里插入图片描述
有基础的两层,加上编辑的一层,共三层
在这里插入图片描述删除v1
在这里插入图片描述

4.镜像的构建

  • docker commit 构建新镜像三部曲
    • 运行容器
    • 修改容器
    • 将容器保存为新的镜像
  • 缺点:
    • 效率低、可重复性弱、容易出错
    • 使用者无法对镜像进行审计,存在安全隐患
root@server1 ~]# mkdir docker
[root@server1 ~]# cd docker/
[root@server1 docker]# vim Dockerfile ##镜像的构建
[root@server1 docker]# cat Dockerfile 
FROM busybox	##指定base镜像,如果本地不存在会从远程仓库下载
RUN touch file1
RUN mkdir westos
[root@server1 docker]# docker build -t demo:v1 .	#创建v1
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM busybox
 ---> 69593048aa3a
Step 2/3 : RUN touch file1
 ---> Running in 645634f44648
Removing intermediate container 645634f44648
 ---> eec5bb41f5d2
Step 3/3 : RUN mkdir westos
 ---> Running in 9714250c45ee
Removing intermediate container 9714250c45ee
 ---> d3da9446a2c2
Successfully built d3da9446a2c2
Successfully tagged demo:v1

[root@server1 docker]# vim Dockerfile	#再次编写好容器的操作
FROM demo:v1	##指定base镜像,如果本地不存在会从远程仓库下载
RUN touch file2
RUN mkdir redhat
[root@server1 docker]# docker build -t demo:v2 .	#创建v2
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM busybox	
 ---> 69593048aa3a
Step 2/3 : RUN touch file2
 ---> Running in 4ab4ecbb36c9
Removing intermediate container 4ab4ecbb36c9
 ---> a82b29235c1d
Step 3/3 : RUN mkdir redhat
 ---> Running in 312a217cc548
Removing intermediate container 312a217cc548
 ---> 57b33e754a66
Successfully built 57b33e754a66
Successfully tagged demo:v2

[root@server1 docker]# docker history demo:v1	#查看容器的层数
[root@server1 docker]# docker history demo:v2	
[root@server1 docker]# docker images	#查看有几个容器

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

四、Dockerfile

1.常用指令

用来提交创建镜像

FROM		#指定base镜像,如果本地不存在会从远程仓库下载。
MAINTAINER	#设置镜像的作者,比如用户邮箱等。

COPY
#把文件从build context复制到镜像
#支持两种形式:COPY src dest 和 COPY ["src", "dest"]
#src必须指定build context中的文件或目录

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会被docker run后面的命令行覆盖,而ENTRYPOINT不会被忽略,一定会被执行。
#docker run后面的参数可以传递给ENTRYPOINT指令当作参数。
#Dockerfile中只能指定一个ENTRYPOINT,如果指定了很多,只有最后一个有效。

Shell和exec格式的区别
# cat Dockerfile
FROM busybox
ENV name world
ENTRYPOINT echo "hello, $name"


Shell格式底层会调用/bin/sh -c来执行命令,可以解析变量,而下面
的exec格式不会:
# cat Dockerfile
FROM busybox
ENV name world
ENTRYPOINT ["/bin/echo", "hello, $name"]

2.通过Dockerfile文件封装nginx镜像

[root@server1 ~]# cd docker/

## 1.下载nginx安装包
[root@server1 docker]# lftp 172.25.15.250
lftp 172.25.15.250:~> cd pub/docs/lamp/
lftp 172.25.15.250:/pub/docs/lamp> get nginx-1.20.1.tar.gz 
1061461 bytes transferred
lftp 172.25.15.250:/pub/docs/lamp> exit
[root@server1 docker]# ls
Dockerfile  nginx-1.20.1.tar.gz

## 2.软件仓库的配置
[root@server1 docker]# cp /etc/yum.repos.d/westos.repo .
[root@server1 docker]# ls
Dockerfile  nginx-1.20.1.tar.gz  westos.repo
[root@server1 docker]# cat westos.repo 
[wan]
name="wan"
baseurl=http://172.25.15.250/rhel7
gpgcheck=0
[docker]
name=docker
baseurl=ftp://172.25.15.250/pub/docs/docker/docker-ce
gpgcheck=0

## 3.下载rhel7镜像
[root@server1 docker]# lftp 172.25.15.250
lftp 172.25.15.250:~> cd pub/images/
lftp 172.25.15.250:/pub/images> get rhel7.tar 
147112448 bytes transferred                   
lftp 172.25.15.250:/pub/images> exit
[root@server1 docker]# ls
Dockerfile  nginx-1.20.1.tar.gz  rhel7.tar  westos.repo

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

## 4.导入镜像,封装
[root@server1 docker]# docker load -i rhel7.tar 	#导入
e1f5733f050b: Loading layer  147.1MB/147.1MB
[root@server1 docker]# vim Dockerfile 	#编写Dockerfile
[root@server1 docker]# cat Dockerfile 
FROM rhel7
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
COPY westos.repo /etc/yum.repos.d/
ADD nginx-1.20.1.tar.gz /mnt
RUN rpmdb --rebuilddb
RUN yum install -y gcc pcre-devel zlib-devel make
WORKDIR /mnt/nginx-1.20.1
RUN ./configure &> /dev/null
RUN make &> /dev/null
RUN make install &> /dev/null
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

[root@server1 docker]# docker build -t rhel7:v1 .	#封装容器rhel7:v1
[root@server1 docker]# docker run -d --name rhel7 rhel7:v1	#运行
[root@server1 docker]# docker inspect rhel7	#查看容器信息
[root@server1 docker]# cd /var/lib/docker/volumes	/9b855292b296fd0d4fe423342e52dc5ea5d9d190e7ab9cf131ceef7f95637577/_data	#进入目录
[root@server1 _data]# ls
[root@server1 _data]# echo www.jwl.org > index.html	#编写nginx默认发布文件
[root@server1 _data]# curl 172.17.0.2		#访问查看
www.jwl.org
[root@server1 _data]# 

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

[root@server1 _data]# docker images

在这里插入图片描述
我们看到封装好的v1有303MB,对于企业来说过大,因此我们要进行优化。

五、优化容器

1.第一种:简单优化,减少镜像层数

清理镜像构建的中间产物

[root@server1 docker]# vim Dockerfile 
[root@server1 docker]# cat Dockerfile 
FROM rhel7 as build
COPY westos.repo /etc/yum.repos.d/
ADD nginx-1.20.1.tar.gz /mnt
WORKDIR /mnt/nginx-1.20.1
RUN rpmdb --rebuilddb && yum install -y gcc make pcre-devel zlib-devel &> /dev/null && ./configure &> /dev/null && make &> /dev/null && make install &> /dev/null && rm -fr /mnt/nginx-1.20.1 && yum remove -y gcc make &&  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 rhel7:v2 .
[root@server1 docker]# docker run -d --name rhel7.1 rhel7:v2	#换个名称运行
[root@server1 docker]# docker images	#查看所有容器
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
rhel7               v2                  f3c552fd7ff4        3 minutes ago       233MB		#和v1比较少了130MB
rhel7               v1                  a8e39b9ae36a        46 minutes ago      303MB	#未优化
rhel7               latest              0a3eb3fde7fd        7 years ago         140MB	#原始镜像
[root@server1 docker]# 

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

2.第二种:使用多阶段构建镜像

[root@server1 docker]# vim Dockerfile 
[root@server1 docker]# cat Dockerfile 
FROM rhel7 as build
COPY westos.repo /etc/yum.repos.d/
ADD nginx-1.20.1.tar.gz /mnt
WORKDIR /mnt/nginx-1.20.1
RUN rpmdb --rebuilddb && yum install -y gcc make pcre-devel zlib-devel &> /dev/null && ./configure &> /dev/null && make &> /dev/null && make install &> /dev/null && rm -fr /mnt/nginx-1.20.1 && yum remove -y gcc make &&  yum clean all

FROM rhel7
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 rhel7:v3 .
[root@server1 docker]# docker run -d --name rhel7.2 rhel7:v3
736cd619254c4c157d8402144fff6f15628c56c5b79c571d9b7f321934c77b50
[root@server1 docker]# docker images		#V3相比v1和v2更小
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
rhel7               v3                  186d48c6f99a        40 seconds ago      144MB	##使用多阶段构建镜像 缩减到了144M,但还是比nginx官方镜像133M大很多
rhel7               v2                  f3c552fd7ff4        8 minutes ago       233MB	##减少镜像层数,清理镜像构建的中间产物
rhel7               v1                  a8e39b9ae36a        51 minutes ago      303MB	#未优化
rhel7               latest              0a3eb3fde7fd        7 years ago         140MB	#原始镜像

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

3.第三种:更换构建镜像,选择最精简的基础镜像

##1.下载镜像
[root@server1 docker]# ls
Dockerfile  nginx-1.20.1.tar.gz  rhel7.tar  westos.repo
[root@server1 docker]# lftp 172.25.15.250
lftp 172.25.15.250:~> cd pub/images/  
lftp 172.25.15.250:/pub/images> get base-debian10.tar 
20818944 bytes transferred                             
lftp 172.25.15.250:/pub/images> exit 
[root@server1 docker]# ls
base-debian10.tar  Dockerfile  nginx-1.20.1.tar.gz  rhel7.tar  westos.repo
[root@server1 docker]# docker load -i base-debian10.tar
de1602ca36c9: Loading layer  3.041MB/3.041MB
1d3b68b6972f: Loading layer  17.77MB/17.77MB
Loaded image: gcr.io/distroless/base-debian10:latest
[root@server1 docker]# docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
rhel7                             v3                  186d48c6f99a        6 minutes ago       144MB
rhel7                             v2                  f3c552fd7ff4        14 minutes ago      233MB
rhel7                             v1                  a8e39b9ae36a        57 minutes ago      303MB
rhel7                             latest              0a3eb3fde7fd        7 years ago         140MB
gcr.io/distroless/base-debian10   latest              d48fcdd54946        51 years ago        19.2MB

## 2.封装
[root@server1 docker]# vim Dockerfile 
[root@server1 docker]# cat 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 /lib/x86_64-linux-gnu/libpcre.so.* /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-debian10
COPY --from=base /opt /
EXPOSE 80 443
ENTRYPOINT ["nginx", "-g", "daemon off;"]

[root@server1 docker]# docker build -t rhel7:v4 .
[root@server1 docker]# docker run -d --name rhel7.3 rhel7:v4
19cef46b199993e6d1b53da00ad7227170095ef1323e44f5ccb6c16472bceb7e
[root@server1 docker]# docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED              SIZE
rhel7                             v4                  dc3e62941331        About a minute ago   31.9MB	#更换镜像,选择最精简的基础镜像
rhel7                             v3                  186d48c6f99a        13 minutes ago       144MB	#使用多阶段构建镜像 缩减到了144M,但还是比nginx官方镜像133M大很多
rhel7                             v2                  f3c552fd7ff4        20 minutes ago       233MB	#减少镜像层数,清理镜像构建的中间产物
rhel7                             v1                  a8e39b9ae36a        About an hour ago    303MB	#未优化
nginx                             latest              4cdc5dd7eaad        13 days ago          133MB
rhel7                             latest              0a3eb3fde7fd        7 years ago          140MB	#原始镜像
gcr.io/distroless/base-debian10   latest              d48fcdd54946        51 years ago         19.2MB
[root@server1 docker]# 

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

10.Docker(一)-----安装、初步使用、镜像、Dockerfile常用指令、通过Dockerfile文件封装nginx镜像并优化 的相关文章

随机推荐

  • 在Servlet中使用开源fileupload包实现文件上传功能

    当我们在 HTML 表单中选择本地文件之后点击 提交 按钮则会将文件上传到服务器中 此时该 HTTP 请求正文的数据类型就是 multipart form data 型的 而在 Servlet 技术中 该 HTTP 请求会被 Servlet
  • 在Windows上使用clang编译器

    在Stackoverflow等网站上 经常出现各种编译器的对比的结果 其中clang是很常见的 那么 怎样在Windows上使用clang呢 没那么直观 直接去llvm官网上下载clang的发行包 解压 到bin下面 看到应该是我们想要的工
  • QTreeWidget实现的树形节点的添加+双击响应+删除详解

    承接该文http blog csdn net bzhxuexi article details 10054289 在该文基础上继续讲解QTreeWidget控件的使用 同时解决该文最后留下的问题 QTreeWidget是实现树形结构的类 在
  • 微信小程序map组件路线规划,腾讯地图sdk的应用案例

    腾讯地图WebService API 是基于HTTPS HTTP协议的数据接口 开发者可以使用任何客户端 服务器和开发语言 按照腾讯地图WebService API规范 按需构建HTTPS请求 并获取结果数据 目前支持JSON JSONP方
  • stm32f103单片机—编码器测速

    一 涉及资源 stm32f103ZET6开发板 非指定 MG513P3012V型号电机 带霍尔编码器 非指定 二 涉及概念 1 单片机资源要求 此种测速方法要求单片机的定时器具有编码器模式 对于stm32f1系列 具备编码器模式的定时器有T
  • mysql a foreign key constraint fails_MySQL删除表:Cannot delete or update a parent row: a foreign key co...

    MySQL库中有俩表 table1和table2 相互关联 在删除表的时候出错 Cannot delete or update a parent row a foreign key constraint fails 很明显这是表关联生成的强
  • MATLAB APP纯小白入门 两数相加

    万事开头难 最怕第一次 使用matlab APP 实现两数求和 如下图所示 c a b 输入数字后 按 就计算 步骤 拖拽三个 Edit Field Numeric 过来 并且双击名字分别改为 a b c 注意修改名字后右边会有点变化 程序
  • 标准二阶响应--佛朗哥

    如果一个电路对任何有界输入在响应中产生一个有界的输出 就说明这个电路是稳定的 判断一个电路是否稳定一种方法是将某些能量注入到它的电抗元件中的一个或者多个 然后在没有任何外加电源的情况下观察这个电路是如何作为的 这种情况下的响应为无源或者自然
  • STM32F103 GPIO输出模式2MHz,10MHz,50MHz波形对比

    在STM32F103中GPIO的输出模式有三种速度配置 如图所示 经过测试发现 这三种速度的输出模式与IO的翻转频率没有关系 它们影响的可能是驱动能力 下面是在IO极限频率 18MHz 下 三种模式的波形
  • bootstrap实现轮播图

    div class carousel slide style width 400px margin 30px auto ol class carousel indicators li class active li li li ol div
  • 数据库类型区分

    数据库类型主要可分为 网状数据库 Network Database 关系数据库 Relational Database 树状数据库 Hierarchical Database 面向对象数据库 Object oriented Database
  • qemu 对 ARMv8的支持

    qemu 可以支持 ARMv8 且支持的 boot 包括 1 从 ATF启动 2 从 UEFI启动 3 从 u boot启动 4 从 linux 启动 这里打算用以下平台 qemu system aarch64 M virt cpu qem
  • buckboost变换器简介

    1 buckboost拓扑 Vo Vin D 1 D 极性相反 可以升压也可以降压
  • latex 大于小于大于等于小于等于

    转载于https www cnblogs com kjkj p 10505832 html 发现大部分人只回答大于等于号 小于等于号的写法 而没有说大于 小于号的分别写法 大于号 textgreater 小于号 textless 下面的后面
  • android 动画开发

    动画的分类 Android通过Animations为android UI提供了一系列的动画效果 可以进行旋转 缩放 淡入淡出等 这些效果可以应用在绝大多数的空间中 Android中的动画一般为两类 1 Frame by frame Anim
  • 笔试题(十二):走梅花桩

    Redraiment是走梅花桩的高手 Redraiment可以选择任意一个起点 从前到后 但只能从低处往高处的桩子走 他希望走的步数最多 你能替Redraiment研究他最多走的步数吗 数据范围 每组数据长度满足 1 n 200 数据大小满
  • 利用Charles打断点修改返回数据

    1 选择你需要修改数据的接口 2 选中后 proxy gt breakPoint Setting 在出来的弹窗中找到你标记的接口 双击 选择对应的方法 get post 然后将Query里面的删掉 写上 确保一下request和respon
  • python学习之基于Python的人脸识别技术学习

    摘要 面部识别技术的应用越来越广泛 它广泛应用于安全系统 人机交互 社交媒体 医疗保健等领域 本文介绍了基于Python的人脸识别技术 包括人脸检测 人脸特征提取和人脸识别三个部分 我们使用OpenCV和Dlib库来实现这些功能 并使用Py
  • Python实现最小顶点覆盖算法

    Python实现最小顶点覆盖算法 最小顶点覆盖问题是图论中的重要问题 其目标是找到至少数量的顶点 使得每一条边至少有一个端点被这些顶点所覆盖 该问题在实际中有诸多应用 例如网络流分析和计算机视觉等领域 本文将介绍如何使用Python实现最小
  • 10.Docker(一)-----安装、初步使用、镜像、Dockerfile常用指令、通过Dockerfile文件封装nginx镜像并优化

    安装 初步使用 镜像 Dockerfile常用指令 通过Dockerfile文件封装nginx镜像并优化 一 简介 二 安装 1 安装配置 仓库配有的安装包 安装 桥接 2 导入马里奥游戏 浏览器访问172 25 15 1 3 删除 4 导