1.Docker镜像
Docker 镜像是用于部署容器化应用的轻量级、可执行的软件包。它们包含了运行特定应用所需的所有内容,包括代码、运行时环境、系统工具、系统库和设置。Docker 镜像通过文件来实现不同层的分发,每一层对应Dockerfile中的一个指令,如安装软件包或复制文件,这种分层机制允许共享、复用和缓存,从而提高构建效率。
镜像是只读的,并且是Docker容器生命周期的起点。当需要启动一个容器时,Docker 从镜像中提取文件并在其上创建一个可写层,用于存储运行时数据。每个容器都是从镜像生成的,但容器可以修改其可写层,这些修改不会影响原始镜像。
用户可以自定义镜像,通过编写Dockerfile并使用`docker build`命令构建,或者从Docker Hub等公共仓库拉取现有的镜像。镜像可以通过`docker pull`命令从远程仓库下载到本地环境,同样,用户可以使用`docker push`命令将本地构建的镜像上传到远程仓库,以便于分享和协作。
Docker 镜像的这种封装、移植性和版本控制特性,使得它们成为现代应用部署和管理的理想选择。
该栏目主要介绍Docker相关的知识,便于自查,持续更新,如果小伙伴们觉得不错的话,请大家收藏与点赞!多多支持!
2. 创建镜像命令
2.1 docker build
功能:命令用于使用 Dockerfile 文件创建镜像
该命令用于根据指定的 Dockerfile 构建一个新的镜像。Dockerfile 是一个文本文件,包含了用于构建镜像的所有指令。
docker build [OPTIONS] PATH
参数说明:
- PATH: 指定构建上下文的路径,通常是包含 Dockerfile 的目录路径。
OPTIONS说明:
--build-arg=[] :设置镜像创建时的变量;--cpu-shares :设置 cpu 使用权重;--cpu-period :限制 CPU CFS周期;--cpu-quota :限制 CPU CFS配额;--cpuset-cpus :指定使用的CPU id;--cpuset-mems :指定使用的内存 id;--disable-content-trust :忽略校验,默认开启;-f :指定要使用的Dockerfile路径;--force-rm :设置镜像过程中删除中间容器;--isolation :使用容器隔离技术;--label=[] :设置镜像使用的元数据;-m :设置内存最大值;--memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;--no-cache :创建镜像的过程不使用缓存;--pull :尝试去更新镜像的新版本;--quiet, -q :安静模式,成功后只输出镜像 ID;--rm :设置镜像成功后删除中间容器;--shm-size :设置/dev/shm的大小,默认值是64M;--ulimit :Ulimit配置。--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。--network: 默认 default。在构建期间设置RUN指令的网络模式
示例:
#使用当前目录的 Dockerfile 创建镜像,标签为 runoob/ubuntu:v1
docker build -t runoob/ubuntu:v1 .#使用URL github.com/creack/docker-firefox 的 Dockerfile 创建镜像
docker build github.com/creack/docker-firefox#也可以通过 -f 指定Dockerfile 文件的位置
docker build -f /path/to/a/Dockerfile
docker build构建上下文路径(PATH)可以是一个本地的文件路径,也可以是一个远程 Git 仓库的 URL,如果构建过程中需要访问私有仓库,需要先登录到该仓库。构建镜像是一个相对耗时的过程,特别是对于大型应用,因为它需要逐层构建。
2.2 docker commit
功能:依据改动过的容器,创建新镜像并提交
该命令用于从更改过的容器中创建一个新的镜像。这个命令通常在你修改了容器的文件系统,或者想要保存容器当前状态为一个新的镜像时使用
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
参数说明:
- CONTAINER: 要提交的容器的ID或名称。
- REPOSITORY: 新镜像的仓库名称。
- TAG: 新镜像的标签,默认为 "latest"。
OPTIONS说明:
-a, --author="": 设置镜像作者。
-c, --change=[]: 使用Dockerfile指令来修改镜像。
-m, --message="": 设置提交信息。
-p, --pause: 在提交过程中暂停容器。
示例:
docker commit -a "作者" -m "描述" container_id myrepo:mytagdocker commit container_id myrepo:mytag
docker commit提交的镜像不会包含容器的历史记录或元数据,它仅仅是当前容器的快照,如果容器正在运行,docker commit 命令会先暂停容器,通常建议使用 Dockerfile 来创建镜像,因为这样更可控和可重复。
3. 镜像展示
3.1 docker images
功能:列出本地镜像
该命令用于列出本地机器上的镜像。它显示了镜像的仓库名称、标签、镜像ID、创建时间和大小等信息。
表头说明:
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签版本号
- IMAGE ID:镜像I的D
- CREATED:镜像的创建时间
- SIZE:镜像的大小
Tag说明:
同一仓库源可以有多个 TAG版本,代表这个仓库源的不同个版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。如果你不指定一个镜像的版本标签,例如你只使用 mysql,docker 将默认使用 mysql:latest 镜像
docker images [OPTIONS] [REPOSITORY[:TAG]]
参数说明:
- REPOSITORY: 镜像的仓库名称。
- TAG: 镜像的标签。
OPTIONS说明:
-a,--all #列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
--digests #显示镜像的摘要信息;
-f,--filter #显示满足条件的镜像;
--format #指定返回值的模板文件;
--no-trunc #显示完整的镜像信息;
-q,--quiet #只显示镜像ID
示例:
#查看本地镜像列表
docker images # 列出所有的镜像
docker images -a#列出本地镜像中为ubuntu的镜像列表
docker images ubuntu # 仅列出镜像的ID
docker images -q
3.2 docker image ls
功能:列出本地镜像
docker image ls 是一个简写命令,它实际上是 docker images 命令的别名。它用于列出本地机器上的 Docker 镜像。
docker image ls [OPTIONS] [REPOSITORY[:TAG]]
参数说明:
- REPOSITORY: 镜像的仓库名称。
- TAG: 镜像的标签。
OPTIONS说明:
-a, --all: 显示所有的镜像(包括中间镜像)。
--digests: 显示镜像的摘要信息。
-f, --filter: 根据条件过滤镜像。
--no-trunc: 不截断输出。
-q, --quiet: 仅显示镜像的ID。
--viz: 以树状图的形式显示镜像的层级关系。
示例:
docker image ls -adocker image ls -q
4.获取与推送镜像
4.1 docker pull
功能:下载镜像,用于从镜像仓库中拉取一个镜像或仓库
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
参数说明:
- NAME: 镜像的名称。
- TAG: 镜像的标签,默认为 "latest"。
- DIGEST: 镜像的摘要。
OPTIONS说明:
-a, --all-tags: 拉取指定仓库的所有标签。
--disable-content-trust: 拉取时不验证镜像的真实性。
--filter: 根据条件过滤镜像。
--quiet, -q: 静默模式,不显示详细输出。
示例
# 拉取最新标签的镜像
docker pull ubuntu# 拉取指定标签的镜像
docker pull ubuntu:18.01# 拉取指定仓库的所有标签的镜像
docker pull -a ubuntu
拉取镜像之前,确保你已经登录到 Docker Hub 或者私有仓库,如果你想要拉取私有镜像,需要先使用 docker login 命令登录到相应的仓库,拉取镜像是一个网络操作,可能需要一些时间,特别是对于较大的镜像。
4.2 docker push
功能:将本地的镜像上传到镜像仓库
该命令用于将本地的镜像上传到镜像仓库中。这通常是在 Docker Hub 或者其他私有的 Docker 仓库中进行操作。
docker push [OPTIONS] NAME[:TAG]
参数说明:
- NAME: 镜像的名称。
- TAG: 镜像的标签,默认为 "latest"。
OPTIONS说明:
-a, --all-tags:推送指定仓库的所有标签。
--disable-content-trust:关闭对推送镜像的数字签名。
示例:
# 推送最新标签的镜像
docker push username/repository:latest# 推送指定标签的镜像
docker push username/repository:tagname
在推送镜像之前,确保你已经登录到目标仓库。可以使用 docker login 命令进行登录,镜像名称通常包括用户名和仓库名,格式为 username/repository。
5. 删除镜像
5.1 docker rmi
功能:用于删除一个或多个本地的镜像
docker rmi [OPTIONS] IMAGE [IMAGE...]
参数说明:
- IMAGE: 要删除的镜像的名称或ID
OPTIONS说明:
-f, --force: 强制删除镜像,即使该镜像被容器引用。
--no-prune: 不自动清理未使用的父镜像。
-q, --quiet: 静默模式,不显示删除的镜像ID。
示例:
# 删除单个
docker rmi 镜像ID# 删除多个
docker rmi 镜像名1:TAG 镜像名2:TAG# 删除全部
docker rmi $(docker images -qa)# 强制删除
docker rmi -f username/repository:tagname
不能删除正在运行的容器所使用的镜像。如果需要删除这样的镜像,你首先需要停止并删除使用该镜像的所有容器。除非你用强制删除。删除镜像之后,任何基于该镜像创建的容器都将无法正常工作,除非你重新拉取或构建该镜像
5.2 docker image rm
功能:docker image rm 是 docker rmi 命令的旧称,用于删除一个或多个本地的 Docker 镜像。从 Docker 1.25 版本开始,推荐使用 docker rmi 命令来替代 docker image rm。
docker image rm [OPTIONS] IMAGE [IMAGE...]
参数说明:
- IMAGE: 要删除的镜像的名称或ID。
OPTIONS说明:
-f, --force: 强制删除镜像,即使该镜像被容器引用。
--no-prune: 不自动清理未使用的父镜像。
示例:
# 删除指定的镜像
docker image rm username/repository:tagname# 强制删除镜像,即使它正在被容器使用
docker image rm -f username/repository:tagname# 删除多个
docker image rm username/repository:tag1 username/repository:tag2
尽管 docker image rm 仍然可以使用,但是既然Docker更新了,我们就使用 docker rmi 命令。和官方保存一致。
6.镜像TAG
6.1 docker tag
功能:标记本地镜像,将其归入某一仓库
该命令用于给本地的镜像打上一个标签,通常用于准备将镜像推送到镜像仓库
docker tag [OPTIONS] IMAGE [IMAGE...] [REGISTRY_HOST/][USERNAME/]NAME:TAG
参数说明:
- IMAGE: 要打标签的镜像的名称或ID。
- REGISTRY_HOST: 镜像仓库的地址,例如 Docker Hub 的地址是
docker.io
。 - USERNAME: 用户名,如果你在私有仓库中推送镜像,需要指定用户名。
- NAME: 镜像的名称。
- TAG: 镜像的标签,通常用于指定镜像的版本。
OPTIONS说明:
-f, --force: 覆盖现有的标签。
示例:
#将镜像ubuntu:15.10标记为 runoob/ubuntu:v3 镜像
docker tag ubuntu:15.10 runoob/ubuntu:v3 # 给镜像打上标签并指定仓库地址
docker tag existing-image registry.example.com/username/new-image:tag# 覆盖现有的标签
docker tag -f existing-image new-image:tag
我们可以给同一个镜像打上多个标签,方便管理和分发,标签分类可以使我们更好的管理镜像。
6.2 docker image tag
功能:docker tag 的别名。
docker image tag 是 docker tag 命令的另一种说法,两者完全相同,用于给本地的 Docker 镜像打上一个新的标签(tag)。这通常是为了准备将镜像推送到远程仓库,或者是为了在本地更好地组织和管理镜像
docker image tag [OPTIONS] IMAGE [IMAGE...] [REGISTRY_HOST/][USERNAME/]NAME:TAG
参数说明:
- IMAGE: 要打标签的镜像的名称或ID。
- REGISTRY_HOST: 镜像仓库的地址,例如 Docker Hub 的地址是
docker.io
。 - USERNAME: 用户名,如果你在私有仓库中推送镜像,需要指定用户名。
- NAME: 镜像的名称。
- TAG: 镜像的标签,通常用于指定镜像的版本。
OPTIONS说明:
-f, --force: 覆盖现有的标签。
示例:
docker image tag existing-image new-image:tagdocker image tag existing-image registry.example.com/username/new-image:tagdocker image tag -f existing-image new-image:tag
7. 搜索镜像
7.1 docker search
功能:搜索仓库中的镜像,相当于在百度网页中搜索,查询网站 https://hub.docker.com,该命令用于在 Docker Hub 上搜索镜像。你可以使用关键词来搜索,也可以通过其他参数来过滤搜索结果。
表头说明:
- NAME:镜像名称
- DESCRIPTION:镜像说明
- STARS:点赞数量
- OFFICIAL:是否是官方的
- AUTOMATED是否是自动构建的
操作命令:
docker search [OPTIONS] TERM
参数说明:
- TERM: 搜索的关键词。
OPTIONS说明:
--automated: 只显示自动构建的镜像。
--filter "KEY=VALUE": 根据指定的参数过滤结果。
--no-trunc: 不截断输出。
-s, --stars: 只显示评价大于指定数字的镜像。
--limt, --filter: 设置返回结果的数量。
示例:
# 搜索关键词为 "ubuntu" 的镜像
docker search ubuntu# 搜索出Stars大于3000的
docker search mysql --filter=STARS=3000 # 只列出N个镜像,默认5个
docker search --limit 5 redis# 搜索自动构建的镜像
docker search --automated
8.导入/导出镜像
8.1 docker import
功能:从归档文件中创建镜像
该命令用于从一个 tar 文件或 URL 导入容器快照,从而创建一个新的 Docker 镜像。与 docker load 不同,docker import 可以从容器快照中创建新的镜像,而不需要保留镜像的历史和元数据。
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
参数说明:
- file|URL|-: 输入文件的路径、本地文件或 URL,或者使用
-
从标准输入读取。 - REPOSITORY[:TAG]: (可选)为导入的镜像指定仓库和标签。
OPTIONS说明:
-c, --changes:在导入镜像时,对Dockerfile进行修改。
-m, --message:设置导入镜像的提交信息。
-u, --author:设置导入镜像的作者。
示例:
# 从本地 tar 文件导入镜像
docker import mycontainer.tar mynewimage:latest# 从 URL 导入镜像
docker import http://example.com/mycontainer.tar mynewimage:latest# 从标准输入导入镜像
cat mycontainer.tar | docker import - mynewimage:latest# 在导入过程中应用变更
docker import -c "ENV LANG=en_US.UTF-8" -c "CMD /bin/bash" mycontainer.tar mynewimage:latest
docker import 创建的镜像不会保留原始镜像的历史和元数据。使用 -c 选项可以在导入过程中应用 Dockerfile 指令,从而自定义新镜像的配置。导入的 tar 文件必须是使用 docker export 创建的容器快照,或者是兼容的其他格式,
8.2 docker load
功能:命令用于从 tar 归档文件加载一个镜像或一组镜像到本地 Docker 镜像库中。这通常用于备份镜像或在不同主机之间迁移镜像
docker load [OPTIONS]
OPTIONS说明:
-i, --input="": 指定输入文件,通常是一个 tar 文件,包含镜像数据。
-q, --quiet: 静默模式,不显示加载过程的详细信息。
示例:
# 从标准输入加载镜像
cat myimage.tar | docker load# 从指定文件加载镜像
docker load --input myimage.tar# 静默模式下加载镜像
docker load --input myimage.tar --quiet
注意事项
- 使用 docker load 命令加载的镜像保留了其历史和元数据。
- 可以使用 docker save 命令将镜像保存为 tar 文件,然后使用 docker load 命令加载。
- 确保 tar 文件是有效的 Docker 镜像存档,否则加载过程可能会失败。
与 docker import 的区别
8.3 docker save
功能: 将指定镜像保存成 tar 归档文件,该命令用于将一个或多个本地镜像保存到一个 tar 归档文件中。这通常用于备份镜像或在不同主机之间迁移镜像。
docker save [OPTIONS] IMAGE [IMAGE...]
参数说明:
- IMAGE: 要保存的镜像的名称或ID。
OPTIONS说明:
-o, --output="": 指定输出文件的名称,如果不指定,输出将被发送到标准输出。
示例:
# 将镜像 runoob/ubuntu:v3 生成 my_ubuntu_v3.tar 文档
docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3# 将mysql:5.7镜像打包归档
docker save -o /home/docker/mysql5.7.tar mysql:5.7# 将镜像保存到标准输出
docker save myimage:latest > myimage.tar#将镜像保存到指定文件
docker save -o myimage.tar myimage:latest# 保存多个镜像到同一个文件
docker save -o myimages.tar myimage1:latest myimage2:latest
注意事项
- 使用
docker save
命令保存的镜像包含了其历史和元数据。 - 保存的 tar 文件可以用于
docker load
命令来加载镜像。 - 保存大型镜像或多个镜像可能会生成非常大的 tar 文件,这可能会占用大量的磁盘空间。
与 docker export
的区别
9. 查看镜像信息
9.1 docker inspect
功能:显示一个容器或镜像的元数据,该命令用于获取有关 Docker 对象(容器、镜像、网络或卷)的详细信息。这个命令对于调试和获取对象的配置非常有用。
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
参数说明:
- NAME|ID: 要检查的容器、镜像、网络或卷的名称或ID。
OPTIONS说明:
-f, --format:格式化输出,使用Go模板格式化。
-s, --size:显示总大小。
--type:返回给定类型的信息("container"或"image")
示例:
# 获取容器的详细信息
docker inspect mycontainer# 以 JSON 格式获取镜像的详细信息
docker inspect myimage:latest# 格式化输出容器的 IP 地址
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mycontainer# 获取容器的总大小
docker inspect -s mycontainer
输出默认为 JSON 格式,除非使用 --format
选项进行格式化,可以使用 --format
选项来定制输出,例如提取特定的字段或属性,如果需要检查多个对象,可以一次性传递多个名称或ID。
9.2 docker image inspect
功能:docker inspect 的别名,用于获取有关 Docker 镜像的详细信息,包括镜像的配置、层级结构、标签等。这个命令对于调试和获取镜像的配置非常有用
docker image inspect [OPTIONS] IMAGE [IMAGE...]
参数说明:
- IMAGE: 要检查的镜像的名称或ID。
OPTIONS说明:
-f, --format="": 用于格式化输出的模板。
-s, --size: 显示总大小。
--verbose: 显示详细的输出。
示例:
# 获取镜像的详细信息
docker image inspect myimage:latest# 格式化输出镜像的标签
docker image inspect --format='{{.Config.Labels}}' myimage:latest# 获取镜像的总大小
docker image inspect -s myimage:latest# 显示详细的输出
docker image inspect --verbose myimage:latest
10.清理镜像
10.1 docker image prune
功能:命令用于删除所有悬空(dangling)的镜像。悬空镜像是指那些没有被任何容器引用的镜像,通常是因为使用了 docker build
构建新镜像后,旧的中间层镜像不再需要了
docker image prune [OPTIONS]
OPTIONS说明:
-a, --all: 删除所有镜像,不仅仅是悬空的。
-f, --force: 强制删除,不进行确认提示。
-filter: 提供过滤器条件来删除指定的镜像。
示例:
# 删除所有悬空镜像
docker image prune# 强制删除所有悬空镜像,不进行确认提示
docker image prune -f# 删除所有镜像 这将删除所有镜像,不仅仅是悬空的
docker image prune -a# 使用过滤条件删除镜像
docker image prune --filter "label=<key>=<value>"
使用 -a 选项时要非常小心,因为它会删除所有镜像,包括那些正在被使用的镜像,在执行 docker image prune 之前,建议先运行 docker images 命令查看哪些镜像是悬空的。定期清理悬空镜像可以帮助释放磁盘空间
10.2 docker system prune
功能:用于清理 Docker 系统,删除悬空(dangling)的镜像,同时也删除悬空的容器、网络和卷。这个命令是快速清理未使用资源的便捷方式
docker system prune [OPTIONS]
OPTIONS说明:
-a, --all: 删除所有停止的容器(不只是悬空的)。
-f, --force: 强制删除,不进行确认提示。
-volumes: 也删除悬空的卷。
-filter: 提供过滤条件来删除指定的资源。
示例:
# 删除所有悬空的镜像、容器、网络和卷
docker system prune# 强制删除所有悬空的资源,不进行确认提示
docker system prune -f# 删除所有停止的容器 不只是悬空的
docker system prune -a# 删除所有资源,包括悬空的卷
docker system prune --volumes# 使用过滤条件删除资源
docker system prune --filter "until=24h"
11.签名镜像
11.1 docker trust
功能:是 Docker Engine 的一个特性,它允许你对 Docker 镜像进行数字签名和验证。这样,你可以确保镜像的完整性和来源的真实性。使用 docker trust 命令,你可以签署镜像,查看签署的镜像信息,以及撤销对镜像的签名。
操作步骤:
# 生成签名密钥 这将生成一个密钥对,用于签署镜像。私钥应该妥善保管,公钥可以分享到 Docker 信任存储库
docker trust key generate <signer_name># 将公钥添加到 Docker 信任存储库 以便可以对镜像进行签名
docker trust signer add <signer_name> <repository_name># 对镜像进行签名 使用你的私钥对指定的镜像标签进行签名。签名后,你可以将签名的镜像推送到 Docker 信任存储库
docker trust sign <repository_name>:<tag># 查看镜像的签名信息
docker trust inspect <repository_name>:<tag># 撤销镜像的签名
docker trust revoke <repository_name>:<tag># 启用内容信任
export DOCKER_CONTENT_TRUST=1
请注意,docker trust 命令通常与 Docker 的内容信任(Content Trust)系统一起使用,该系统提供了一种机制来确保镜像的真实性和完整性
12.其他镜像命令
12.1 docker history
功能: 查看指定镜像的创建历史
该命令用于获取一个 Docker 镜像的构建历史和元数据。这个命令列出了用于创建镜像的每一层的元数据,包括每层的创建时间、作者、大小以及构建这一层所用的 Dockerfile 指令
docker history [OPTIONS] IMAGE
参数说明:
- IMAGE: 指定要查看历史的镜像名称或ID。
OPTIONS说明:
-H :以可读的格式打印镜像大小和日期,默认为true;--no-trunc :显示完整的提交记录;-q :仅列出提交记录ID。
示例:
# 查看镜像的历史
docker history myimage:latest# 仅显示每层的ID
docker history -q myimage:latest# 显示完整的提交信息
docker history --no-trunc myimage:latest
输出信息
- IMAGE ID: 镜像层的唯一ID。
- CREATED BY: 创建这一层的命令或Dockerfile指令。
- CREATED: 创建这一层的时间。
- SIZE: 这一层的大小。
- COMMENT: 构建过程中添加的注释(如果有)
13.最后
感谢大家,请大家多多支持!