一、Docker 镜像是什么
Docker image 本质上是一个 read-only 只读文件, 这个文件包含了文件系统、源码、库文件、依赖、工具等一些运行 application 所必须的文件。
我们可以把 Docker image 理解成一个模板, 可以通过这个模板实例化出来很多容器。
image 里面是一层层文件系统 Union FS。联合文件系统,可以将几层目录挂载到一起,形成一个虚拟文件系统。
每一层文件系统我们叫做一层 layer,联合文件系统可以对每一层文件系统设置三种权限,只读(readonly)、读写(readwrite)和写出(whiteout-able),但是 docker镜像中每一层文件系统都是只读的。
构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层的修改,增加了一层文件系统。一层层往上叠加,上层的修改会覆盖底层该位置的可见性,这也很容易理解,就像上层把底层遮住了一样。当你使用的时候,你只会看到一个完全的整体,你不知道里面有几层,也不清楚每一层所做的修改是什么。
镜像生活案例
镜像相当于我们 java 或者 C++中的类,相当于一个模板,可以很方便的构建出来不同的对象。
镜像分层生活案例
我们以日常的地板为例,开发商的房子提供给用户的时候一般是做好了地暖,而这些地暖其实是一层一层添加的,最底层的钢筋水泥层,然后添加保温层,采暖管,再铺设水泥层,到最后交付的时候家家户户都是水泥面,这一层一般是不可修改的,最上层用户一般会再铺设商木地板或者地板砖每家每户的选择不一样,相当于我们镜像的容器层。
为什么需要镜像
在部署应用时,通过手工或写一些脚本的方式进行部署。这样部署面临问题就是云端和本地环境一致问题。用户为每个应用打包过程比较繁琐,需要配置和给中修改等操作,非常费劲。
然而,Docker 镜像就是为了解决这个小小的打包功能,突然一夜之间成名。那么,你可能说 Docker 镜像就是个压缩包,是的,你猜对了,它就像一个压缩包文件。它是如何解决 Paas 时代所面临的云端和本地一致性问题?很简单,它是把一个镜像制作成一个完整的操作系统所有文件和对应的目录结构,这样的压缩包是跟你本地和测试环境用的操作系统一摸一样。
docker 最大的贡献就是定义了容器镜像的分层的存储格式,docker 镜像技术的基础是联合文件系统(UnionFS),其文件系统是分层的。这样既可以充分利用共享层,又可以减少存储空间占用。
docker 镜像提供了一种打包应用程序和预配置服务器环境的便捷方式,可以很方便的将其用于个人用途或与其他 Docker 用户公开共享。
二、镜像命令详解
1.镜像命令清单

