当前位置: 首页 > news >正文

四、镜像构建

四、镜像构建

从镜像大小上来说,一个比较小的镜像只有十几MB,而内核文件需要一百多MB,因此镜像里面是没有内核的,镜像是在被启动为容器后直接使用宿主机的内核,而镜像本身则只提供相应的rootfs,即系统正常运行所必须的用户空间的文件系统,比如/dev,/proc,/bin,/etc等目录,所以容器中是没有/boot目录中的那些内核相关的文件和目录。
在这里插入图片描述

当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改:

(1)从已经创建的容器中更新镜像,并且提交这个镜像

(2)使用Dockerfile指令来创建一个新的镜像

4.1 基于容器制作镜像

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Options参数:-a,作者(例如,“along along@along.com”)-c,修改Dockerfile指令应用于创建的镜像-m,提交的描述信息,即记录本次修改的内容-p,在提交期间暂停容器(默认为true) 

示例1:简单的基于容器创建一个新的镜像

① 先运行一个容器

我们修改了容器的文件, 也就是改动了容器的存储层。

#查看宿主机的内核版本
[root@localhost ~]# uname -r
5.14.0-362.8.1.el9_3.x86_64
[root@localhost ~]# docker run --name b1 -it busybox:latest
#查看容器的内核版本
/ # uname -r
5.14.0-362.8.1.el9_3.x86_64
/ # ls /
bin    etc    lib    proc   sys    usr
dev    home   lib64  root   tmp    var
/ # mkdir -p /data/html
/ # echo busybox httpd server > /data/html/index.html
/ # cat /data/html/index.html
busybox httpd server

② 不用退出这个容器,另起终端在b1容器基础上,制作新镜像

定制好了变化, 现在我们希望能将其保存下来形成镜像。要知道, 当我们运行一个容器的时候( 如果不使用卷的话) , 我们做的任何文件修改都会被记录于容器存储层里。 而 Docker 提供了一个 docker commit 命令, 可以将容器的存储层保存下来成为镜像。换句话说, 就是在原有镜像的基础上, 再叠加上容器的存储层, 并构成新的镜像。 以后我们运行这个新镜像的时候, 就会拥有原有容器最后的文件变化。

[root@localhost ~]# docker commit -p b1
sha256:eac3bfb08e59c4594bc3823fd1d4da77ac24c75c6d5a5cdc5123b468e7a4feac
[root@localhost ~]# docker image ls
REPOSITORY                                           TAG               IMAGE ID       CREATED         SIZE
<none>                                               <none>            eac3bfb08e59   6 seconds ago   4.26MB

③ 给新制作的镜像打标签

[root@localhost ~]# docker tag eac3b httpd:v1.0
[root@localhost ~]# docker image ls httpd:v1.0
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
httpd        v1.0      eac3bfb08e59   2 minutes ago   4.26MB

④ 可以对同一个镜像,再打标签

[root@localhost ~]# docker tag httpd:v1.0 httpd:v2.0
[root@localhost ~]# docker image ls httpd
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
httpd        v1.0      eac3bfb08e59   3 minutes ago   4.26MB
httpd        v2.0      eac3bfb08e59   3 minutes ago   4.26MB

⑤ 删除同一镜像的标签,只是把这个镜像的标签去掉,直到删除这个镜像的最后一个标签,此镜像才会被删除。

[root@localhost ~]# docker image rm httpd:v2.0
Untagged: httpd:v2.0
[root@localhost ~]# docker image ls httpd
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
httpd        v1.0      eac3bfb08e59   3 minutes ago   4.26MB

⑥ 基于新的镜像运行一个容器,验证是否是基于b1创建成功

[root@localhost ~]# docker run --name b2 -it --rm httpd:v1.0
/ # cat /data/html/index.html
busybox httpd server

示例2:基于容器创建新的镜像,并修改执行命令CMD

① 基于容器b1创建新的镜像,并修改命令为执行httpd服务

[root@localhost ~]# docker commit  -a "jungle <jungle@jungle.com>" -c 'CMD ["/bin/httpd", "-f", "-h", "/data/html"]' -p b1 httpd:v2.0
sha256:b9919d49631bff68ac3bd735a3ae052bd41e7d7b9d8190d4fd4a5dc551d093f0# 注解:busybox中httpd命令语法-f:不运行为守护进程,在前台运行-h:指定httpd运行的主目录 

② 运行新的镜像v2.0

[root@localhost ~]# docker run --name b3 -d httpd:v2.0
67897f0039c87b521145391cd636efee60c892274a54665657f9b6763d013989
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE            COMMAND                   CREATED         STATUS         PORTS     NAMES
67897f0039c8   httpd:v2.0       "/bin/httpd -f -h /d…"   8 seconds ago   Up 8 seconds             b3

③ 访问测试

[root@localhost ~]# docker inspect  b3 | grep -i ipaddress"SecondaryIPAddresses": null,"IPAddress": "172.17.0.3","IPAddress": "172.17.0.3",[root@localhost ~]# curl 172.17.0.3
busybox httpd server

注意:使用 docker commit 命令虽然可以比较直观的帮助理解镜像分层存储的概念, 但是实际环境中并不会这样使用。

  • 使用 docker commit 意味着所有对镜像的操作都是黑箱操作, 生成的镜像也被称为黑箱镜像, 换句话说, 就是除了制作镜像的人知道执行过什么命令、 怎么生成的镜像, 别人根本无从得知。而且, 即使是这个制作镜像的人, 过一段时间后也无法记清具体的操作。
  • 镜像所使用的是分层存储,除当前层外,之前的每一层都是不会发生改变的,也就是说任何修改的结果仅仅是在当前层进行标记、添加、修改,而不会改动上一层,所以每一次修改都会让镜像更加臃肿一次。 比如, 删除前一层文件的操作, 实际不是真的删除前一层的文件, 而是仅在当前层标记为该文件已删除。 在最终容器运行的时候, 虽然不会看到这个文件, 但是实际上该文件会一直跟随镜像。 因此, 在构建镜像的时候, 需要额外小心, 每一层尽量只包含该层需要添加的东西, 任何额外的东西应该在该层构建结束前清理掉。

