docker镜像
1.1什么是镜像,镜像基础
1.1.1 镜像的简介
镜像是一种轻量级,可执行的独立软件包,也可以说是一个精简的操作系统。镜像中包含应用软件及应用软件的运行环境,具体来说镜像包含运行某个软件所需的所有内容,包括代码,库,环境变量和配置文件等。几乎所有的应用,直接打包为Docker
镜像后就可以运行。
由于镜像运行时是容器,容器的设计初衷就是快熟和小巧,所以镜像通常都比较小,镜像中不包含内核,其共享宿主机的内核:镜像中只包含简单的shell
,或者没有shell
。
1.1.2 镜像的仓库分类
镜像中心中存储着大量的镜像image Repository
,每个镜像仓库中包含着大量相关镜像。根据这些镜像发布者的不同,形成了四类不同的镜像仓库。
第一类:Docker Official Image
这些是由Docker
公司官方维护和支持的镜像。通常,它们提供了一系列广泛使用的基础设施组件,比如操作系统(Ubuntu、Alpine)
、数据库(MySQL、Postgres)
、中间件(Node.js、Python)
等。这些镜像遵循最佳实践,通常被认为是使用这些软件的最安全和最稳定的方式。
第二类:VerifiedPublisher
这些是由第三方组织或个人发布的镜像,但已经通过了Docker
的验证过程。验证发布者意味着这些实体已经证明了它们是实际软件的合法发布者,从而提供了一定程度的信任和安全性。
第三类:Sponsored OSS(Sponsored Open Source Software)
这类仓库包含开源软件的镜像,这些软件得到了某些组织的赞助。这种类型的仓库可能会提供一些特定的优势,比如额外的维护或支持,这些都是因为有赞助商的参与。
第四类:无认证仓库
这些是由社区成员发布的镜像,没有经过Docker
官方的任何形式的验证。虽然这类仓库可以包含大量有用和高质量的镜像,但它们也可能包含未经测试或不安全的软件,因此在使用这类镜像时需要额外小心。
1.3 docker
镜像的特点
Docker
镜像都是只读的,当容器启动时,一个新的可写的镜像被加载到镜像层的顶部,这一层通常被叫做容器层,容器层之下的都叫镜像层。
1.4 为什么下载的tomcat
镜像很大
1.搜索仓库,docker search tomcat
2. 下载镜像 docker pull tomcat
docker run
了啥
docker run 是 Docker 的一个核心命令,用于创建一个新的容器实例并运行一个命令。这个命令非常强大,因为它集创建和启动容器于一体,拥有许多可配置的选项,可以满足不同的使用场景。
3.5.1当你运行 docker run
命令时,大致发生了以下事情:
- 拉取镜像(如果本地不存在):如果你指定运行的镜像在本地不存在,
Docker
会从配置的镜像仓库(默认是Docker Hub
)中拉取这个镜像。 - 创建一个新的容器:基于指定的镜像创建一个新的容器实例。这个过程包括分配文件系统、网络接口和设置初始化配置等。
- 分配一个文件系统:容器会被赋予其独立的文件系统,该文件系统的根目录是从镜像提供的文件层中创建的。
- 网络配置:根据
Docker
的网络配置(如桥接、主机、容器或无网络),为容器分配网络设置。 - 设置执行环境:根据
Dockerfile
中的指令或者docker run
命令的选项(如环境变量、卷挂载、端口映射等),为容器设置运行时环境。 - 执行命令:容器启动后,它会执行
Dockerfile
中指定的CMD
命令,或者docker run
命令行中指定的命令。 - 运行状态:如果命令持续运行(如
Web服务器
),容器将保持运行状态;如果命令快速完成(如运行一个批处理任务),容器运行命令后将停止。
2.1 镜像命令
2.1.1 docker images 列表本机上的镜像
docker images
命令用于列出本地主机上的所有Docker镜像。这个命令会显示镜像的仓库名(repository)
、标签(tag)
、镜像ID
、创建时间
以及大小
等信息。它是Docker
日常使用中的基础命令之一,帮助用户了解当前可用的镜像资源。
用法:docker images
选项:
-a
或--all
:显示所有镜像(默认隐藏的中间镜像层也会显示)。--digests
:显示镜像的摘要信息。-f
或--filter
:基于给定条件显示镜像。--format
:使用给定的Go
模板格式化命令的输出。--no-trunc
:显示完整的镜像信息,不截断输出。-q
或--quiet
:仅显示镜像的ID
。
常用示例:
1.列出所有镜像,包括中间层镜像:docker images -a
- 按照特定模式过滤镜像:
docker images --filter=reference='nginx:*'
,这讲仅列出仓库名为nginx
的镜像
- 显示摘要信息:
docker images --digests
- 格式化输出:
docker images --format 'table {{.Repository}}\t{{.Tag}}'
,以表格形式仅显示镜像的仓库名和标签:
- 显示镜像ID (静默模式):
docker image -q
,这会仅列出所有镜像的ID
,非常适合配合其他命令使用。
2.1.2 docker seach 镜像搜索命令
docker search
命令用于在Docker Hub
上搜索镜像。这个命令允许用户查找和筛选公共镜像库中的镜像,便于用户发现和使用各种可用的Docker
镜像。使用此命令,你可以基于关键字进行搜索,并通过不同的选项来细化搜索结果。
用法:docker search [OPTIONS] TERM
选项:
--filter
或-f
:基于给定条件过滤搜索结果。--format
:使用Go
模板格式化命令的输出。--limit
:限制返回的搜索结果数量。--no-trunc
:显示完整的镜像描述,不截断输出。
常用示例:
- 搜索
Docker Hub
以找到名称中包含nginx
的镜像:docker search nginx
这将列出Docker Hub
上所有与nginx
相关的公共镜像。 - 使用过滤器,列出官方
(official)
的镜像:docker search --filter=is-official=true nginx
- 限制搜索结果的数量:
docker search --limit=5 nginx
这将只显示搜索结果中的前5个 - 显示完整的描述,默认情况下
docker search
可能会阶段镜像描述,使用docker search --no-trunc nginx
选项可以看到完整的描述
- 格式化输出:
docker search --format "{{.Name}}: {{.Description}}" nginx
使用--format
选项,你可以定制输出的格式。例如,如果你只想看到镜像名称和描述:
小提示:
在使用docker search
时,考虑搜索结果的星标数(STARS)
和是否为官方(OFFICIAL)
镜像,这可以帮助你选择更受社区信任和更有保障的镜像。
请注意,由于Docker Hub
以外还有其他的Docker
注册中心(如Google Container Registry, Quay.io等)
,docker search
命令默认只在Docker Hub
中搜索。
docker search
是一个实用的命令,能帮助你快速发现和评估可用的Docker
镜像。通过有效地使用其提供的选项,你可以更精确地找到所需的镜像。
2.1.3 docker pull 镜像下载命令
docker pull
命令用于从注册中心下载(拉取)
一个镜像或仓库的镜像到本地。这是Docker
操作中最常见的命令之一,允许用户从Docker Hub
或其他Docker
注册中心获取镜像。
用法:docker pull [OPTIONS] NAME[:TAG|@DIGEST]
选项:
[OPTIONS]
是可选参数。NAME
是镜像的名称。TAG
是可选的,指定要拉取的镜像的版本标签,默认是latest
。@DIGEST
是可选的,指定要拉取的镜像的精确内容地址。
常用示例:
- 拉取最想念版本的镜像:
docker pull nginx
- 拉取特定版本的镜像:
docker pull nginx:1.17
- 使用内容摘要拉取镜像:如果你知道镜像的摘要(Digest),也可以使用它来精确拉取特定的镜像,摘要通常是一个
SHA256
散列值,确保了拉取的镜像内容的一致性喝完整性,如docker pull nginx@sha256:25a0d4...
注意事项:
当使用docker pull
命令时,默认从Docker Hub
拉取镜像,如果需要从其他Docker注册中心
拉取镜像,需要在镜像名钱指定注册中心的地址,如docker pull myregistry.local:5000/myimage:mytag
拉取镜像需要网络连接到注册中心,确保你的网络链接正常,并且在有必要时配置适当的网络代理。
对于大型镜像拉取操作可能会耗时较长,具体时间取决于你的网络速度和镜像大小,docker pull
是管理Docker
镜像基础,理解并熟练使用这个命令对于有效的利用Docker
很重要。
2.1.4 docker rmi 镜像删除命令
docker rmi
命令用于删除一个或多个本地的Docker
镜像。当你需要清理不再需要的镜像或释放磁盘空间时,这个命令非常有用。使用此命令时,可以通过镜像的ID
、标签(tag)
或摘要(digest)
来指定要删除的镜像。
用法:
docker rmi [OPTIONS] IMAGE [IMAGE...]
[OPTIONS]
是可选参数。IMAGE
是要删除的镜像的ID
、标签
或摘要
。你可以同时指定多个镜像以用空格分隔。
选项:--force
,-f
:强制删除,即使有容器正在使用这个镜像。--no-prune
:不移除该镜像的未带标签的父镜像。
使用实例:
- 删除多个镜像,通过指定镜像的标签删除镜像:
docker rmi nginx:latest
。 - 删除多个镜像,通过指定镜像的ID删除镜像:
docker rmi a24bb4013296
。
- 同时删除多个镜像:你可以一次性删除多个镜像,只需将他们的标签或ID以空格分隔
docker rmi nginx:latest ubuntu:latest
。 - 强制删除镜像:如果一个镜像被一个或多个容器使用,正常情况下不能删除它,使用
-f
或者--force
选项可以强制删除docker rmi -f a24bb4013296
。 - 删除多个未被标记的镜像,未被标记的镜像既没有标签的镜像,通常是构建过程中的中间层镜像,你可以使用
docker rmi $(docker images -f "danling-true" -q)
命令查找并删除这些镜像。
注意
- 删除正在使用的镜像可能会导致依赖于这个镜像的容器无法正常工作。
- 在删除镜像前,确保没有任何容器正在使用它,除非你使用
--force
选项。- 删除镜像后,占用的磁盘空间会被释放。然而,如果其他镜像依赖于被删除镜像的层,这些共享的层不会被删除。
- 如果你的目标是释放磁盘空间,请考虑使用
docker system prune
命令,它可以删除未使用的镜像、容器、网络和卷。
2.1.5 docker run创建一个新的容器并运行一个命令
docker run
命令用于创建一个新的容器并运行一个命令。这是 Docker
中最常用的命令之一,因为它结合了容器的创建和启动过程。通过 docker run
,你可以基于指定的镜像启动一个或多个独立的容器环境,运行应用程序或服务。
用法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
[OPTIONS]
是可选参数,用于指定容器的配置,如端口映射、卷挂载、环境变量等。IMAGE
是用于创建容器的镜像名称或ID
。[COMMAND]
是可选的,用于指定在容器内部启动时执行的命令。[ARG...]
是传递给命令的参数列表。
选项:--name
:为容器指定一个名称。-d
,--detach
:以后台模式运行容器。-p
,--publish
:发布容器的一个或多个端口到宿主机上。-v
,--volume
:挂载一个或多个卷。--rm
:容器退出时自动清理容器文件系统。-e,
--env
:设置环境变量。--network
:连接容器到指定的网络。--restart
:设置容器的重启策略。
使用示例:
- 运行一个简单的容器,以交互模式运行
ubuntu
镜像,并启动一个Bash终端:docker run -it ubuntu /bin/bash
- 以后台模式运行容器,启动一个名为
munginx
的nginx容器,并在后台运行:docker run --name mynginx -d nginx
- 映射端口,将容器的80端口映射到宿主机的8081端口:
docker run -p 8080:80 nginx
- 挂载卷,宿主机的
/my/data
目录挂载到容器的/data
目录docker run -v /my/data:/data ubuntu
- 设置环境便令,使用
-e
选项设置容器内的环境变量docker run -e MY_ENV_VAR=value ubuntu
6.自动清理容器,使用--rm
选项,在容器退出时自动删除它docker run --rm unbuntu
注意事项
- 使用
-d
选项运行容器时,容器会在后台执行,你可以通过docker logs
命令查看容器的输出。- 当你通过
docker run
启动容器时,如果本地不存在指定的镜像,Docker
会尝试从远程仓库拉取这个镜像。--name
选项可以帮助你更容易地管理容器,但容器名称必须在Docker
宿主机上唯一。- 理解并正确使用端口映射和卷挂载对于容器化应用的网络访问和数据持久化至关重要。
2.3 镜像分层
2.3.1 什么是分层
docker
镜像由一些松耦合的只读镜像组成,Docker Daemon
负责堆叠这些镜像,并将他们关联为一个统一的整体,即对外表现出的一个独立的对象。
通过docker pull
命令拉取指定的镜像时,每个pull complete
结尾的行就代表下载完毕了一个镜像层。
2.3.2 为什么分层
采用这种分层结构的优势很多,例如,每个分层都是只读的,所有对分层的修改都是以新分层的形式出现,并不会破原分层内容,再如每个分层值记录变更内容,所以有利于节省存储空间等。
不过,分层结构的最大的好处是,在不同镜像间实现资源共享,即不同镜像对相同下层镜像的复用。对于docker pull
命令,其在拉取之前会先获取到其要拉区镜像的所有ImageID
,然后再本地查找是否存在这些分层,如果存在,则不再进行拉取,而是共享本地的该分层。大大节省了存储空间和网络贷款,提升了拉取效率。
2.3.3 镜像层构成
每个镜像层由两个部分构成,镜像文件系统与镜像JSON
文件,这两部分具有相同的imageID
。
镜像文件系统就是对镜像占有的磁盘空间进行管理的文件系统,拥有该镜像所有镜像层的数据内容,而镜像JSON
文件则是用于描述镜像相关属性的集合,通过docker inspect[镜像]
就可以直观看到
2.3.4镜像FS构成
一个docker
镜像的文件系统FS
由多层只读的镜像层构成,每层都完成了特定的功能。而这些只读镜像层根据其位置与功能的不通可分为两类:基础镜像层和扩展镜像成
2.3.4.1基础镜像成
所有镜像的最下层都具有一个可以看得到的基础镜像层Base Image
,基础镜像层的问价那系统成为跟文件系统rootfs
,而rootfs
则是建立在linux
系统中”看不到的“引导文件系统bootfs
之上。
2.3.4.2扩展镜像成
在基础镜像层之上的镜像成为扩展镜像层,顾名思义就是对镜像层的功能扩展。在dockerfile
中,每条指令都是用于完成某项特定共能得,而每条指令都会生成一个扩展镜像层。