Docker基础入门:Docker基础总结篇--超详细

news2024/9/27 23:28:33

Docker基础入门:Docker基础总结篇[docker3要素、docker安装配置、容器使用、镜像管理发布]

  • 一、Docker 3要素
    • 1.1、镜像(Image)
    • 1.2、容器(Container)
    • 1.3、仓库(Registry)
    • 1.4 、总结
  • 二、Docker安装配置
    • 2.1、卸载旧版Docker
    • 2.2、需要的安装包依赖
    • 2.3、设置镜像仓库
    • 2.4、更新yum软件包索引
    • 2.5、安装Docker--社区版
    • 2.6、配置镜像加速(阿里云加速器地址--每个人地址不一致):
    • 2.7、启动 | 停止Docker
    • 2.8、测试--hello-world
    • 2.9、查看Docker镜像
    • 2.10、Docker进程查看
  • 三、Docker容器使用
    • 3.1、获取Dokcer相关信息命令
    • 3.2、常用的Docker CLI 命令
    • 3.3、给镜像重新命名和换标签
    • 3.4、Docker容器的启停和删除
    • 3.5、Docker 容器批量处理
    • 3.6、Docker容器的几种运行方式
  • 四、Docker镜像管理
    • 4.1、Docker镜像的几种获取方式
    • 4.2、查看镜像具体信息
    • 4.3、构建镜像的有关指令
    • 4.4、构建镜像步骤
    • 4.5、实战---构建自己的一个centos
    • 4.6、实战---构建自己的一个tomcat
  • 五、发布镜像至阿里云
    • 5.1、登录阿里云Docker Registry
    • 5.2、使用" docker push" 命令将centos镜像提交至阿里云
    • 5.3、阿里云镜像仓库查看
  • 六、发布镜像至私有仓库
    • 6.1、下载Registry镜像
    • 6.2、查看Docker 镜像列表
    • 6.3、运行 Docker Registry 容器
    • 6.4、测试上传镜像到Registry


💖The Begin💖点点关注,收藏不迷路💖

在这里插入图片描述

在前面对Docker基础概念、基本使用的了解后,本章将更加详细地介绍容器的使用。

一、Docker 3要素

Docker 三个核心要素——镜像(Image)、容器(Container)和仓库(Registry)是理解和使用Docker的关键。

1.1、镜像(Image)

镜像是Docker的基本构建单元,它包含了运行容器所需的文件系统和软件环境。可以将镜像视为一个只读模板,其中定义了应用程序及其依赖的安装、配置和启动信息。镜像可以通过Dockerfile进行定义,其中记录了构建镜像的步骤和配置指令。通过构建镜像,我们可以实现应用程序的可移植性和可重复性。

1.2、容器(Container)

容器是从镜像创建的运行实例,它提供了一个隔离的运行环境,使得应用程序及其依赖可以在不同的系统中以一致的方式运行。每个容器都是相互独立的,具有自己的文件系统、进程空间和网络资源。通过容器,我们可以实现应用程序的部署、管理和扩展。容器可以被启动、停止、删除等操作,并且可以通过网络互相通信。

1.3、仓库(Registry)

仓库是用于存储和分享镜像的地方。Docker Hub是一个公共的Docker仓库,提供了大量的官方和社区创建的镜像供用户使用。用户可以通过搜索或推送镜像到Docker Hub来获取和分享镜像。此外,还可以搭建私有的仓库,用于存储和管理自己的镜像,或者在内部网络环境中共享镜像。仓库为镜像的存储、获取和分享提供了便利。

Docker官方:

Docker官方文档:https://docs.docker.com/
Docker Hub官网:https://hub.docker.com/

1.4 、总结

镜像、容器和仓库是Docker的三要素,共同构成了Docker的核心功能和特性。

通过镜像,我们可以快速创建容器,实现应用程序的移植性和可重复性;

通过容器,我们可以实现应用程序的隔离、部署和管理;

通过仓库,我们可以方便地存储、获取和分享镜像,加快应用程序的开发和交付过程。

深入理解和灵活运用这三个要素,能够帮助我们更好地使用Docker技术,提高应用程序的可靠性和效率。

二、Docker安装配置

Docker是基于Go语言开发的!开源项目!
官网:https://www.docker.com/
文档地址:https://docs.docker.com/
Doker镜像仓库地址:https://hub.docker.com/

前提:

#1、系统内核为3.10以上、要求系统为64位(x86_64)
[root@zyl-server ~]# uname -r
3.10.0-1160.el7.x86_64
[root@zyl-server ~]# 

#2、查看系统版本
[root@zyl-server ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

[root@zyl-server ~]# 

2.1、卸载旧版Docker

sudo yum remove docker*
###或者使用
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

2.2、需要的安装包依赖

yum install -y yum-utils

在这里插入图片描述

2.3、设置镜像仓库

###使用国内镜像仓库地址
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo   #国外

yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  #国内

在这里插入图片描述

2.4、更新yum软件包索引

yum makecache fast

在这里插入图片描述

2.5、安装Docker–社区版

相关版本:docker-ce(社区版)、 docker-ee(企业版)。

docker-ce ----->社区版
docker-ce-cli ----->命令行
containerd.io ----->docker容器化运行环境

##默认不指定版本则安装最新版。
yum install docker-ce docker-ce-cli containerd.io

##指定版本安装
yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7  containerd.io-1.4.6

在这里插入图片描述

2.6、配置镜像加速(阿里云加速器地址–每个人地址不一致):

如何获取自己阿里云的镜像加速地址:
1、登录后打开阿里云的控制台
2、在控制台中找到“容器镜像服务”
在这里插入图片描述

###1、通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://lqwtpdhx.mirror.aliyuncs.com"]
}
EOF

###2、修改保存后,重启Docker以使配置生效。
sudo systemctl daemon-reload 
sudo systemctl restart docker

