docker的镜像创建 dockerfile

dockerfile

Dokcer镜像的创建
创建镜像有三种方法,分别为【基于已有镜像创建】、【基于本地模板创建】以及【基于Dockerfile创建】。 

(1)首先启动一个镜像,在容器里做修改
docker run -itd --name web centos:7 /bin/bash     #启动容器
 ​
yum install -y epel-release  #安装epel源
yum install -y nginx         #安装nginx
yum install net-tools        #安装tools工具
nginx                        #启动服务
netstat -natp |grep 80       #查看端口是否开启
 ​
docker ps -a   #查看容器ID
 ​
(2)然后将修改后的容器提交为新的镜像,需要使用该容器的ID号创建新镜像
docker commit -m "new nginx" -a "xxxx" 容器id nginx:centos7
 #常用选项:
 -m 指定说明信息;
 -a 指定作者信息;
 -p 生成过程中停止容器的运行。
 c7f4bc905c29  原容器ID。
 nginx:centos  生成新的镜像名称。
 ​
docker images                                #查看生成的新镜像
docker run -itd nginx:centos7 bash           #使用新的镜像创建容器
docker ps -a                                 #查看容器状态
docker exec -it 容器id bash                  #进入容器
nginx                                        #启动nginx服务
netstat -natp |grep 80                       #查看80端口是否开启


基于本地模板创建 
通过导入操作系统模板文件可以生成镜像,模板可以从OPENVZ 开源项目下载,下载地址为: 

openvz.org/ Download/template/precreated

模板里面就是使用docker export 命令导出的容器文件
 ​
#下载模板
wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz

ebian 7.0已经是一个相对较旧的Linux发行版,其支持已经结束,
建议考虑使用更新版本的 Debian 或其他更现代的 Linux 发行版。
 ​
#导入为镜像,两种方法
cat debian-7.0-x86-minimal.tar.gz | docker import - debian:test  #方法一
  
docker import debian-7.0-x86-minimal.tar.gz -- debian:test  #方法二
 ​
#查看镜像
docker images
 ​
#使用导入的镜像创建容器
docker run -itd debian:test bash
docker ps -a


基于Dockerfile创建 
联合文件系统(UnionFS ) 
Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),
可以制作各种具体的应用镜像。

特性: 一次同时加载多个文件系统,但从外面看起来,只能看到一一个文件系统,
联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
我们下载的时候看到的一层层的就是联合文件系统。

镜像加载原理 
Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是UnionFS。

rootfs:
rootfs 是指 Docker 镜像中的根文件系统。它包含了一个完整的文件系统,包括所有的文件和目录,
以及与之相关的权限、所有权等信息。在运行容器时,这个文件系统会被挂载到容器的根目录。

Docker 镜像是由一系列层(layers)组成的,每一层都包含文件系统的一部分。这些层在逻辑上叠加在一起,
形成最终的文件系统,而这个最终的文件系统就是 rootfs。

bootfs:
bootfs 是一个概念,通常用来描述 Docker 镜像中用于引导的文件系统。
引导文件系统是用于启动操作系统的文件系统,包含了启动时所需的核心文件等。
在 Docker 中,bootfs 可以看作是镜像中的一部分,它包含了启动容器所需的最基本的文件。

bootfs主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统。

在Docker镜像的最底层是bootfs,这一层 与我们典型的Linux/Unix系统是一样的, 包含boot加载器和内核。
当boot加载完成之 后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

rootfs,在bootfs之 上。包含的就是典型Linux系统中的/dev、/proc、/bin、/etc等标准目录和文件。
rootfs就是各种不同的操作系统发行版,比如Ubuntu, Centos等。

bootfs就是内核引导器(引导加载内核)和内核。

rootfs是n多个基础镜像(提供基础操作环境)和应用镜像叠加在一起的只读层。

运行的容器实例会在rootfs之上添加一个可读可写层。

容器中操作系统容量小的原因 

因为对于精简的OS,rootfs可以很小, 只需要包含最基本的命令、工具和程序库就可以了,
因为底层直接用宿主机的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版,
bootfs基本是一 致的, rootfs会 有差别,因此不同的发行版可以公用bootfs。

大部分镜像是通用的,但如果专门基于某个版本创建的镜像,在其他版本的操作系统中运行可能会有问题。