4.2 基于dockerfile制作镜像

DockerFile可以说是一种可以被Docker程序解释的脚本,DockerFile是由一条条的命令组成的,每条命令对应linux下面的一条命令,Docker程序将这些DockerFile指令再翻译成真正的linux命令。dockerfile有自己的书写方式和支持的命令,Docker程序读取DockerFile并根据指令生成Docker镜像,相比手动制作镜像的方式,DockerFile更能直观的展示镜像是怎么产生的,有了写好的各种各样DockerFile文件,当后期某个镜像有额外的需求时,只要在之前的DockerFile添加或者修改相应的操作即可重新生成新的Docke镜像,避免了重复手动制作镜像的麻烦,具体如下:

https://docs.docker.com/reference/dockerfile/

FROM
#FROM用来指定一个基础镜像,并且FROM 指令必须是 Dockerfile 中非注释行的第一个指令;docker build会在docker主机上查找指定的镜像文件,不写镜像标签默认为latest。在其不存在时,则会自动从 Docker 的公共库 pull 镜像下来。如果找不到指定的镜像文件,docker build 会返回一个错误信息;除了选择现有镜像为基础镜像外, Docker 还存在一个特殊的镜像, 名为 scratch 。 这个镜像是虚拟的概念并不实际存在,它表示一个空白的镜像。如果你以 scratch 为基础镜像的话, 意味着你不以任何镜像为基础, 接下来所写的指令将作为镜像第一层开始存在。 不以任何系统为基础,直接将可执行文件复制进镜像的做法并不罕见, 比如swarm 、coreos/etcd 。
LABEL
#LABEL用来描述镜像的元数据信息的键值对。label可以用来给镜像添加一些自定义的属性,比如镜像的版本、作者、描述等。
COPY
#从上下文目录中复制文件或目录到容器里指定的路径;要复制的源文件或目录可以是多个,支持使用通配符,例如COPY hom* hom?.txt /mydir/;如果源是目录,则会复制该目录下的所有文件,不会复制目录本身,想复制目录本身需要使用该方式COPY yum.repos.d /etc/yum.repos.d/(即目标需要有个文件名和目录名同名);如果目标文件不存在则会自动创建。
ADD
#ADD 指令类似于COPY指令,ADD支持使用TAR文件和URL路径;如果是一个本地系统上的压缩格式的tar文件,它将被展开为一个目录,其行为类似于"tar-x"命令;然而,通过URL获取到的tar文件将不会自动展开。
ENV
#定义所需的环境变量,并可被Dockerfile文件中位于其后的其它指令(如ENV、ADD、COPY等)所调用;语法ENV <key> <value>(一次设置一个变量) 或 ENV <key>=<value> ...
EXPOSE
#当要将容器中的端口映射至宿主机上时,使用-P选项会自动映射该端口;例如EXPOSE 80/tcp
USER
#用于指定运行image时或执行Dockerfile中任何RUN、CMD或ENTRYPOINT指令指定的程序时的用户名或UID,用户得事先存在。
VOLUME
#用于在image中创建一个挂载点目录,以挂载宿主机上的卷或其它容器上的卷。例如:VOLUME /data,这里的 /data 目录就会在运行时自动挂载为匿名卷,任何向 /data 中写入的信息都不会记录进容器存储层,从而保证了容器存储层的无状态化。可以使用docker run -v选项覆盖这个挂载设置。
WORKDIR
#用于为Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指令设定工作目录;WORKDIR后面可以是绝对路径或者相对路径;如该目录不存在, WORKDIR 会帮你建立目录;WORKDIR也可调用由ENV指令定义的变量。语法: WORKDIR /etc
RUN
#用于指定docker build过程中运行的程序,其可以是任何命令;语法:RUN <command> 或RUN ["<executable>", "<param1>", "<param2>"];第一种格式中,通常是一个shell命令,且以“/bin/sh -c”来运行它;第二种语法格式中的参数是一个JSON格式的数组,其中为要运行的命令的可执行文件,后面的为传递给命令的选项或参数;然而,此种格式指定的命令不会以“/bin/sh -c”来发起,因此常见的shell操作如变量替换以及通配符(?,*等)替换将不会进行;不过,如果要运行的命令依赖于此shell特性的话,可以将其替换为类似下面的格式:RUN ["/bin/bash", "-c", "", ""]  
CMD
#为启动的容器指定默认要运行的程序,且其运行结束后,容器也将终止,不过,CMD指定的命令可以被docker run的命令行选项所覆盖;在Dockerfile中可以存在多个CMD指令,但仅最后一个会生效。语法:CMD  <command>或者 CMD ["<executable>","<param1>","<param2>"] 或 CMD ["<param1>","<param2>"](此种写法主要是为ENTRYPOINT指令提供默认参数),此处的引号需要使用双引号,单引号会报错
ENTRYPOINT
#类似CMD指令的功能,用于为容器指定默认运行程序,与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且这些命令行参数会被当作参数传递给ENTRYPOINT指令指定的程序,不过,docker run命令的 --entrypoint选项的参数可覆盖ENTRYPOINT指令指定的程序;当指定了 ENTRYPOINT 后,CMD 的含义就发生了改变,不再是直接的运行其命令,而是将CMD 的内容作为参数传给 ENTRYPOINT 指令, 换句话说实际执行时,将变为: `<ENTRYPOINT> "<CMD>"`。语法:ENTRYPOINT <command> 或 ENTRYPOINT ["<executable>", "<param1>", "<param2>"]

说明:

(1)#号开头的行为dockerfile中的注释

(2)使用以下命令构建的镜像中会发现找不到/app/world.txt 文件,因为每一个 RUN 都是启动一个容器、 执行命令、 然后提交存储层文件变更。 第一层 RUN cd /app 的执行仅仅是当前进程的工作目录变更, 一个内存上的变化而已, 其结果不会造成任何文件变更。 而到第二层的时候, 启动的是一个全新的容器, 跟第一层的容器更完全没关系, 自然不可能继承前一层构建过程中的内存变化。 因此如果需要改变以后各层的工作目录的位置, 那么应该使用 WORKDIR 指令。