2.docker images
功能:列出本地镜像。
语法
docker images [OPTIONS] [REPOSITORY[:TAG]]
别名
docker image ls, docker image list
关键参数
○ -a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
○ --digests :显示镜像的摘要信息;
○ -f :显示满足条件的镜像;
○ --format :指定返回值的模板文件;
○ --no-trunc :显示完整的镜像信息;
○ -q :只显示镜像 ID。
示例:
列出本地全部镜像
列出本地镜像中 REPOSITORY 为 ubuntu 的镜像列表
3.docker tag
功能:标记本地镜像,将其归入某一仓库。
语法
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
别名
docker image tag
4.docker pull
参考镜像仓库命令
5.docker push
参考镜像仓库命令
6.docker rmi
功能:删除镜像。
语法
docker rmi [OPTIONS] IMAGE [IMAGE...]
别名
docker image rm, docker image remove
关键参数
○ -f :强制删除;
○ --no-prune :不移除该镜像的过程镜像,默认移除;
示例
也可以通过 rm 先删除容器(i 表示的就是 images),最后再删除镜像。
7.docker save
功能:将指定镜像保存成 tar 归档文件。
语法
docker save [OPTIONS] IMAGE [IMAGE...]
别名
docker image save
关键参数
-o :输出到的文件。
示例
8.docker load
功能:导入使用 docker save 命令导出的镜像。
语法:
docker load [OPTIONS]
别名:
docker image load
关键参数:
○ --input , -i : 指定导入的文件,代替 STDIN。
○ --quiet , -q : 精简输出信息。
示例:
9.docker image inspect
功能:查看镜像详细信息
语法
docker image inspect [OPTIONS] IMAGE [IMAGE...]
注意事项:docker inspect 会自动检查是镜像还是容器然后显示相信信息
示例
10.docker history
功能:显示镜像历史。
语法:
docker history [OPTIONS] IMAGE
别名
docker image history
关键参数
○ -H , --human :大小和日期采用人容易读的格式展现
○ --no-trunc :显示全部信息,不要隔断;
○ -q, --quiet: 只显示镜像 id 信息;
示例
11.docker import
功能:从归档文件中创建镜像。
语法
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
别名
docker image import
关键参数
○ -c :应用 docker 指令创建镜像;
○ -m :提交时的说明文字;
示例:
12.docker image prune
docker image prune
是 Docker 提供的一个命令,用于清理未使用的或悬空的 Docker 镜像,以释放磁盘空间。未使用的镜像是那些没有被任何容器使用的镜像,而悬空镜像(dangling images)是指没有标签且未被任何容器引用的镜像。
语法
docker image prune [OPTIONS]
常用选项
-a, --all:删除所有未使用的镜像,而不仅仅是悬空镜像。
--filter:根据条件过滤要删除的镜像(例如,until=24h 删除超过 24 小时的镜像)。
-f, --force:强制删除,不提示确认。
--dry-run:仅显示将要删除的镜像,而不实际执行删除操作。
注意事项
-
谨慎使用
-a
选项:-a
会删除所有未使用的镜像,包括可能以后会用到的镜像。建议在执行前确认。 -
悬空镜像的产生:悬空镜像通常是由于构建新镜像时覆盖了旧镜像的标签,或者删除了某个标签的镜像。
-
磁盘空间清理:定期运行
docker image prune
可以有效释放磁盘空间,尤其是在频繁构建和删除镜像的环境中
示例
13.docker build
docker build
是 Docker 中用于根据 Dockerfile
构建镜像的命令。Dockerfile
是一个文本文件,包含了一系列指令,用于定义如何构建一个 Docker 镜像。通过 docker build
,你可以将应用程序及其依赖打包成一个可移植的镜像,方便在不同环境中运行。
语法:
docker build [OPTIONS] PATH | URL
PATH:包含 Dockerfile 的目录路径。Docker 会将该目录作为构建上下文(build context),并将其发送到 Docker 守护进程。
URL:Git 仓库地址或远程 tarball 的 URL,Docker 会从该位置获取构建上下文。
常用选项
选项 | 说明 |
---|---|
-f, --file | 指定 Dockerfile 的路径(默认是 PATH/Dockerfile )。 |
-t, --tag | 为构建的镜像指定名称和标签(格式:name:tag )。 |
--build-arg | 设置构建时的变量(用于 ARG 指令)。 |
--no-cache | 禁用缓存,从头开始构建镜像。 |
--pull | 总是尝试拉取最新版本的基础镜像。 |
--target | 多阶段构建时,指定目标阶段。 |
--quiet, -q | 静默模式,只输出镜像 ID。 |
--rm | 构建成功后删除中间容器(默认启用)。 |
Dockerfile 基本指令
Dockerfile
是构建镜像的核心文件,以下是一些常用指令:
指令 | 说明 |
---|---|
FROM | 指定基础镜像。 |
RUN | 在镜像中执行命令。 |
COPY | 将文件或目录从构建上下文复制到镜像中。 |
ADD | 类似于 COPY ,但支持自动解压和远程 URL。 |
WORKDIR | 设置工作目录。 |
ENV | 设置环境变量。 |
ARG | 定义构建时的变量。 |
EXPOSE | 声明容器运行时监听的端口。 |
CMD | 指定容器启动时默认执行的命令。 |
ENTRYPOINT | 指定容器启动时的主要命令。 |
LABEL | 为镜像添加元数据。 |
VOLUME | 定义挂载点。 |
USER | 指定运行命令的用户。 |
示例后续专门讲解