Docker镜像结构的分层
镜像不是一个单一的文件,而是有多层构成。容器其实是在镜像的最上面加了一层读写层,
在运行容器里做的任何文件改动,都会写到这个读写层。如果删除了容器,也就删除了其最上面的读写层,
文件改动也就丢失了。Docker使用存储驱动管理镜像每层内容及可读写层的容器层。

(1)Dockerfile中的每个指令都会创建一个新的镜像层;

(2)镜像层将被缓存和复用;

(3)当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,
对应的镜像层缓存就会失效;

(4)某一层的镜像缓存失效,它之后的镜像层缓存都会失效;

(5)镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,
则镜像中依然会包含该文件,只是这个文件在Docker 容器中不可见了。

Dockefile
Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,
还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
镜像不包含任何动态数据,其内容在构建之后也不会被改变。 

镜像的定制实际上就是定制每一层所添加的配置、文件。
如果我们可以把每一层修改 安装、构建、操作的命令都写入一个脚本,
用这个脚本来构建、定制镜像,那么镜像构建透明性的问题、体积的问题就都会解决。
这个脚本就是Dockerfile。

我们需要定制首己额外的需求时,只需在Docketlle上添加或者修改指令,重新生成image 即可,
省去了敲命令的麻烦。就是描述该层应当如何构建。有了Dockerfile,当我们需要定制自己额外的需求时,
只需在Dockerfile上添加或者修改指令,重新生成image即可,省去了敲命令的麻烦。

除了手动生成Docker镜像之外,可以使用bockerfile自动生成镜像。
Dockerfile 是由多条的指令组成的文件,其中每条指令对应Linux中的一条命令,
Docker程序将读取Dockerfile中的指令生成指定镜像。

Dockerfile结构大致分为四个部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以“#“号开头的注释。

Dockerfile其实就是我们用来构建Docker镜像的源码,当然这不是所谓的编程源码,而是一些命令的组合,
只要理解它的逻辑和语法格式,就可以编写Dockerfile了。

简单点说,Dockerfile的作用:它可以让用户个性化定制Docker镜像。因为工作环境中的需求各式各样,
网络上的镜像很难满足实际的需求。

Dockerfile常见命令: 

命令                       作用
FROM                   image_name:tag    声明基础镜像

MAINTAINER             user_name        声明镜像的作者

ENV key value           设置环境变量 (可以写多条)

RUN command               编译镜像时运行的脚本(可以写多条)

CMD                       设置容器的启动命令

ENTRYPOINT               设置容器的入口程序

ADD source_dir/file     将宿主机的文件复制到镜像内,如果是一个压缩文件,
dest_dir/file           将会在复制后自动解压。
                       支持URL路径下载源文件,
                       但下载方式不能自动解压。

COPY source_dir/file    和ADD相似,将宿主机的文件复制到镜像内,
dest_dir/file           但是如果有压缩文件并不能解压。不支持URL路径下载。
           
WORKDIR path_dir       设置工作目录

ARG                       设置工作目录

VOLUMN                   设置容器的挂载卷


FROM: 指定新镜像的基础镜像。

MAINTAINER: 提供有关镜像维护人的信息(已弃用,由LABEL替代)。

RUN: 在基础镜像上执行命令,并提交结果到新镜像。每一个RUN都是镜像的一层,分层越多,镜像越大

ENTRYPOINT: 设置容器运行时的默认命令及参数。

CMD: 指定容器运行时的默认命令(可以在运行时被覆盖)。

EXPOSE: 告诉Docker容器在运行时监听指定的网络端口(容器端口)。

ENV: 为后续指令设置环境变量,会被后面的RUN使用

ADD: 将文件从源路径复制到镜像的目标路径,支持URL和自动解压。

COPY: 将文件从源路径复制到镜像的目标路径(仅限本地文件)。

VOLUME: 创建一个挂载点并指定为可在外部挂载的点。

USER: 设置运行镜像时使用的用户或UID。

WORKDIR: 为后续指令设置工作目录。

ONBUILD: 指定当该镜像作为另一个构建的基础时要运行的命令。

ARG: 定义在Dockerfile中用于构建时由用户传递的变量。ARG 用于构建时的参数传递,
而 ENV 用于在容器运行时设置环境变量。

-------------------------------------CMD和ENTRYPOINT的区别---------------------------------------------------------
[root@docker1 cmd]# cat dockerfile 
# Dockerfile

# 使用基础镜像
FROM centos:7

# 设置作者信息
MAINTAINER "Your Name <your.email@example.com>"