RUN cd /app
RUN echo "hello" > world.txt

基于dockerfile制作镜像命令:

docker   build   [OPTIONS]       PATH | URL | - 
选项:-t指定要创建的目标镜像名

(1)PATH:一般用.(当前工作目录)作为构建镜像的上下文路径

Docker 在运行时分为 Docker 引擎( 也就是服务端守护进程) 和客户端工具。 Docker 的引擎提供了一组REST API, 被称为 Docker Remote API, 而如 docker 命令这样的客户端工具, 则是通过这组 API与Docker 引擎交互, 从而完成各种功能。 因此, 虽然表面上我们好像是在本机执行各种 docker 功能, 但实际上, 一切都是使用的远程调用形式在服务端( Docker 引擎) 完成。 也因为这种 C/S 设计,让我们操作远程服务器的 Docker 引擎变得轻而易举。

当我们进行镜像构建的时候, 并非所有定制都会通过 RUN 指令完成, 经常会需要将一些本地文件复制进镜像, 比如通过 COPY 指令、 ADD 指令等。 而 docker build 命令构建镜像, 其实并非在本地构建, 而是在服务端, 也就是 Docker 引擎中构建的。 那么在这种客户端/服务端的架构中, 如何才能让服务端获得本地文件呢? 这就引入了上下文的概念。

当构建的时候, 用户会指定构建镜像上下文的路径, docker build 命令得知这个路径后, 会将路径下的所有内容打包, 然后上传给 Docker 引擎。 这样Docker 引擎收到这个上下文包后, 展开就会获得构建镜像所需的一切文件。

那么为什么会有人误以为 . 是指定 Dockerfile 所在目录呢? 这是因为在默认情况下, 如果不额外指定 Dockerfile 的话, 会将上下文目录下的名为 Dockerfile 的文件作为Dockerfile。这只是默认行为, 实际上 Dockerfile 的文件名并不要求必须为 Dockerfile , 而且并不要求必须位于上下文目录中, 比如可以用 -f …/Dockerfile.php 参数指定某个文件作为Dockerfile,一般大家习惯性的会使用默认的文件名 Dockerfile , 以及会将其置于镜像构建上下文目录中 。

(2)URL

docker build还支持从URL构建,docker build http://server/context.tar.gz ,如果所给出的URL是个tar压缩包,那么docker引擎会下载这个包,并自动解压,以其作为上下文,开始构建。

(3)-

docker build还支持从标准输入中读取Dockerfile进行构建

  • docker build - < Dockerfile 或者cat Dockerfile | docker build -

如果标准输入传入的是文本文件,则将其视为Dockerfile,并开始构建。这种形式由于直接从标准输入中读取Dockerfile的内容,它没有上下文,因此不可以像其他方法那样可以将本地文件COPY进镜像之类的事情。

  • docker build - < context.tar.gz

如果发现标准输入的文件格式是 gzip 、 bzip2 以及 xz 的话, 将会使其为上下文压缩包,直接将其展开, 将里面视为上下文, 并开始构建。

拉取基础镜像

[root@localhost ~]# docker pull centos:centos7.9.2009
centos7.9.2009: Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4
Status: Downloaded newer image for centos:centos7.9.2009
docker.io/library/centos:centos7.9.2009
[root@localhost yum-nginx]# docker image ls centos:centos7.9.2009
REPOSITORY   TAG              IMAGE ID       CREATED       SIZE
centos       centos7.9.2009   eeb6ee3f44bd   3 years ago   204MB#创建镜像文件目录
[root@localhost ~]# mkdir /dockerfile/web/{nginx,tomcat} -pv
mkdir: 已创建目录 '/dockerfile'
mkdir: 已创建目录 '/dockerfile/web'
mkdir: 已创建目录 '/dockerfile/web/nginx'
mkdir: 已创建目录 '/dockerfile/web/tomcat'

4.2.1 制作yum版本nginx镜像