##3、查看配置是否生效。
##执行 docker info,查看是否含有如下信息(最后):

Registry Mirrors:
  https://lqwtpdhx.mirror.aliyuncs.com/

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

2.7、启动 | 停止Docker

systemctl start docker      #启动
systemctl stop docker       #停止
systemctl restart docker    #重启
systemctl status docker     #查看状态
systemctl enable docker     #开机自启

[root@zyl-server ~]# systemctl start docker
[root@zyl-server ~]# docker version  #查看是否安装成功

在这里插入图片描述

2.8、测试–hello-world

docker run hello-world

在这里插入图片描述

2.9、查看Docker镜像

[root@zyl-server ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    feb5d9fea6a5   23 months ago   13.3kB
[root@zyl-server ~]# 

2.10、Docker进程查看

[root@zyl-server ~]# ps -ef |grep docker
root       1502      1  0 22:07 ?        00:00:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root       1794   1266  0 22:16 pts/0    00:00:00 grep --color=auto docker
[root@zyl-server ~]# 
# 三、Docker容器使用
# 四、Docker镜像管理与发布

## 4.1 获取镜像的多种途径

```python
1、Docker Hub(Docker仓库):Docker Hub 是官方的镜像注册中心,提供了大量的官方和社区维护的镜像供用户使用。可以通过命令docker pull从 Docker Hub 中获取镜像。

例如,要获取名为 nginx 的镜像,可以执行命令:docker pull nginx

2、私有仓库(Private Registry):除了 Docker Hub,还可以搭建自己的私有仓库来存储镜像。私有仓库可以在内网环境中使用,并允许你上传、下载和管理自己的镜像。一个受欢迎的私有仓库是 Docker Registry,可以使用 docker pull 命令从私有仓库中获取镜像。

docker push 私有仓库地址ip:端口/myimage:tag 
docker pull 私有仓库地址ip:端口/myimage:tag 

3、从镜像导出文件:如果你已经有一个正在运行的 Docker 容器,并且希望将其转换为一个可重用的镜像,可以使用 docker export 命令将容器导出为一个 tar 文件。然后,你可以使用 docker import 命令将该 tar 文件导入为镜像。例如:

docker export [CONTAINER_ID] > image.tar
docker import image.tar myimage:tag

4、Dockerfile 构建镜像:Dockerfile 是一种文本格式的文件,它包含了一条条的指令和参数,用于自动构建 Docker 镜像。通过使用 Dockerfile,你可以定义并定制自己的镜像。可以使用 docker build 命令根据 Dockerfile 构建自定义镜像。例如:

docker build -t myimage:tag .

5、从其他镜像导出:如果你已经有一个现成的镜像并且想要基于它做修改,你可以创建一个新的容器,并在容器内部更改配置、安装软件等操作。然后,你可以使用 docker commit 命令将更改后的容器保存为新的镜像。例如:

docker run -it [EXISTING_IMAGE] /bin/bash
# 在容器内部进行配置和更改
docker commit [CONTAINER_ID] myimage:tag

三、Docker容器使用

3.1、获取Dokcer相关信息命令

1、docker version:显示Docker客户端和服务器的版本信息。

示例:
docker version

2、下载(或更新)一个指定的镜像

docker pull <image_name>:使用指定的镜像名称从 Docker 镜像仓库中下载镜像。
通过执行这个命令,Docker 将会:

检查本地是否已经存在指定名称的镜像。如果本地已经存在,将会检查镜像是否已经是最新版本。
如果本地不存在或镜像不是最新版本,则会从 Docker 镜像仓库下载最新的镜像。
使用 docker pull 命令时,可以提供完整的镜像名称,包括仓库名称、标签和版本号。例如,可以使用以下格式之一的镜像名称:

<repository>/<image_name>:<tag>:指定仓库名称、镜像名称和标签。
<repository>:可选,指定镜像所在的仓库名称。
<image_name>:必需,指定要下载的镜像的名称。
<tag>:可选,指定镜像的标签,用于区分不同版本的镜像。

示例:

下载最新版本的 nginx 镜像:

docker pull nginx
下载特定标签的 ubuntu 镜像(标签为 18.04):

docker pull ubuntu:18.04

下载带有仓库和标签的镜像(仓库名称为 registry.example.com,镜像名称为 myimage,标签为 latest):

docker pull registry.example.com/myimage:latest

docker pull 命令将从默认的 Docker 镜像仓库下载镜像。您也可以使用 -a 选项指定要拉取的全部标签的镜像,或使用其他镜像仓库的 URL 来下载镜像。

3、docker info:显示Docker系统的详细信息,包括服务器配置、镜像和容器数量等。

示例:
docker info

4、docker images:列出本地已下载的镜像列表。

示例:
docker images

可结合grep 进行过滤。

docker images | grep nginx

5、docker ps:显示正在运行的容器列表。使用-a选项可以显示所有容器,包括已停止的容器。

示例:
docker ps

或者显示所有容器:
docker ps -a

或者检查容器是否运行:
docker inspect --format{{.State.Running}}<容器ID或名称>

[root@zyl-server ~]#  docker inspect --format "{{.State.Running}}" 4b41981f69bc
"true"


6、docker inspect <容器ID或名称>:显示指定容器的详细信息,包括网络配置、挂载点等。

示例:
docker inspect mycontainer

7、docker logs <容器ID或名称>:查看容器的日志输出。

示例:
docker logs mycontainer


8、docker port <容器ID或名称>:显示容器的端口映射情况。

示例:
docker port mycontainer

9、docker stats <容器ID或名称>:实时显示指定容器的资源使用情况,例如CPU、内存、网络等。

示例:
docker stats mycontainer


10、docker top <容器ID或名称>:显示容器内运行的进程列表。

示例:
docker top mycontainer

11、docker network ls:列出当前存在的网络列表。

示例:
docker network ls

12、docker volume ls:列出当前存在的数据卷(volume)列表。

示例:
docker volume ls

13、docker inspect <网络ID或名称>:显示指定网络的详细信息。

示例:
docker inspect mynetwork

14、docker inspect <数据卷ID或名称>:显示指定数据卷的详细信息。

示例:
docker inspect myvolume

15、docker ps | grep <容器ID或名称> :查看已运行容器,可结合grep 进行过滤。
示例:
docker ps | grep nginx

3.2、常用的Docker CLI 命令

Docker CLI(命令行界面)是与Docker引擎进行交互的主要方式。下面是几个常用的Docker CLI命令。

1、docker pull <镜像名>:从Docker镜像仓库拉取指定名称的镜像。

示例:docker pull nginx

2、docker run <选项> <镜像名>:创建并运行一个新的容器实例。

示例:docker run -d -p 80:80 nginx
-d:以后台模式(detached mode)运行容器。
-p 80:80:将主机的80端口映射到容器的80端口。

3、docker ps:查看正在运行的容器列表。

示例:docker ps

4、docker stop <容器ID或名称>:停止一个正在运行的容器。

示例:docker stop mynginx

5、docker rm <容器ID或名称>:删除一个已经停止的容器。

示例:docker rm mynginx

6、docker images:列出本地已经下载的镜像列表。

示例:docker images

7、docker rmi <镜像ID或名称>:删除一个本地的镜像。

示例:docker rmi nginx

8、docker exec -it <容器ID或名称> <命令>:在正在运行的容器中执行命令。

示例:docker exec -it mynginx /bin/bash
-it:以交互模式进入容器。
/bin/bash:在容器中执行的命令。

3.3、给镜像重新命名和换标签

1、查看已有的镜像列表:

docker images

2、选择要重新命名和换标签的镜像,复制其镜像ID或名称。

3、重新命名镜像:

docker tag <旧镜像ID或名称> <新镜像名称>
示例:

docker tag nginx:latest mynginx:1.0
这将创建一个新的镜像标签,将旧镜像的名称 "nginx" 改为 "mynginx",并设置标签为 "1.0"4、验证新的镜像标签是否已创建:

docker images
确保在输出的镜像列表中能够看到修改后的镜像名称和标签。

5、(可选)删除旧的镜像标签(如果不再需要):

docker rmi <旧镜像ID或名称>
示例:

docker rmi nginx:latest

请注意,在删除镜像时务必小心,确保不会意外删除其他正在使用的镜像。

3.4、Docker容器的启停和删除

1、查看正在运行的容器:

docker ps
这将列出当前正在运行的所有容器,其中包括它们的 ID、名称、镜像、状态等信息。

2、启动容器:

docker start <容器ID或名称>
示例:

docker start mynginx
这会启动名为 "mynginx" 的容器。

3、停止容器:

docker stop <容器ID或名称>
示例:

docker stop mynginx
这会停止名为 "mynginx" 的容器。

4、重启容器:

docker restart <容器ID或名称>
示例:

docker restart mynginx
这将重启名为 "mynginx" 的容器。

5、删除容器:

docker rm <容器ID或名称>
示例:

docker rm mynginx
这会删除名为 "mynginx" 的容器。如果要删除多个容器,可以在命令中使用空格分隔它们的ID或名称。

请注意,在删除容器时务必小心,确保不会意外删除其他正在使用的容器。此外,如果容器正在运行,则应首先使用 docker stop 命令停止它,然后再使用 docker rm 命令删除它。

3.5、Docker 容器批量处理

1、批量启动容器:

docker start $(docker ps -qa) # 开启所有容器

或者:

docker start <容器ID或名称> [<容器ID或名称> ...]
示例:

docker start container1 container2 container3
这将同时启动名为 container1、container2 和 container3 的多个容器。

2、批量停止容器:

docker stop $(docker ps -qa) # 停止所有容器

或者:

docker stop <容器ID或名称> [<容器ID或名称> ...]
示例:

docker stop container1 container2 container3
这将同时停止名为 container1、container2 和 container3 的多个容器。

3、批量重启容器:

docker restart <容器ID或名称> [<容器ID或名称> ...]
示例:

docker restart container1 container2 container3
这将同时重启名为 container1、container2 和 container3 的多个容器。

4、批量启动所有已停止的容器

docker start $(docker ps -qf status=exited) # 启动未运行容器


⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔
⛔⛔⛔⛔ 🈲🈲🈲🈲  以下命令慎用 🈲🈲🈲🈲 ⛔⛔⛔⛔
⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔

5、批量删除容器:
docker rm $(docker ps -aq)

或者

docker rm <容器ID或名称> [<容器ID或名称> ...]
示例:

docker rm container1 container2 container3
这将同时删除名为 container1、container2 和 container3 的多个容器。


6、删除所有已停止的容器。执行该命令将永久删除这些容器,且无法恢复。

docker container prune

7、删除所有未被标记(tag)且未被任何容器使用的镜像。

要使用该命令,请在终端中输入以下命令:

docker image prune

系统将会提示您是否确认删除未被标记和未被容器使用的镜像。如果确认,请输入 y 或 yes 并按下回车键。

请注意,在执行该命令之前,请确保您了解将被删除的镜像,并且这些镜像不再需要。执行命令后,这些镜像将无法恢复。

如果只想删除未被标记的镜像,可以使用 docker image prune -a 命令。

8、清理 Docker 系统中的不再使用的资源,包括未被使用的容器、镜像、网络和存储卷等。

执行 docker system prune 命令会提示您确认是否删除这些不再使用的资源。如果确认,请输入 y 或 yes 并按下回车键。

要使用该命令,请在终端中输入以下命令:

docker system prune

请注意,在执行该命令之前,请确保您了解将被删除的资源,并且这些资源不再需要。执行命令后,这些资源将无法恢复。

docker system prune 命令会删除以下资源:

未使用的容器
未被标记(tag)的镜像
未使用的网络
未使用的存储卷
通过清理这些不再使用的资源,可以释放磁盘空间并提高系统性能。但请务必谨慎操作,并确保不会误删重要资源。

如果只想清理部分资源,可以使用单独的命令,如 docker container prune、docker image prune、docker network prune 和 docker volume prune。


9、删除所有未被使用的资源,包括未被使用的容器、镜像、网络和存储卷等,即使它们具有标记(tag)。

要执行该命令,请在终端中输入以下命令:

docker system prune -a

系统将会提示您确认是否删除所有未被使用的资源。如果确认,请输入 y 或 yes 并按下回车键。

请注意,在执行该命令之前,请确保您了解将被删除的资源,并且这些资源不再需要。执行命令后,这些资源将无法恢复。

通过 docker system prune -a 命令可以清理所有未被使用的资源,包括未被标记的镜像、未使用的容器、未使用的网络和未使用的存储卷。这将释放磁盘空间,并提高系统性能。

但请注意谨慎操作,以免误删重要资源。如果只想清理部分资源,可以使用单独的命令,如 docker container prune、docker image prune、docker network prune 和 docker volume prune。

3.6、Docker容器的几种运行方式

1、运行交互式容器:

步骤:
使用 docker run 命令创建并运行一个新的容器。
通过 -it 选项(或者 -i -t)指定交互式模式和终端连接。
指定要运行的镜像名称。
示例命令:
docker run -it <image_name> 

解释: 这将在一个新的容器中启动一个交互式会话。您将被连接到容器的终端,可以在其中执行命令和与容器进行交互。
启动守护式容器:

步骤:
使用 docker run 命令创建并启动一个新的容器。
通过 -d 选项指定以守护进程(后台)模式运行。
指定要运行的镜像名称。
示例命令:
docker run -d <image_name> 

解释: 这将在一个新的容器中启动一个守护进程。容器将在后台运行,不会连接到容器的终端。适用于长时间运行的服务和应用程序。

3、启动具有端口映射的容器:

步骤:
使用 docker run 命令创建并启动一个新的容器。
通过 -p 选项指定要映射的端口。
指定要运行的镜像名称。
示例命令:
docker run -p <host_port>:<container_port> <image_name>
解释: 此命令将启动一个新的容器,并将容器中的指定端口映射到主机上的指定端口。这允许从主机上的指定端口访问容器中运行的应用程序。

4、运行容器并挂载卷:

步骤:
使用 docker run 命令创建并运行一个新的容器。
通过 -v 选项指定主机和容器之间的目录或文件卷挂载。
指定要运行的镜像名称。
示例命令:
docker run -v <host_dir>:<container_dir> <image_name>

解释: 此命令将创建一个新的容器,并将主机上的指定目录或文件卷挂载到容器中。这样,主机和容器之间可以共享数据。

四、Docker镜像管理

4.1、Docker镜像的几种获取方式

1、使用 Docker Hub:

步骤:
在命令行中使用 docker pull 命令下载镜像,指定要下载的镜像名称和标签。例如,要下载 Ubuntu 20.04 镜像,可以运行以下命令:
docker pull ubuntu:20.04

2、从其他 Docker 镜像仓库中获取:

步骤:

在命令行中使用 docker pull 命令,并通过 --registry-mirror 选项指定要使用的镜像仓库。例如,在使用阿里云容器镜像服务时,可以运行以下命令:
docker pull --registry-mirror=<mirror-url>/<image-name>:<tag>

或者从私有仓库拉取:

docker pull 私有仓库地址:端口/<image-name>:<tag>

3、从本地主机构建:

步骤:

创建一个名为 Dockerfile 的文本文件,并在其中定义构建所需的步骤和指令。
在 Dockerfile 所在的目录中打开命令行。
运行以下命令来构建镜像,并通过 -t 选项指定镜像的名称和标签:
docker build -t <image-name>:<tag> .

4、导入外部镜像:

步骤:

将包含要导入的 Docker 镜像的 tar 文件复制到本地 Docker 主机中。
打开命令行,并在镜像所在的目录中运行以下命令:
docker load -i <image-file>.tar

示例:
[root@zyl-server ~]# docker load -i my_tomcat.tar
Loaded image: tomcat:8.0
[root@zyl-server ~]#


5、从 Docker 镜像导出或保存为文件:

步骤:

打开命令行,并运行以下命令来导出 Docker 镜像为 tar 文件:
docker save -o <image-file>.tar <image-name>:<tag>
导出完成后,可以将生成的 tar 文件复制到其他机器或存档备份。

示例:
[root@zyl-server ~]# docker save -o my_tomcat.tar tomcat:8.0
[root@zyl-server ~]# ls
anaconda-ks.cfg  dockerfile  my-projects  my_tomcat.tar  zyl-bulid
[root@zyl-server ~]#

4.2、查看镜像具体信息

1、查看镜像详细信息,docker inspect 镜像名字:tag
示例:
docker inspect  nginx
执行命令后,将会返回包含关于该 nginx 镜像的详细配置、网络设置、挂载点等信息的 JSON 格式输出。

2、查看镜像系统
示例:
docker inspect -f{{.Os}} nginx  

执行命令后,将会返回 nginx 镜像所使用的操作系统名称。
3、查看镜像的cpu 架构
示例:
docker inspect -f{{.Architecture}}  nginx

执行命令后,将会返回 nginx 镜像所使用的体系架构,如 amd64 或 arm64。

4.3、构建镜像的有关指令

官方构建语法参考:https://docs.docker.com/engine/reference/builder/#parser-directives

**编写Docker-file 用到的指令:**

| 指令          | 作用                                       |
| ----------- | ---------------------------------------- |
| FROM        | 从最基础镜像构建 ,全新制作镜像,可以 FROM scratch, scratch它是个空镜像。 |
| ADD         | 将本地的文件,添加到镜像中去将本地的文件,添加到镜像中去             |
| RUN         | 构建中执行的shell 命令                           |
| CMD         | 类似于RUN指令,CMD 在docker run 时运行,而非docker build. 一个DockerFile中只能有一个cmd指令。 |
| LABEL       | 镜像的注释信息。可以注明应用的版本号,创建日期,谁创建的等等。          |
| EXPOSE      | 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。具体端口映射,还是需要docker run  -p <宿主端口>:<容器端口> 实际来进行映射。 |
| ENV         | 该`ENV`指令将环境变量`<key>`设置为 value `<value>`。该值将在构建阶段的所有后续指令的环境中,也可以在许多中[内联替换] |
| ARG         | 该`ARG`指令定义了一个变量,用户可以在构建时通过使用 标志的`docker build`命令将其传递给构建器, 也可以替代ENV , 因为ARG不会修改镜像内的系统环境变量。只会在构建中起作用。 |
| COPY        | 用于容器与主机之间的数据拷贝。                          |
| ENTRYPOINT  | `ENTRYPOINT` 的目的和 `CMD` 一样 ,增强版的cmd,可以运行.sh 脚本在run 之前做一些预处理的工作,以及可以跟cmd 集合一起使用。 |
| VOLUME      | 数据卷,实现数据持久化 。*数据不随着Container的删除而丢失,需要将数据挂载到本地宿主机的某个文件或目录。从而实现容器之间的数据共享等, 简单来说,Volume就是目录或者文件,它可以绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。 |
| USER        | 默认是root用户,可以切换用户, USER Zhangtl           |
| WORKDIR     | 相当于设置容器的工作目录了,  容器启动时执行的命令会在该目录下执行, 如果不存在,即使它没有在任何后续指令中使用,它也会被创建。 |
| ONBUILD     | 在使用ONBUILD命令时,其后面跟着的其他命令在当前镜像构建时不会被执行,以其为基础镜像源,构建下级镜像源时才会执行 |
| HEALTHCHECK | 可以出现一次,结合CMD 、RUN 等可以细节化验证容器中的服务是否正常。    |

4.4、构建镜像步骤

通过 Docker,可以使用 Dockerfile 文件来创建自定义的 Docker 镜像。下面是创建镜像的详细步骤:

1、创建 Dockerfile

在工作目录中创建一个新文件,并命名为 Dockerfile。Dockerfile 包含一系列指令和参数,用于描述如何构建自定义 Docker 镜像。

2、编写 Dockerfile

在 Dockerfile 中编写构建镜像所需的指令和参数。例如,定义源镜像、安装应用程序软件、添加配置文件等。

3、构建 Docker 镜像

运行以下命令来构建 Docker 镜像:

docker build -t <image-name>:<tag> .
其中 <image-name> 是为镜像取的名称,<tag> 为标签或版本号。 . 表示 Dockerfile 文件所在的当前目录。

4、查看新构建的镜像

运行以下命令查看刚刚构建的 Docker 镜像:

docker images

5、运行新构建的镜像

运行以下命令来运行新构建的镜像:

docker run --name <container-name> -p <host-port>:<container-port> -d <image-name>:<tag>

其中 :
<container-name> 是容器的名称,
<host-port> 是主机上开放的端口(例如 8080),
<container-port> 是 Docker 容器中应用程序的端口(例如 80),
 -d 参数表示在后台运行容器。

4.5、实战—构建自己的一个centos

1、创建有关dockerfile目录

[root@zyl-server ~]# mkdir dockerfile
[root@zyl-server ~]# ll
total 4
-rw-------. 1 root root 1419 Aug 12 20:31 anaconda-ks.cfg
drwxr-xr-x. 2 root root    6 Aug 29 23:30 dockerfile
drwxr-xr-x. 2 root root   51 Aug 28 22:50 docker-test-volume
[root@zyl-server ~]# cd dockerfile/
[root@zyl-server dockerfile]# ll
total 0
[root@zyl-server dockerfile]# vi mydockerfile
[root@zyl-server dockerfile]# 

2、编写构建文件

FROM centos 

MAINTAINER zyl<zyl@163.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

在这里插入图片描述

3、通过dockerfile文件构建镜像

[root@zyl-server dockerfile]# docker build -f mydockerfile -t mycentos:1.0 .

报错:通过dockerfile yum -y install vim 安装 vim 时 ,从仓库 ‘appstream’ 下载元数据失败:由于镜像列表中没有 URL,不能准备内部镜像列表。

CentOS Linux 8 - AppStream                       75  B/s |  38  B     00:00    
Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
The command '/bin/sh -c yum -y install vim' returned a non-zero code: 1

解决办法:

这是因为Centos8于2021年年底停止了服务,使用yum源安装时候,就会报错:Failed to download metadata for repo ‘AppStream’: Cannot prepare internal mirrorlist: No URLs in mirrorlist”,这时我们需要在dockerfile文件指定centos版本小于8版本:

FROM centos:centos7

MAINTAINER zyl<zyl@163.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

再次构建镜像:

[root@zyl-server dockerfile]# docker build -f mydockerfile -t mycentos:1.0 .
..............................
..............................
Successfully built a3e6ef33a458
Successfully tagged mycentos:1.0

###docker images  检查
[root@zyl-server dockerfile]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
mycentos     1.0       a3e6ef33a458   33 seconds ago   698MB
centos       centos7   eeb6ee3f44bd   23 months ago    204MB
[root@zyl-server dockerfile]# 

在这里插入图片描述

测试运行(自己构建的镜像与官方的centos原生镜像):
在这里插入图片描述

在这里插入图片描述

4.6、实战—构建自己的一个tomcat

创建工作目录


[root@zyl-server ~]# mkdir zyl-bulid
[root@zyl-server ~]# cd zyl-bulid/
[root@zyl-server zyl-bulid]# mkdir tomcat
[root@zyl-server zyl-bulid]# cd tomcat
[root@zyl-server tomcat]# ll
total 0
[root@zyl-server tomcat]#

1、准备jdk、tomcat压缩包
在这里插入图片描述

2、编写Dockerfile文件(官方命名:Dockerfile,build 时会自动寻找这个文件,就不再需要使用 -f 指定了)


FROM centos:centos7

MAINTAINER zyl<zyl@163.com>

COPY readme.txt /usr/local/readme.txt

ADD jdk-8u381-linux-x64.tar.gz /usr/local/

ADD apache-tomcat-9.0.73.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local

WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_381
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar


ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.73

ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.73

ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.73/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.73/bin/logs/catalina.out

在这里插入图片描述

3、构建镜像

docker build -t mytomcat .
..............
..............
Successfully built 7b01ac741538
Successfully tagged mytomcat:latest

在这里插入图片描述
4、docker images 检查

[root@zyl-server tomcat]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
mytomcat     latest    7b01ac741538   51 seconds ago   838MB
mycentos     1.0       a3e6ef33a458   46 minutes ago   698MB
centos       centos7   eeb6ee3f44bd   23 months ago    204MB
centos       latest    5d0da3dc9764   23 months ago    231MB
[root@zyl-server tomcat]#

5、运行镜像

1、运行
[root@zyl-server tomcat]# docker run -d -p 9090:8080 --name zyl-tomcat -v /home/zyl/projects/test:/usr/local/apache-tomcat-9.0.73/webapps/test -v /home/zyl/projects/tomcatlogs/:/usr/local/apache-tomcat-9.0.73/logs mytomcat
1706ccdbea21e820785d4edef01774263553578e664edf3ceafab2104f85e794
[root@zyl-server tomcat]#


2、进入容器
[root@zyl-server tomcat]# docker ps
CONTAINER ID   IMAGE      COMMAND                  CREATED         STATUS         PORTS                                       NAMES
1706ccdbea21   mytomcat   "/bin/sh -c '/usr/lo…"   2 minutes ago   Up 2 minutes   0.0.0.0:9090->8080/tcp, :::9090->8080/tcp   zyl-tomcat
[root@zyl-server tomcat]# docker exec -it 1706ccdbea21 /bin/bash
[root@1706ccdbea21 local]#

3、测试访问

[root@zyl-server tomcat]# curl localhost:9090

在这里插入图片描述

浏览器访问:http://192.168.234.10:9090/

在这里插入图片描述

五、发布镜像至阿里云

Docker基础入门:镜像、容器导入导出与私有仓库搭建

5.1、登录阿里云Docker Registry

[root@zyl-server tomcatlogs]# docker login --username=zhb1999 registry.cn-hangzhou.aliyuncs.com
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[root@zyl-server tomcatlogs]#

5.2、使用" docker push" 命令将centos镜像提交至阿里云

####将mytomcat 镜像IMAGE ID (7b01ac741538)提交至阿里云
[root@zyl-server tomcatlogs]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED             SIZE
mytomcat     latest    7b01ac741538   34 minutes ago      838MB
mycentos     1.0       a3e6ef33a458   About an hour ago   698MB
centos       centos7   eeb6ee3f44bd   23 months ago       204MB
centos       latest    5d0da3dc9764   23 months ago       231MB
[root@zyl-server tomcatlogs]#

###  推送
[root@zyl-server tomcatlogs]# docker tag 7b01ac741538 registry.cn-hangzhou.aliyuncs.com/zhaohaibao/mytomcat:9.0
[root@zyl-server tomcatlogs]# docker push  registry.cn-hangzhou.aliyuncs.com/zhaohaibao/mytomcat:9.0

在这里插入图片描述

提交发布的时候也是按层级进行提交的,发布时带上版本号!!!!

5.3、阿里云镜像仓库查看

在这里插入图片描述

六、发布镜像至私有仓库

6.1、下载Registry镜像

[root@zyl-server ~]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
79e9f2f55bf5: Pull complete 
0d96da54f60b: Pull complete 
5b27040df4a2: Pull complete 
e2ead8259a04: Pull complete 
3790aef225b9: Pull complete 
Digest: sha256:169211e20e2f2d5d115674681eb79d21a217b296b43374b8e39f97fcf866b375
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest
[root@zyl-server ~]# 

6.2、查看Docker 镜像列表

[root@zyl-server ~]# docker images

在这里插入图片描述

6.3、运行 Docker Registry 容器

docker run -d  -p 5000:5000 -v /zyl/myregistry/:/tmp/registry  --privileged=true registry
默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器数据卷映射,方便宿主机联调

[root@zyl-server ~]# docker run -d  -p 5000:5000 -v /zyl/myregistry/:/tmp/registry  --privileged=true registry
4c3babd80e86c8e2b21f4ad1dffeec5ca42270e5d467bed2a93839e323bcd5c6
[root@zyl-server ~]# docker ps
CONTAINER ID   IMAGE      COMMAND                  CREATED             STATUS             PORTS                                       NAMES
4c3babd80e86   registry   "/entrypoint.sh /etc…"   10 seconds ago      Up 8 seconds       0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   amazing_rhodes
780530eaf656   centos     "/bin/bash"              About an hour ago   Up About an hour                                               wizardly_dhawan
95420eae9ad9   nginx      "/docker-entrypoint.…"   About an hour ago   Up About an hour   80/tcp                                      great_pasteur
[root@zyl-server ~]# 

在这里插入图片描述
浏览器访问http://IP:5000/v2,显示“{}” 说明registry运行正常。

在这里插入图片描述

6.4、测试上传镜像到Registry

1、提交centos容器副本成为新的镜像,Tag----》1.2 。

[root@zyl-server ~]# docker ps
CONTAINER ID   IMAGE      COMMAND                  CREATED             STATUS             PORTS                                       NAMES
4c3babd80e86   registry   "/entrypoint.sh /etc…"   5 minutes ago       Up 5 minutes       0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   amazing_rhodes
780530eaf656   centos     "/bin/bash"              About an hour ago   Up About an hour                                               wizardly_dhawan
95420eae9ad9   nginx      "/docker-entrypoint.…"   2 hours ago         Up 2 hours         80/tcp                                      great_pasteur
[root@zyl-server ~]# docker commit -m="centos" -a="zyl" 780530eaf656 centos:1.2
sha256:d0a52e21dd65f98f7cd106d996e97e1b3e709431e4bb80cd2e3599953fa95fe6
[root@zyl-server ~]# docker images
REPOSITORY                                            TAG       IMAGE ID       CREATED          SIZE
centos                                                1.2       d0a52e21dd65   20 seconds ago   231MB
nginx                                                 latest    605c77e624dd   19 months ago    141MB
registry                                              latest    b8604a3fe854   21 months ago    26.2MB
hello-world                                           latest    feb5d9fea6a5   23 months ago    13.3kB
centos                                                latest    5d0da3dc9764   23 months ago    231MB
registry.cn-hangzhou.aliyuncs.com/zhaohaibao/centos   7.9       5d0da3dc9764   23 months ago    231MB
[root@zyl-server ~]# 

在这里插入图片描述

2、查看当前私有仓库镜像(空)

[root@zyl-server ~]# curl -XGET http://192.168.234.10:5000/v2/_catalog
{"repositories":[]}
[root@zyl-server ~]# 

3、将主机的registry镜像命名为符合仓库要求的格式。registry_url:port/ImageName:tag

docker tag centos:1.2 192.168.234.10:5000/centos:1.2

在这里插入图片描述

4、上传centos镜像到Registry仓库

docker push 192.168.234.10:5000/centos:1.2

push失败:

[root@zyl-server ~]# docker push 192.168.234.10:5000/centos:1.2
The push refers to repository [192.168.234.10:5000/centos]
Get "https://192.168.234.10:5000/v2/": http: server gave HTTP response to HTTPS client
[root@zyl-server ~]# 

解决:

这是因为我们启动的registry服务不是安全可信赖的。这时需要修改客户端docker的配置文件vi /etc/docker/daemon.json,



添加下面的内容(insecure-registries服务地址):

{
""registry-mirrors": ["https://XXX.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.234.10:5000"]
}
   "registry-mirrors": ["https://XXX.mirror.aliyuncs.com"] 是阿里云代理的Registry Hub仓库的地址,可以加快国内访问Registry Hub仓库的速度。
   
修改好之后需要重启Docker服务才能生效,

执行命令:systemctl restart docker ,再push即可.

在这里插入图片描述
5、再次推送

[root@zyl-server ~]# docker push 192.168.234.10:5000/centos:1.2
The push refers to repository [192.168.234.10:5000/centos]
Get "http://192.168.234.10:5000/v2/": dial tcp 192.168.234.10:5000: connect: connection refused
[root@zyl-server ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@zyl-server ~]# 

报错:connect: connection refused

解决:docker ps 查看发现没有运行的镜像实例,重新运行 registry。

docker run -d  -p 5000:5000 -v /zyl/myregistry/:/tmp/registry  --privileged=true registry

### push

docker push 192.168.234.10:5000/centos:1.2

在这里插入图片描述

6、检查–查看当前私有仓库镜像

[root@zyl-server ~]# curl -XGET http://192.168.234.10:5000/v2/_catalog
{"repositories":["centos"]}
[root@zyl-server ~]# 

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


至此,我们的Registry私有仓库搭建完成,如果在今后中要使用,可以使用命令:

docker pull 192.168.234.10:5000/centos:1.2

在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖

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

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

相关文章

2023 年高教社杯全国大学生数学建模竞赛-E 题 黄河水沙监测数据分析详解+思路+Python代码

2023 年高教社杯全国大学生数学建模竞赛-E 题 黄河水沙监测数据分析 十分激动啊啊啊题目终于出来了&#xff01;&#xff01;官网6点就进去了结果直接卡死现在才拿到题目&#xff0c;我是打算A-E题全部做一遍。简单介绍一下我自己&#xff1a;博主专注建模四年&#xff0c;参与…

手写Spring:第12章-基于JDK、Cglib实现AOP切面

文章目录 一、目标&#xff1a;基于JDK、Cglib实现AOP切面二、设计&#xff1a;基于JDK、Cglib实现AOP切面三、实现&#xff1a;基于JDK、Cglib实现AOP切面3.0 引入依赖3.1 工程结构3.2 AOP切点表达式和使用以及基于JDK和CGLIB的动态代理类图3.3 切点表达式3.3.1 类匹配接口3.3…

一生一芯10——verilator v5.008环境搭建

搜索 verilator 官网&#xff0c;得到网址如下&#xff1a; https://www.veripool.org/verilator/ 点击download 找到 git quick install 可以看到git快捷安装所需命令行 可以看到&#xff0c;需要预先安装下面的包文件&#xff0c;去掉前面的#注释符号进行安装 直接进行下面…

全力助推徐工集团转型升级,迅镭激光智能装备展现硬核实力!

在江苏省徐州市&#xff0c;工程机械产业集群在成功入选首批国家先进制造业集群后&#xff0c;正加快向世界级先进制造业集群跃升。徐工集团作为徐州市“343”创新产业集群“一号产业”链主企业&#xff0c;正发挥着“领头雁”作用。 为了把徐州市“全球工程机械之都”名片擦得…

WebGIS外包开发流程

WebGIS开发流程需要综合考虑前端和后端开发、地理信息数据处理、用户需求和安全性等多个方面。成功的WebGIS应用程序需要不断地进行更新和维护&#xff0c;以适应变化的需求和技术。WebGIS开发是一个复杂的过程&#xff0c;通常包括以下主要步骤。北京木奇移动技术有限公司&…

jmeter 接口快速创建

通过cURL命令创建测试计划 从浏览器获取接口 从postman获取接口

2000-2021年上市公司全要素生产率数据(OLS法、OP法、LP法、GMM法、FE法)(含原始数据+计算代码+结果)

2000-2021年上市公司全要素生产率数据&#xff08;OLS法、OP法、LP法、GMM法、FE法&#xff09;&#xff08;含原始数据计算代码结果&#xff09; 1、时间&#xff1a;2000-2021年 2、指标&#xff1a;股票代码、年份、证券代码、固定资产净额、营业总收入、营业收入、营业成…

[PyTorch][chapter 54][GAN- 1]

前言&#xff1a; GAN playground: Experiment with Generative Adversarial Networks in your browser 生成对抗网络&#xff08;Generative Adversarial Nets&#xff0c;GAN&#xff09;是一种基于对抗学习的深度生成模型&#xff0c;最早由Ian Goodfellow于2014年在《Gener…

Android 性能优化--内存优化分析总结

一、内存优化概念 1.1 为什么要做内存优化&#xff1f; 内存优化一直是一个很重要但却缺乏关注的点&#xff0c;内存作为程序运行最重要的资源之一&#xff0c;需要运行过程中做到合理的资源分配与回收&#xff0c;不合理的内存占用轻则使得用户应用程序运行卡顿、ANR、黑屏&…

maven(总)

maven maven的简介 maven主要服务于基于java平台的项目构建&#xff0c;依赖管理和项目信息管理 主要体现在项目和管理 瀑布式开发&#xff1a;在做项目的时候要求有明确的需求&#xff0c;必须按照需求一步一步去做好规划&#xff0c;在项目的运行过程中严格的产出一些文档 …

gdal求矢量图形的形心

gdal求矢量图形的形心 #include "gdal_priv.h" #include "ogrsf_frmts.h"int main() {OGRRegisterAll();OGRPolygon* square_1 new OGRPolygon();OGRLinearRing* ring_1 new OGRLinearRing();// 添加 square_1 的点ring_1->addPoint(0, 0);ring_1-&g…

js--15----闭包是什么?说说闭包的使用场景

1、闭包是什么&#xff1f; 一个函数和对其周围状态&#xff08;词法环境&#xff09;的引用绑定在一起&#xff08;或者说函数被引用包围&#xff09;&#xff0c;这样的组合就是是闭包&#xff08;closure&#xff09;&#xff0c;也就是说&#xff0c;闭包让你在一个内层函数…

win环境安装SuperMap iserver和配置许可

SuperMap iServer是我国北京超图公司研发的基于跨平台GIS内核的云GIS应用服务器产品&#xff0c;通过服务的方式&#xff0c;面向网络客户端提供与专业GIS桌面产品相同功能的GIS服务&#xff0c;能够管理、发布多源服务&#xff0c;包括REST服务、OGC服务等。 SuperMap iserve…

23062C++QT day2

封装一个结构体&#xff0c;结构体中包含一个私有数组&#xff0c;用来存放学生的成绩&#xff0c;包含一个私有变量&#xff0c;用来记录学生个数&#xff0c; 提供一个公有成员函数&#xff0c;void setNum(int num)用于设置学生个数 提供一个公有成员函数&#xff1a;void…

AI 时代的向量数据库、关系型数据库与 Serverless 技术丨TiDB Hackathon 2023 随想

TiDB Hackathon 2023 刚刚结束&#xff0c;我仔细地审阅了所有的项目。 在并未强调项目必须使用人工智能&#xff08;AI&#xff09;相关技术的情况下&#xff0c;引人注目的项目几乎一致地都使用了 AI 来构建自己的应用。 大规模语言模型&#xff08;LLM&#xff09;的问世使得…

监听Helm release资源

监听Helm release资源 基于helm做部署管理工具时&#xff0c;可能想要管理用户已有环境&#xff0c;这时需要将已有环境中的release信息上报到业务系统中。当用户在环境中部署新的release时&#xff0c;也需要实时监听并上报回来。下面将讲解如何去监听release资源 helm rele…

天津web前端培训班 前端是否适合零基础学?

随着HTML 5和ECMAScript 6的正式发布&#xff0c;大量的前端业务逻辑&#xff0c;极大地增加了前端的代码量&#xff0c;前端代码的模块化、按需加载和依赖管理势在必行&#xff0c;因此Web前端越来越被人们重视。 Web前端的就业前景 Web前端开发工程师薪资持续走高&#xff…

LoadRunner参数化详解

安装打开loadrunner时&#xff0c;发现虽然自己的思想还在&#xff0c;但已经非常生疏了&#xff0c;好多设置都找不到了具体的位置。下面说参数化参数化是性能测试中时最常用的一种技巧吧&#xff01;这里需要说明的是&#xff0c;不是只有loadrunner才可以设置参数化&#xf…

《热题100》字符串、双指针、贪心算法篇

思路&#xff1a;对于输入的的字符串&#xff0c;只有三种可能&#xff0c;ipv4,ipv6,和neither ipv4:四位&#xff0c;十进制&#xff0c;无前导0&#xff0c;小于256 ipv6:八位&#xff0c;十六进制&#xff0c;无多余0&#xff08;00情况不允许&#xff09;&#xff0c;不…

JAVA设计模式第十讲:SPI - 业务差异解决方案

JAVA设计模式第十讲&#xff1a;SPI - 业务差异解决方案 我们需要在不修改源代码的情况下&#xff0c;动态为程序提供一系列额外的特性。首先想到的是Spring的AOP技术来构建应用插件&#xff0c;但是在Java自带的插件中&#xff0c;就有完整的实现。SPI&#xff08;Service Pro…