# 使用 ENTRYPOINT 指令设置容器启动时执行的默认命令
ENTRYPOINT ["echo","hello"]

# 使用 CMD 指令设置默认参数,这些参数会传递给 ENTRYPOINT 指令中的命令

CMD ["WORLD"]

docker build -t centos5:test .

docker run -it --name test centos:test ls /etc  #不要加d,否则会后台运行。

一个dockerfile中一般只有有一个ENTRYPOINT和CMD,多个ENTRYPOINT和CMD只会执行最后一个。

ENTRYPOINT 指定的命令会在容器启动时执行,并且这个命令会成为容器的主进程。
主进程负责接收信号,处理容器的生命周期,并且在主进程退出时容器也会终止。

ENTRYPOINT的指令不会被覆盖,而CMD的命令在构建镜像时,使用docker run 加上参数会覆盖CMD的指令。

ENTRYPOINT设定容器启动时第一个运行的命令;

CMD是启动容器时默认执行的命令,如果指定多条CMD命令,只执行最后一条命令。

如果在docker run时指定了命令或者镜像中有ENTRYPOINT,那么CMD就会被覆盖,
并且会将CMD中的命令作为参数传给ENTRYPOINT。

CMD可以为ENTRYPOINT进行传参。

----------------------------RUN命令的优化------------------------------------------------------------
&& 符号:
RUN ls /opt && yum -y insatll nginx
#&& 连接多个命令,确保前一个命令成功后才执行下一个命令

分号 ;:
使用分号可以在一行中连接多个命令,不管前一个命令是否成功,后面的命令都会被执行。
dockerfile
Copy code
RUN command1 ; command2 ; command3

双竖线 ||:
双竖线表示“或者”,如果前一个命令失败,才会执行后面的命令。
dockerfile
Copy code
RUN command1 || command2

反斜杠 \:
反斜杠可以用来将一行命令拆分成多行,提高可读性。相当于换行
dockerfile
Copy code
RUN command1 \
    && command2 \
    && command3

-------------------------------------copy和add的区别-------------------------------------------------
ADD和COPY比较:(同样需求下,官方推荐使用 COPY)

1、共同点:
ADD和COPY都可以复制本地文件到镜像中。

2、区别:
ADD:如果是一个压缩文件,ADD会在复制后自动解压。且支持URL路径下载源文件,但URL下载和解压特性不能一起使用,
任何压缩文件通过URL拷贝,都不会自动解压。

COPY:如果是压缩文件,COPY并不能解压。且COPY只能复制本地文件,不支持URL路径拷贝。


ADD 的优点: 在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip、bzip2 以及 xz 的情况下,
会自动复制并解压到 <目标路径>。

ADD 的缺点: 在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,
从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

构建一个httpd的dockerfile:
FROM centos:7
MAINTAINER this is my  diy apache <dn>
RUN yum install -y gcc gcc-c++ make pcre pcre-devel expat-devel perl
ADD apr-1.6.2.tar.gz /opt/
ADD apr-util-1.6.0.tar.gz /opt/
ADD httpd-2.4.29.tar.bz2 /opt/
RUN mv /opt/apr-1.6.2 /opt/httpd-2.4.29/srclib/apr && mv /opt/apr-util-1.6.0 /opt/httpd-2.4.29/srclib/apr-util &&\
cd /opt/httpd-2.4.29/ &&\
./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi &&\
make -j 4 && make install
EXPOSE 80
CMD ["/usr/local/httpd/bin/apachectl","-D","FOREGROUND"]


docker build -t apache:centos .


镜像容量过大的解决方案 
基础镜像尽量使用轻量级最小化的镜像。

Dockerfile中尽量把RUN指令合并在一起,减少镜像的层数(因为每一个RUN指令就是一个镜像层)。

多级构建(拿Dockerfile构建好的镜像再构建一次)。