[root@localhost ~]# mkdir  /dockerfile/web/nginx/yum-nginx
[root@localhost ~]# cd /dockerfile/web/nginx/yum-nginx
[root@localhost yum-nginx]# cat dockerfile
FROM centos:centos7.9.2009  #指定基础镜像,后续的指令运行于此基础镜像所提供的运行环境
LABEL maintainer="jungle jungle@qq.com"  #指定镜像维护者信息
WORKDIR /etc/yum.repos.d/  #指定工作目录
RUN rm -rf ./* && curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && curl -o /etc/yum.repos.d/epel-7.repo  https://mirrors.aliyun.com/repo/epel-7.repo && yum install nginx iproute -y && yum clean all && rm -rf /usr/share/nginx/html/index.html && echo "test nginx page" >  /usr/share/nginx/html/index.html  #指定要在容器中运行的命令
EXPOSE 80 443  #当要将容器中的端口映射至宿主机上时,使用-P选项会自动映射该端口
CMD ["nginx", "-g", "daemon off;"] #设定nginx在前台运行

制作镜像

[root@localhost yum-nginx]#  docker build -t  nginx:1.20.1.el7  .
[root@localhost yum-nginx]# docker image ls nginx:1.20.1.el7
REPOSITORY   TAG          IMAGE ID       CREATED             SIZE
nginx        1.20.1.el7   de5b475939fd   About an hour ago   265MB

运行容器,并访问测试

[root@localhost yum-nginx]# docker run -d -P nginx:1.20.1.el7
976212fc70a0b5f392f795bf234b796d9f537956f45818654134984a583e76eb
[root@localhost yum-nginx]# docker ps
CONTAINER ID   IMAGE                   COMMAND                   CREATED         STATUS         PORTS                                                                                    NAMES
976212fc70a0   nginx:1.20.1.el7        "nginx -g 'daemon of…"   3 seconds ago   Up 2 seconds   0.0.0.0:32768->80/tcp, [::]:32768->80/tcp, 0.0.0.0:32769->443/tcp, [::]:32769->443/tcp   condescending_pascal
[root@localhost yum-nginx]# docker inspect -f {{.NetworkSettings.IPAddress}} 97621
172.17.0.3
[root@localhost yum-nginx]# curl localhost:32768
test nginx page
[root@localhost yum-nginx]# curl  172.17.0.3
test nginx page

4.2.2 制作源码版nginx镜像

[root@localhost ~]# mkdir /dockerfile/web/nginx/source-nginx
[root@localhost ~]# cd  /dockerfile/web/nginx/source-nginx
[root@localhost source-nginx]# cat dockerfile
FROM centos:centos7.9.2009
LABEL maintainer="jungle jungle@qq.com"
ADD nginx-1.26.2.tar.gz /opt/  #复制文件到/opt并自动解压
RUN rm -rf /etc/yum.repos.d/* && curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && curl -o /etc/yum.repos.d/epel-7.repo  https://mirrors.aliyun.com/repo/epel-7.repo && yum install -y gcc pcre-devel  zlib-devel  openssl-devel shadow-utils && yum clean all && useradd nginx -s /sbin/nologin -M && cd  /opt/nginx-1.26.2 &&  ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx  --with-http_ssl_module && make && make install && ln -s /usr/local/nginx/sbin/nginx  /usr/local/sbin/ && rm -rf /opt/nginx-1.26.2
EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]
[root@localhost source-nginx]# cat build-command.sh
#!/bin/bash
docker build -t nginx:v1 .
#上传nginx源码包至dockerfile所在目录
[root@localhost source-nginx]# ll
总用量 1224
-rw-r--r-- 1 root root      39 1024 13:21 build-command.sh
-rw-r--r-- 1 root root     704 1024 13:20 dockerfile
-rw-r--r-- 1 root root 1244789 1024 13:23 nginx-1.26.2.tar.gz
#制作镜像
[root@localhost source-nginx]# bash build-command.sh
[root@localhost source-nginx]# docker image ls nginx:v1
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        v1        4cb937520fd8   8 minutes ago   324MB
#运行容器并测试
[root@localhost source-nginx]# docker run -d -P nginx:v1
e0387fefe4be9dba0c75a8ba54f9d7a4e91c94b395a26ea20bff5f3f6a5eab66
[root@localhost source-nginx]# docker ps
CONTAINER ID   IMAGE                   COMMAND                   CREATED         STATUS         PORTS                                                                                    NAMES
e0387fefe4be   nginx:v1                "nginx -g 'daemon of…"   2 seconds ago   Up 1 second    0.0.0.0:32770->80/tcp, [::]:32770->80/tcp, 0.0.0.0:32771->443/tcp, [::]:32771->443/tcp   quirky_snyder
[root@localhost source-nginx]# curl localhost:32770
[root@localhost source-nginx]# docker inspect -f {{.NetworkSettings.IPAddress}} e03
172.17.0.4
[root@localhost source-nginx]# curl -s -w "%{http_code}\n" -o /dev/null 172.17.0.4
200

4.2.3 优化nginx镜像

选择最精简的基础镜像
减少镜像的层数
清理镜像构建的中间产物

(1)使用多阶段构建减小nginx镜像体积

[root@localhost source-nginx]# cd /dockerfile/web/nginx/small-nginx
[root@localhost small-nginx]# ll
总用量 1224
-rw-r--r-- 1 root root      39 1024 15:44 build-command.sh
-rw-r--r-- 1 root root     801 1024 15:43 dockerfile
-rw-r--r-- 1 root root 1244789 1024 15:39 nginx-1.26.2.tar.gz
[root@localhost small-nginx]# cat dockerfile
FROM centos:centos7.9.2009 as build
LABEL maintainer="jungle jungle@qq.com"
ADD nginx-1.26.2.tar.gz /opt/
RUN rm -rf /etc/yum.repos.d/* && curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && curl -o /etc/yum.repos.d/epel-7.repo  https://mirrors.aliyun.com/repo/epel-7.repo && yum install -y gcc pcre-devel  zlib-devel  openssl-devel shadow-utils make && yum clean all && cd  /opt/nginx-1.26.2 &&  ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx  --with-http_ssl_module && make && make install && rm -rf /opt/nginx-1.26.2FROM centos:centos7.9.2009
COPY --from=build /usr/local/nginx/ /usr/local/nginx/
RUN useradd nginx -s /sbin/nologin -M && ln -s /usr/local/nginx/sbin/nginx  /usr/local/sbin/
EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]
[root@localhost small-nginx]# cat build-command.sh
#!/bin/bash
docker build -t nginx:v2 .#制作镜像
[root@localhost small-nginx]# docker image ls nginx:v2
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        v2        451ac692069b   2 minutes ago   210MB#运行并测试
[root@localhost small-nginx]# docker run -d -P nginx:v2
b0ca0079c137935b946f378c16b439fda665829043e6c61724f4af97ecf92eef
[root@localhost small-nginx]# docker ps
CONTAINER ID   IMAGE                   COMMAND                   CREATED          STATUS          PORTS                                                                                    NAMES
b0ca0079c137   nginx:v2                "nginx -g 'daemon of…"   1 second ago     Up 1 second     0.0.0.0:32772->80/tcp, [::]:32772->80/tcp, 0.0.0.0:32773->443/tcp, [::]:32773->443/tcp   festive_montalcini
[root@localhost small-nginx]# curl -s -w "%{http_code}\n" -o /dev/null localhost:32772
200

(2)使用精简镜像构建nginx镜像

[root@localhost small-nginx]# mkdir /dockerfile/web/nginx/min-nginx
[root@localhost small-nginx]# cd /dockerfile/web/nginx/min-nginx
[root@localhost min-nginx]# cat dockerfile
FROM alpine
LABEL maintainer="jungle jungle@qq.com"
RUN apk add --no-cache nginx
COPY index.html /usr/share/nginx/html/
COPY nginx.conf /etc/nginx/
EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]
[root@localhost min-nginx]# cat nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {worker_connections 1024;
}
http {log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile            on;tcp_nopush          on;tcp_nodelay         on;keepalive_timeout   65;types_hash_max_size 4096;include             /etc/nginx/mime.types;default_type        application/octet-stream;# Load modular configuration files from the /etc/nginx/conf.d directory.# See http://nginx.org/en/docs/ngx_core_module.html#include# for more information.include /etc/nginx/conf.d/*.conf;server {listen 81;server_name _;root  /usr/share/nginx/html/;}server {listen       80;listen       [::]:80;server_name  _;root         /usr/share/nginx/html;# Load configuration files for the default server block.include /etc/nginx/default.d/*.conf;error_page 404 /404.html;location = /404.html {}location / {}error_page 500 502 503 504 /50x.html;location = /50x.html {}}
}
[root@localhost min-nginx]# cat index.html
min nginx
[root@localhost min-nginx]# cat build-command.sh
#!/bin/bash
docker build -t nginx:v3 .#制作镜像
[root@localhost min-nginx]# bash build-command.sh
[root@localhost min-nginx]# docker image ls nginx:v3
REPOSITORY   TAG       IMAGE ID       CREATED              SIZE
nginx        v3        e9c71d65d5cf   About a minute ago   9.25MB
[root@localhost min-nginx]# docker run -d -P nginx:v3
[root@localhost min-nginx]# docker ps
CONTAINER ID   IMAGE      COMMAND                   CREATED        STATUS                  PORTS                                                                                    NAMES
0706da9a9d9b   nginx:v3   "nginx -g 'daemon of…"   1 second ago   Up Less than a second   0.0.0.0:32784->80/tcp, [::]:32784->80/tcp, 0.0.0.0:32785->443/tcp, [::]:32785->443/tcp   vigorous_keller
[root@localhost min-nginx]# curl localhost:32784
min nginx

4.2.4 自定义tomcat业务镜像

基于官方提供的centos、ubuntu、openEuler、alpine等基础镜像构建JDK(Java环境),然后再基于自定义的JDK镜像构建出业务需要的tomcat镜像。

[root@localhost tomcat]# pwd
/dockerfile/web/tomcat
[root@localhost tomcat]# wget  https://repo.huaweicloud.com/java/jdk/11.0.2+9/jdk-11.0.2_linux-x64_bin.tar.gz
[root@localhost tomcat]# wget  https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.96/bin/apache-tomcat-9.0.96.tar.gz#拉取openEuler镜像
[root@localhost tomcat]# docker pull openeuler/openeuler:24.03
[root@localhost tomcat]# cat java.sh
JAVA_HOME=/usr/local/jdk
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME PATH CLASSPATH
[root@localhost tomcat]# cat dockerfile
FROM openeuler/openeuler:24.03
LABEL maintainer="jungle jungle@qq.com"
RUN yum install -y gcc pcre-devel zlib-devel openssl-devel shadow-utils
ADD jdk-11.0.2_linux-x64_bin.tar.gz /usr/local/src
RUN ln -s /usr/local/src/jdk-11.0.2/ /usr/local/jdk
ADD java.sh /etc/profile.d/
ENV JAVA_HOME=/usr/local/jdk
ENV PATH=$JAVA_HOME/bin:$PATH
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ADD apache-tomcat-9.0.96.tar.gz  /usr/local/src
RUN ln -s /usr/local/src/apache-tomcat-9.0.96 /usr/local/tomcat
EXPOSE 8080
CMD ["/usr/local/tomcat/bin/catalina.sh","run"]
[root@localhost tomcat]# cat build-command.sh
#!/bin/bash
docker build -t tomcat:base .
[root@localhost tomcat]# docker run -d -P tomcat:base
[root@localhost tomcat]# docker ps
CONTAINER ID   IMAGE         COMMAND                   CREATED         STATUS         PORTS                                           NAMES
1117266c49e8   tomcat:base   "/usr/local/tomcat/b…"   3 minutes ago   Up 3 minutes   0.0.0.0:32768->8080/tcp, [::]:32768->8080/tcp   mystifying_goldberg

定义tomcat业务镜像

[root@localhost tomcat-appv1]# cat index.jsp
<html>
<head><title>Hello World</title><meta charset="UTF-8"></head>
<body>
<p style="font-size:40px;font-weight:bold;">Hello World!&#128151</p>
<%
out.println("Your IP address is " + request.getRemoteAddr());
%>
</body>
</html>
[root@localhost tomcat-appv1]# cat dockerfile
FROM tomcat:base
LABEL maintainer="jungle jungle@qq.com"
ADD index.jsp /usr/local/tomcat/webapps/ROOT/index.jsp
EXPOSE 8080
CMD ["/usr/local/tomcat/bin/catalina.sh","run"]
[root@localhost tomcat-appv1]# cat build-command.sh
#!/bin/bash
docker build -t tomcat:appv1 .
[root@localhost tomcat-appv1]# bash build-command.sh
[root@localhost tomcat-appv1]# docker run -d -P tomcat:appv1
ba625d1d591f703b84e95e8efb78bc522cafd0039a6ec3d476ae71e48e7ad940
[root@localhost tomcat-appv1]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED        STATUS        PORTS                                           NAMES
ba625d1d591f   tomcat:appv1   "/usr/local/tomcat/b…"   1 second ago   Up 1 second   0.0.0.0:32769->8080/tcp, [::]:32769->8080/tcp   keen_lichterman

相关文章:

四、镜像构建

四、镜像构建 从镜像大小上来说&#xff0c;一个比较小的镜像只有十几MB&#xff0c;而内核文件需要一百多MB&#xff0c;因此镜像里面是没有内核的&#xff0c;镜像是在被启动为容器后直接使用宿主机的内核&#xff0c;而镜像本身则只提供相应的rootfs&#xff0c;即系统正常…...

FastAPI 响应状态码:管理和自定义 HTTP Status Code

FastAPI 响应状态码&#xff1a;管理和自定义 HTTP Status Code 本文介绍了如何在 FastAPI 中声明、使用和修改 HTTP 状态码&#xff0c;涵盖了常见的 HTTP 状态码分类&#xff0c;如信息响应&#xff08;1xx&#xff09;、成功状态&#xff08;2xx&#xff09;、客户端错误&a…...

C#设计模式--原型模式(Prototype Pattern)

原型模式是一种创建型设计模式&#xff0c;它允许通过复制现有对象来创建新对象&#xff0c;而无需通过构造函数。这种方式可以提高性能&#xff0c;特别是在创建复杂对象时。C# 中可以通过实现 ICloneable 接口或自定义克隆方法来实现原型模式。 案例 1&#xff1a;文档编辑器…...

使用Goland对6.5840项目进行go build出现异常

使用Goland对6.5840项目进行go build出现异常 Lab地址: https://pdos.csail.mit.edu/6.824/labs/lab-mr.html项目地址: git://g.csail.mit.edu/6.5840-golabs-2024 6.5840运行环境: mac系统 goland git clone git://g.csail.mit.edu/6.5840-golabs-2024 6.5840 cd 6.5840/src…...

使用kibana实现es索引的数据映射和索引模版/组件模版

1 数据映射 数据映射官方链接 1.1 日期映射案例 1.创建一条索引。把索引中的字段生日映射为日期&#xff0c;并制定映射后的格式为年月日 PUT http://10.0.0.91:9200/zhiyong18-luckyboy-date {"mappings": {"properties": {"birthday": {&q…...

基于elementui的远程搜索下拉选择分页组件

在开发一个练手项目的时候&#xff0c;需要一个远程搜索的下拉选择组件&#xff1b; elementui自带的el-select支持远程搜索&#xff1b;但如果一次性查询的数据过多&#xff1b;会导致卡顿。故自己实现一个可分页的远程下拉选择组件 效果&#xff1a; 代码&#xff1a; <…...

每日一题 LCR 074. 合并区间

LCR 074. 合并区间 对遍历顺序注意一下就可以 class Solution { public:vector<vector<int>> merge(vector<vector<int>>& intervals) {int n intervals.size();sort(intervals.begin(),intervals.end());int idx 0;vector<vector<int&g…...

Flink SQL

Overview | Apache Flink FlinkSQL开发步骤 Concepts & Common API | Apache Flink 添加依赖&#xff1a; <dependency><groupId>org.apache.flink</groupId><artifactId>flink-table-api-java-bridge_2.11</artifactId><version>…...

[免费]SpringBoot+Vue企业OA自动化办公管理系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue企业OA自动化办公管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue企业OA自动化办公管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着信息技术在管理上越来越深入…...

Linux下编译安装METIS

本文记录Linux下编译安装METIS的流程。 零、环境 操作系统Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1 一、安装依赖 1.1 下载GKlib sudo apt-get install build-essential sudo apt-get install cmake 2.2 编译安装GKlib 下载GKlib代码&#xff0c; …...

LLM学习路径 - 渐进式构建知识体系

LLM学习路径 - 渐进式构建知识体系 文章目录 LLM学习路径 - 渐进式构建知识体系一、模型算法基础二、机器学习三、深度学习四、自然语言处理 (NLP)五、大规模语言模型 (LLM) References 一、模型算法基础 编程基础 Web 框架 深入学习 Gradio 与 Streamlit&#xff0c;理解其构…...

使用Unity脚本模拟绳索、布料(碰撞)

效果演示&#xff1a; 脚本如下&#xff1a; using System.Collections; using System.Collections.Generic; using UnityEngine;namespace PhysicsLab {public class RopeSolver : MonoBehaviour {public Transform ParticlePrefab;public int Count 3;public int Space 1;…...

Qt Chart 模块化封装曲线图

一 版本说明 二 完成示例 此文章包含&#xff1a;曲线轴设置&#xff0c;曲线切换&#xff0c;单条曲线显示&#xff0c;坐标轴。。。 三 曲线图UI创建 在UI界面拖放一个QWidget,然后在 Widget里面放一个 graphicsView 四 代码介绍 1 头文件 #include <QString> #in…...

【Linux】深入理解进程管理与fork系统调用的实现原理

【Linux】深入理解进程管理与fork系统调用的实现原理 进程基本概念描述进程-PCBtask_struct-PCB的一种task_ struct内容分类组织进程 查看进程通过系统调用获取进程标示符Fork 之后的代码共享1. **代码共享**2. **数据段不共享**总结 &#x1f30f;个人博客主页&#xff1a;个人…...

C语言程序设计P5-2【应用函数进行程序设计 | 第二节】——知识要点:函数的参数及返回值和函数的调用及声明

知识要点&#xff1a;函数的参数及返回值和函数的调用及声明 视频&#xff1a; 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 1.求x的n次方的值也就是求n个x的乘积&#xff0c;可把x和n作为函数的形参&#xff0c;定义一个函数power来完成这个功能&am…...

【LeetCode】169.多数元素

题目连接&#xff1a; https://leetcode.cn/problems/majority-element/solutions/2362000/169-duo-shu-yuan-su-mo-er-tou-piao-qing-ledrh/?envTypestudy-plan-v2&envIdtop-interview-150 题目描述&#xff1a; 思路一&#xff1a; 使用哈希表unordered_map记录每个元…...

0x0118消息 WM_SYSTIMER

0x0118消息就是WM_SYSTIMER 编辑框出现输入光标时,产生的消息. 0x0118 would be the undocumented WM_SYSTIMER, which appears to be used for caret blinks. 0x0118是一个undocument 消息&#xff0c; 微软没有记录。 但在一些库的源码中可以看到&#xff0c;比如ATL的库文…...

【Linux内核】Hello word程序

创建测试目录 mkdir -p ~/develop/kernel/hello-1 cd ~/develop/kernel/hello-1 创建MakeFile文件和内核.c文件 nano Makefile nano hello-1.c 编写内容 /* * hello-1.c - The simplest kernel module. */ #include <linux/module.h> /* Needed by all modules */…...