#基层镜像
FROM centos:7 AS first
#镜像作者信息描述
MAINTAINER this is apache image <yh 2022-11-23 >
#指定的Linu执行脚本
RUN yum -y install gcc gcc-c++ make pcre pcre-devel expat-devel perl
#将源码编译的安装包安放到容器中并进行解压
ADD apr-1.6.2.tar.gz /opt/
ADD apr-util-1.6.0.tar.gz /opt/
ADD httpd-2.4.29.tar.bz2 /opt/
#进行源码编译安装
RUN mv /opt/apr-1.6.2 /opt/httpd-2.4.29/srclib/apr && mv /opt/apr-util-1.6.0 /opt/httpd-2.4.29/srclib/apr-util && cd /opt/httpd-2.4.29 && ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi && make -j 4 && make install
#二阶段构建
FROM centos:7
#将一阶段的已安装好的包安防到二阶端中,并舍弃一阶段的其他无用资源
COPY --from=first  /usr/local/httpd  /usr/local/httpd
#安装apache运行所需的环境依赖包,不再安装源码编译所需的依赖包
RUN yum install -y pcre pcre-devel expat-devel perl
EXPOSE 80
ENTRYPOINT ["/usr/local/httpd/bin/apachectl","-D","FOREGROUND"]

docker build -t apache1:centos .

基于centos 构建一个 nginx的dockefile

#创建目录存放相关文件

mkdir nginxdockerfile
cd nginxdockerfile
echo "docker nginx build successful" > index.html

vi Dockerfile
FROM centos:7
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
WORKDIR /usr/local/src
ENV NG_VERSION=nginx-1.25.1
RUN yum -y install epel-release
RUN yum -y install wget
RUN wget http://nginx.org/download/$NG_VERSION.tar.gz && tar xzvf $NG_VERSION.tar.gz 
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel && yum install -y pcre-devel libxslt-devel gd-devel GeoIP GeoIP-devel GeoIP-data
RUN yum clean all 
RUN useradd -M -s /sbin/nologin nginx 
WORKDIR /usr/local/src/$NG_VERSION 
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install
ADD index.html /usr/local/nginx/html 
VOLUME /usr/local/nginx/html 
ENV PATH /usr/local/nginx/sbin:$PATH 
EXPOSE 80/tcp 
ENTRYPOINT ["nginx"]
CMD ["-g","daemon off;"]

##构建镜像

docker build -t centos7:nginx .

#创建容器

docker run -d --name nginx -p 8080:80 centos7:nginx

访问

Htpp:网址:8080

z注释:

#基准镜像
FROM centos:7
#作者信息
LABEL version="nginx v1"
LABEL "emill"="2@qq.com"
#调整系统时间差
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#工作目录
WORKDIR /usr/local/src/ 
#定义环境变量
ENV NG_VERSION nginx-1.21.0 
#安装epel仓库
RUN yum -y install epel-release 
#安装wget
RUN yum -y install wget 
#下载nginx文件并解压
RUN wget http://nginx.org/download/$NG_VERSION.tar.gz && tar xzvf $NG_VERSION.tar.gz 
#安装编译依赖包
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel && yum install -y pcre-devel libxslt-devel gd-devel GeoIP GeoIP-devel GeoIP-data
#清理仓库
RUN yum clean all 
#创建nginx用户
RUN useradd -M -s /sbin/nologin nginx 
#切换工作目录
WORKDIR /usr/local/src/$NG_VERSION 
#编译安装nginx
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install
#复制测试页面到容器中
ADD index.html /usr/local/nginx/html 
#设置容器中要挂在到宿主机的目录
VOLUME /usr/local/nginx/html 
#设置sbin环境变量
ENV PATH /usr/local/nginx/sbin:$PATH 
#暴露80端口
EXPOSE 80/tcp 
ENTRYPOINT ["nginx"]
CMD ["-g","daemon off;"]
#当ENTRYPOINT和CMD连用时,CMD的命令是ENTRYPOINT命令的参数,两者连用相当于nginx -g "daemon off;"而当一起连用的时候命令格式最好一致(这里选择的都是json格式的是成功的,如果都是sh模式可以试一下)

1.FROM
功能为指定基础镜像,并且必须是第一条指令。 如果不以任何镜像为基础,那么写法为:FROM scratch。 同 时意味着接下来所写的指令将作为镜像的第一层开始

2.RUN
功能为运行指定的命令

注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层. 多少个RUN就构建了多 少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。 RUN书写时的换行 符是\

3.CMD
功能为容器启动时要运行的命令

注意:补充细节:这里边包括参数的一定要用双引号,就是",不能是单引号。千万不能写成单引号。 原因是参数传递后,docker解析的是一个JSON array

4.RUN和CMD的区别
不要把RUN和CMD搞混了。 RUN是构件容器时就运行的命令以及提交运行结果 CMD是容器启动时执行的命 令,在构件时并不运行,构件时紧紧指定了这个命令到底是个什么样子

5.LABEL
功能是为镜像指定标签,为镜像写一些注释信息

但是并不建议这样写,最好就写成一行,如太长需要换行的话则使用\符号 如下:

注意:LABEL会继承基础镜像种的LABEL,如遇到key相同,则值覆盖

6.EXPOSE
功能为暴漏容器运行时的监听端口给外部 但是EXPOSE并不会vim 使容器访问主机的端口 如果想使得容器与主 机的端口有映射关系,必须在容器启动的时候加上 -P参数

注意:如果在端口号后面加/tcp,默认为tcp协议,如果需要UDP端口需要添加/udp

7.ENV
功能为设置环境变量

8.ADD
一个复制命令,把文件复制到镜象中。 如果把虚拟机与容器想象成两台linux服务器的话,那么这个命令就类似 于scp,只是scp需要加用户名和密码的权限验证,而ADD不用。

注意:尽量不要把写成一个文件夹,如果是一个文件夹了,复制整个目录的内容,包括文件系统元数据

9.WORKDIR
设置工作目录,对RUN,CMD,ENTRYPOINT,COPY,ADD生效。如果不存在则会创建,也可以设置多次

10.VOLUME
可实现挂载功能,可以将内部文件夹挂载到外部

11.ENTRYPOINT
该命令与CMD类似,用于执行命令使用,还可以与CMD命令一起拼合使用

它与CMD的区别: ​ 相同点:只能写一条,如果写多条,那么只有最后一条生效

不同点:CMD在创建容器时,在后面添加其他的CMD指令,CMD会被覆盖,但是ENTRYPOINT不会被覆盖,如果两个同时使用,CMD会变成ENTRYPOINT的参数

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

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

相关文章

k8s pod日志写入ELK的具体实现

shigen坚持更新文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 在上一部分&#xff0c;shigen讲到了k8spod的日志写入ELK的三种技术方案&#xff0c;并在最后展示了一下我…

QMainWindow和QWidget有什么区别

2023年12月12日&#xff0c;周二上午 QMainWindow 和 QWidget 是 Qt 框架中两个不同的类&#xff0c;用于创建用户界面的窗口部件。它们之间的主要区别在于它们的设计和用途。 QMainWindow: QMainWindow 是用于创建主窗口的类&#xff0c;通常包含了一个应用程序的主要界面。…

NFR 数字权益开发流程

NFR 在技术开发领域通常指的是“非功能性需求”&#xff08;Non-Functional Requirements&#xff09;&#xff0c;这些是描述系统属性如安全性、性能、可用性、兼容性等方面的需求。然而&#xff0c;如果在这里 NFR 被用来指代与数字权益或非同质化代币&#xff08;NFT&#x…

C++ 构造函数 调用方法

构造函数 调用方法 //括号法&#xff08;常用&#xff09; Person p1(100); //有参构造 Person p2(p1); //拷贝构造//注意&#xff1a;不要用括号法调用无参构造&#xff0c;会和 函数声明 混淆。//显示法 Person p3 Person(); //无参构造 Person p4 Person(100); //有参构…

【USRP】LFTX / LFRX

LFTX/LFRX 设备概述 LFTX 子板利用两个高速运算放大器来允许 0-30 MHz 的传输。该板仅接受实模式信号。LFTX 非常适合 HF 频段的应用&#xff0c;或使用外部前端来上变频和放大中间信号的应用。LFTX 的输出可以独立处理&#xff0c;也可以作为单个 I/Q 对进行处理。 主要特征…

Python - 搭建 Flask 服务实现图像、视频修复需求

目录 一.引言 二.服务构建 1.主函数 upload_gif 2.文件接收 3.专属目录 4.图像修复 5.gif2mp4 6.mp42gif 7.图像返回 三.服务测试 1.服务启动 2.服务调用 四.总结 一.引言 前面我们介绍了如何使用 Real-ESRGAN 进行图像增强并在原始格式 jpeg、jpg、mp4 的基础上…

HeartBeat监控Redis状态

目录 一、概述 二、 安装部署 三、配置 四、启动服务 五、查看数据 一、概述 使用heartbeat可以实现在kibana界面对redis服务存活状态进行观察&#xff0c;如有必要&#xff0c;也可在服务宕机后立即向相关人员发送邮件通知 二、 安装部署 参照文章&#xff1a;HeartBeat监…

Java实现多线程的三种方式