黑马redis

Redis的多IO线程只是用来处理网络请求的,对于读写操作命令Redis仍然使用单线程来处理 Redisson分布式锁实现15问 文章目录 主线程和IO线程是如何协作的Unix网络编程中的五种IO模型Linux世界一切皆文件生产上限制keys *、flushdb、flushall等危险命令keys * 遍历查询100W数据花…...

Robust Depth Enhancement via Polarization Prompt Fusion Tuning

paper&#xff1a;论文地址 code&#xff1a;github项目地址 今天给大家分享一篇2024CVPR上的文章&#xff0c;文章是用偏振做提示学习&#xff0c;做深度估计的。模型架构图如下 这篇博客不是讲这篇论文的内容&#xff0c;感兴趣的自己去看paper&#xff0c;主要是分享环境&…...

集合框架(3)Map

Map接口 现实生活与开发中&#xff0c;我们常会看到这样的一类集合&#xff1a;用户ID与账户信息、学生姓名与考试成绩、IP地址与主机名等&#xff0c;这种一一对应的关系&#xff0c;就称作映射。Java提供了专门的集合框架用来存储这种映射关系的对象&#xff0c;即java.util…...

Java反射机制—Class

Java反射机制是指在运行时动态地获取类的信息以及操作类的成员变量、方法和构造方法的能力。反射机制通过使用Class类来实现&#xff0c;Class类是Java中表示类的类。 通过反射机制&#xff0c;我们可以在运行时动态地创建对象、调用方法、访问属性等。反射机制提供了一种强大…...