Java 有三种方式实现多线程&#xff0c;继承 Thread 类、实现 Runnable 接口、实现 Callable 接口。还有匿名内部类方式&#xff0c;Lambda 表达式方式简化开发。 1、Thread Thread 创建线程方式&#xff1a;创建线程类 start() 方法底层其实是给 CPU 注册当前线程&#xff0…

关于IDEA中maven的作用以及如何配置MAVEN

关于IDEA中maven的作用以及如何配置MAVEN 1、Maven是什么2、Idea中对于Maven的配置3、下载依赖时&#xff0c;Idea下方的显示3.1、Maven中央仓库的下载显示界面3.2、阿里云仓库的下载显示界面 4、Maven在Idea中的使用4.1、clean4.2、validate4.3、compile4.4、test&#xff08;…

智能优化算法应用:基于人工蜂群算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于人工蜂群算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于人工蜂群算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工蜂群算法4.实验参数设定5.算法结果6.…

java智能异常处理

标题&#xff1a;优雅处理异常&#xff1a;Java智能异常处理的最佳实践 摘要&#xff1a;在软件开发中&#xff0c;异常处理是一项至关重要的任务。本文将介绍Java中的智能异常处理技术&#xff0c;通过合理的异常处理规范和最佳实践&#xff0c;帮助开发者优雅地处理异常情况…

从零构建属于自己的GPT系列5:模型部署1(文本生成函数解读、模型本地化部署、文本生成文本网页展示、代码逐行解读)

&#x1f6a9;&#x1f6a9;&#x1f6a9;Hugging Face 实战系列 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在PyCharm中进行 本篇文章配套的代码资源已经上传 从零构建属于自己的GPT系列1&#xff1a;数据预处理 从零构建属于自己的GPT系列2&#xff1a;模型训…

2023年国赛高教杯数学建模A题定日镜场的优化设计解题全过程文档及程序

2023年国赛高教杯数学建模 A题 定日镜场的优化设计 原题再现 构建以新能源为主体的新型电力系统&#xff0c;是我国实现“碳达峰”“碳中和”目标的一项重要措施。塔式太阳能光热发电是一种低碳环保的新型清洁能源技术[1]。   定日镜是塔式太阳能光热发电站&#xff08;以下…

ES6-import后是否有{}的区别

在ES6中&#xff0c;import语句用于导入其他模块中的变量、函数、类等。在使用import语句时&#xff0c;可以选择是否使用花括号{}来包裹导入的内容&#xff0c;这会影响导入的内容的使用方式。 1.使用花括号{}&#xff1a; 当使用花括号{}时&#xff0c;表示只导入指定的变量…

【Fastadmin】根据Fieldlist键值组件做一个等级配置的完整示例

目录 1.效果展示&#xff1a; ​编辑 2.建表&#xff1a; 3.html页面 4.controller控制器 5.js 6.model 1.效果展示&#xff1a; 2.建表&#xff1a; 表名&#xff1a;fa_xxfb_config /*Navicat Premium Data TransferSource Server : rootSource Server Type …

深入Docker命令行:探索常用命令和实用技巧

Docker命令行界面是每个容器开发者的得力工具。在这篇文章中&#xff0c;将深入探讨一系列常用的Docker命令&#xff0c;以及一些实用技巧&#xff0c;通过更丰富的示例代码&#xff0c;帮助大家更全面地理解和运用Docker命令行工具。 1. Docker基本命令 1.1 镜像操作 深入了…

用 CSS 写一个渐变色边框的输入框

Using_CSS_gradients MDN 多渐变色输入框&#xff0c;群友问了下&#xff0c;就试着写了下&#xff0c;看了看 css 渐变色 MDN 文档&#xff0c;其实很简单&#xff0c;代码记录下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta ch…

使用FFMPEG转码,转单声道,转标准WAV,转PCM

本文为使用FFMPEG命令行的方式处理音频&#xff0c;来获取想要得到的音频文件。 零、使用命令行查看编码封装信息 格式&#xff1a;ffprobe.exe -show_format inputfile 例子&#xff1a;ffprobe.exe -show_format .\stereo_44_16bit.wav 运行结果为下图&#xff1a; 如图可…

C# Channel实现线程间通信

C# Channel实现线程间通信 同步方式实现&#xff1a; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Channels; using System.Threading.T…

【JavaFX】实现计算器小程序

下面是一个简单的JavaFX计算器示例: import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.…