C# 新语法中的字符串内插$和{}符号用法详解

自C#6.0开始提供一个新的语法糖&#xff0c;即"$" 符号&#xff0c;配合“{}”使用&#xff0c;它的作用除了是对String.format的简化&#xff0c;还可设置其格式模板&#xff0c;实现了对字符串的拼接优化。 语法格式&#xff1a; $"string {变量表达式}” 语…...

WordPress 独立站是否需要 CDN:深度解析及必要性分析

WordPress 是目前全球最流行的开源内容管理系统&#xff08;CMS&#xff09;&#xff0c;其易用性和丰富的插件生态使得它成为搭建独立站的首选。然而&#xff0c;随着流量的增加以及用户体验的需求&#xff0c;网站的速度和可靠性变得至关重要。在这种情况下&#xff0c;CDN&a…...

dell电脑开不了机怎么回事?戴尔电脑无法开机解决方法

dell戴尔电脑开不了机&#xff0c;这是很多使用dell电脑用户常遇到的问题。这种故障情况是由多种原因引起&#xff0c;包括硬件故障、软件问题或电源问题等等。dell电脑开不了机怎么办呢&#xff1f;下面便为大家介绍一下相关解决修复方法&#xff0c;帮助用户解决戴尔电脑无法…...

如何解决 JavaScript 中的数组方法不生效?

在 JavaScript 中&#xff0c;数组方法是常用的工具&#xff0c;可以用来对数组进行操作。常见的数组方法包括 push(), pop(), shift(), unshift(), map(), filter(), reduce() 等。 然而&#xff0c;有时候我们会遇到数组方法“失效”或者不按预期工作的情况。这个问题的原因…...

道可云人工智能元宇宙每日资讯|全国工商联人工智能委员会成立会议在南京举办

道可云元宇宙每日简报&#xff08;2024年12月5日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 全国工商联人工智能委员会成立会议在南京举办 全国工商联人工智能委员会成立会议日前在江苏省南京市举办。中央统战部副部长、全国工商联党组书记沈莹出席会议并讲话…...

华为HCIP-Datacom H12-821H12-831 (12月最新题库)

备考HCIP-datacom的小伙伴注意啦 !!! 2024年下半年12月份最新(H12-821和H12-831)题库带解析,有需要的小伙伴移动至文章末 H12-821: H12-831: 1.BGP 邻居建立过程的状态存在以下几种&#xff1a;那么建立一个成功的连接所经历的状态机顺序是 A、3-1-2-5-4 B、1-3-5-2-4 C、…...

模型案例:| 手机识别模型!

导读 2023年以ChatGPT为代表的大语言模型横空出世&#xff0c;它的出现标志着自然语言处理领域取得了重大突破。它在文本生成、对话系统和语言理解等方面展现出了强大的能力&#xff0c;为人工智能技术的发展开辟了新的可能性。同时&#xff0c;人工智能技术正在进入各种应用领…...

AWS创建ec2实例并连接成功

aws创建ec2实例并连接 aws创建ec2并连接 1.ec2创建前准备 首先创建一个VPC隔离云资源并且有公有子网 2.创建EC2实例 1.启动新实例或者创建实例 2.创建实例名 3.选择AMI使用linux(HVM) 4.选择实例类型 5.创建密钥对下载到本地并填入密钥对名称 6.选择自己创建的VPC和公有子网…...

短视频矩阵系统开发|技术源代码部署

短视频矩阵系统通过多账号运营管理、多平台视频智能分发等功能&#xff0c;助力企业实现视频引流、粉丝沉淀和转化。 短视频矩阵系统是一种创新的营销工具&#xff0c;它整合了多账号管理、视频智能分发、数据可视化等多种功能&#xff0c;为企业在短视频领域的发展提供了强大…...

C# GDI绘制的小熊进度条

C# GDI小熊进度条 1、添加自定义控件winform using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;…...

java书 核心技术+卷一+4

5.4 对象包装器与自动装箱 package 反射; import java.util.AbstractList; import java.util.ArrayList; public class test {public static void main(String[] args) {int a10;ArrayList<Integer> xxnew ArrayList<>();xx.add(a); //自动装箱int bxx.get(0);//…...

用Python开发一个经典打砖块小游戏

Python 的 pygame 库让我们可以轻松开发经典的小游戏。今天,我们将实现一个“打砖块”小游戏,带你体验游戏开发的乐趣。 一、游戏设计 1.1 游戏规则 玩家通过移动滑板接住弹起的球。球撞击砖块会让砖块消失,玩家得分。如果球落地,游戏失败。1.2 技术点 碰撞检测:检测球与…...

RTCMultiConnection 跨域问题解决

js套件地址 https://github.com/muaz-khan/RTCMultiConnection server套件地址 https://github.com/muaz-khan/RTCMultiConnection-Server 要解决的就是server代码的跨域问题 原装写法&#xff1a; 解决写法&#xff1a; // 喜欢组合语法的自己组 const io new ioServer.S…...

使用GO--Swagger生成文档

概述 在前后端分离的项目中&#xff0c;后端配置swagger可以很好的帮助前端人员了解后端接口参数和数据传输。go-swagger 是一个功能全面且高性能的Go语言实现工具包&#xff0c;用于处理Swagger 2.0&#xff08;即OpenAPI 2.0&#xff09;规范。它提供了丰富的工具集&#x…...

简易图书管理系统

javawebjspservlet 实体类 package com.ghx.entity;/*** author &#xff1a;guo* date &#xff1a;Created in 2024/12/6 10:13* description&#xff1a;* modified By&#xff1a;* version:*/ public class Book {private int id;private String name;private double pri…...

探索自然语言处理奥秘(NLP)

摘要 自然语言处理&#xff08;NLP&#xff09;是人工智能领域的一个重要分支&#xff0c;它致力于使计算机能够理解、解释和生成人类语言。这项技术让机器能够阅读文本、听懂语音&#xff0c;并与人类进行基本的对话交流。 通俗理解 自然语言处理&#xff08;NLP&#xff09…...

刘铁猛C#入门 030 泛型,partial类,枚举,结构

泛型(generic)无处不在 为什么需要泛型&#xff1a;避免成员膨胀或者类型膨胀 正交性&#xff1a;泛型类型(类/接口/委托/......)泛型成员(属性/方法/字段/....类型方法的参数推断 泛型接口/类的 类型参数不只有一个泛型与委托、lambda表达式实现泛型接口类时 &#xff0c;实现…...

迅雷 11.2.2 | 本地会员版,不限速下载,支持云盘

迅雷 v11.2.2 是一款带网盘功能的绿色版下载工具。双击“!)绿化”文件即可在桌面生成快捷图标。该版本干净简洁&#xff0c;仅保留下载和云盘两项核心功能。点击左上角的【新建】按钮&#xff0c;可新建链接下载任务。即使在网络条件一般的情况下&#xff08;如50M宽带&#xf…...

P3131 [USACO16JAN] Subsequences Summing to Sevens S

题目描述 Farmer Johns NN cows are standing in a row, as they have a tendency to do from time to time. Each cow is labeled with a distinct integer ID number so FJ can tell them apart. FJ would like to take a photo of a contiguous group of cows but, due to a…...

股指期货基差为正数,这是啥意思?

在股指期货的世界里&#xff0c;有个挺重要的概念叫“基差”。说白了&#xff0c;基差就是股指期货的价格和它对应的现货价格之间的差价。今天&#xff0c;咱们就来聊聊当这个基差为正数时&#xff0c;到底意味着啥。 基差是啥&#xff1f; 先复习一下&#xff0c;基差 股指…...

docker自动拉取最新镜像并更新

目录 一、自动检查和更新所有正在运行的容器&#xff08;每24h一次&#xff09; 二、仅仅更新特定的容器&#xff08;每24h一次&#xff09; 三、指定更新间隔&#xff08;300秒&#xff09; 四、Watchtower 不会主动删除旧镜像&#xff0c;使用 --cleanup 参数在更新容器后…...

unicloud微信小程序云端一体项目DEMO

最近应客户需求&#xff0c;做了一个产品展示的云开发小程序&#xff0c;从了解云开发到应用到实际项目的产品demo&#xff0c;希望大家能从中获取到对自己有用的东西。 说下心得体会吧&#xff0c;一般小项目用这种云开发确实会减少很多开发成本&#xff0c;人力成本&#xf…...

Spring+Mybatis 整合所需准备

文章目录 SpringMybatis SpringMybatis 准备pom.xml 项目所需jar文件 <spring.version>4.0.2.RELEASE</spring.version> <!-- spring框架包 --><dependency><groupId>org.springframework</groupId><artifactId>spring-test</a…...

后端工程师成长路线图

‌后端开发工程师是软件开发领域中的一个重要角色&#xff0c;主要负责平台设计、接口设计和功能实现。他们的主要职责包括服务器端业务开发、架构设计、系统性能调优等。‌ 后端开发工程师的工作内容通常涉及服务器开发、数据库管理、业务逻辑实现等方面。他们需要与前端工程…...

java -jar ./target/pay.war ./target/pay.war 中没有主清单属 为什么?

当你尝试使用 java -jar ./target/pay.war 来启动你的 WAR 包时&#xff0c;遇到的错误是因为该 WAR 包没有包含主清单属性&#xff08;Main-Class&#xff09;。这是因为你的项目是一个 Spring Boot 项目&#xff0c;并且默认是作为 WAR 文件部署到外部容器&#xff08;如 Tom…...

封闭式论文写作--全面掌握ChatGPT-4o的写作技能,掌握提示词使用技巧、文献检索与分析方法,帮助您选定研究方向,提炼学术论文题目

在当今学术研究中&#xff0c;科研人员在撰写论文时面临诸多挑战。首先是信息量的剧增&#xff0c;科研人员需要快速消化新知识&#xff0c;筛选相关信息并清晰表达。但论文写作不仅是信息的罗列&#xff0c;还需要条理清晰、逻辑严密、语言精准&#xff0c;特别是在竞争激烈的…...

解决Centos6.9的yum的失效问题

相信大家&#xff0c;如果遇到了yum问题的话&#xff0c;经常会很头疼&#xff0c;因此&#xff0c;这里给出了两条命令&#xff0c;这里的前提是你的wget是能用的 1、mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 2、wget -O /etc/yum.re…...

【日常记录-Java】查看Maven本地仓库的位置

1. 简介 Maven本地仓库主要用于存储和管理项目所需的依赖项&#xff0c;如jar包、pom文件等。默认情况下&#xff0c;其位于用户家目录下的.m2/repository文件夹内。开发者也可以在Maven的配置文件settings.xml中修改本地仓库路径。 2. 方法 2.1 查看settings.xml文件 Maven本…...