五分钟学K8S系列<三> - docker镜像管理

2024-04-30 02:03:49 浏览数 (1)

Docker镜像是容器化技术中的核心,它们为容器提供了运行环境。在Docker的生态中,镜像管理是一个重要的环节。以下是Docker镜像管理的一些常用命令及其用法,以及一些实际案例。

图片图片

镜像命令概述

Docker提供了多种命令来管理镜像,根据使用频率和重要性,我们可以将它们分为三类:

基础命令

代码语言:javascript复制
ls:列出所有镜像。pull:从仓库拉取镜像。tag:为镜像设置新的标签。save:将镜像保存为tar文件。load:从tar文件加载镜像。rm:删除一个或多个镜像。

进阶命令

代码语言:javascript复制
inspect:查看镜像详细信息。prune:清理未使用的镜像。import:从tar文件导入镜像。

高级命令

代码语言:javascript复制
build:根据Dockerfile构建镜像。history:查看镜像的构建历史。push:将镜像推送到远程仓库。

详细命令介绍

查看镜像列表

使用docker image ls命令可以查看系统中的镜像列表。加上-q参数可以只显示镜像ID,而-a参数可以显示所有镜像,包括中间镜像。

# 查看所有镜像

代码语言:javascript复制
# 查看所有镜像 docker image lsREPOSITORY   TAG       IMAGE ID       CREATED         SIZEbusybox      latest    ba5dc23f65d4   11 months ago   4.26MB
代码语言:javascript复制
# 仅显示镜像ID# 仅显示镜像ID
代码语言:javascript复制
# 仅显示镜像IDdocker image ls -qba5dc23f65d4
代码语言:javascript复制
# 查看所有镜像,包括中间镜像
代码语言:javascript复制
# 查看所有镜像,包括中间镜像docker image ls -aREPOSITORY   TAG       IMAGE ID       CREATED         SIZEbusybox      latest    ba5dc23f65d4   11 months ago   4.26MB

拉取镜像

使用docker image pull命令可以从Docker Hub或其他仓库拉取镜像。如果不指定标签,将默认拉取latest标签的镜像。

# 拉取最新版的busybox镜像

代码语言:javascript复制
# 拉取最新版的busybox镜像docker image pull busyboxUsing default tag: latestlatest: Pulling from library/busyboxDigest: sha256:c3839dd800b9eb7603340509769c43e146a74c63dca3045a8e7dc8ee07e53966Status: Image is up to date for busybox:latestdocker.io/library/busybox:latest
代码语言:javascript复制
# 拉取最新版的busybox镜像
代码语言:javascript复制
# 拉取特定版本的mysql镜像docker image pull mysql:8.08.0: Pulling from library/mysqlbd37f6d99203: Pull complete d2433cba0951: Pull complete 13702d9fe3c3: Pull complete 83bcc87284a1: Pull complete c38d8660e1fa: Pull complete 7e1bc321f421: Pull complete bddd54b9c549: Pull complete 4eaae1e844ac: Pull complete 5196e1e87d8f: Pull complete 6586d096303c: Pull complete cf55ff1c80af: Pull complete Digest: sha256:a532724022429812ec797c285c1b540a644c15e248579c6bfdf12a8fbaab4964Status: Downloaded newer image for mysql:8.0docker.io/library/mysql:8.0
代码语言:javascript复制
# 拉取镜像并隐藏过程信息
代码语言:javascript复制
# 拉取镜像并隐藏过程信息docker image pull -q nginx:1.20.1docker.io/library/nginx:1.20.1

为镜像设置别名

使用docker image tag命令可以为镜像设置一个新的标签,这在创建自定义镜像时非常有用。

# 为alpine镜像设置新的标签

代码语言:javascript复制
# 为alpine镜像设置新的标签docker image tag busybox sre-busybox
代码语言:javascript复制
# 为mysql镜像设置新的标签和版本
代码语言:javascript复制
# 为mysql镜像设置新的标签和版本docker image tag mysql:8.0 sre-mysql:learn_v1.0docker images -a | grep mysqlmysql         8.0          f5f171121fa3   4 weeks ago     603MBsre-mysql     learn_v1.0   f5f171121fa3   4 weeks ago     603MB

导出和导入镜像

docker image save命令可以将镜像导出为tar文件,而docker image load命令可以从tar文件中导入镜像。这两种操作常用于镜像的备份和迁移。

# 将镜像导出为tar文件

代码语言:javascript复制
# 将镜像导出为tar文件docker image save -o "sre-docker-mysql8.0.tar.gz" sre-mysql:learn_v1.0ls sre-docker-mysql8.0.tar.gz sre-docker-mysql8.0.tar.gz
代码语言:javascript复制
# 从tar文件加载镜像
代码语言:javascript复制
# 从tar文件加载镜像docker image load -i sre-docker-mysql8.0.tar.gz Loaded image: sre-mysql:learn_v1.0

删除镜像

使用docker image rm命令可以删除一个或多个镜像。如果镜像正被使用,可以加上-f参数强制删除。

# 删除一个镜像

代码语言:javascript复制
# 删除一个镜像docker image rm sre-busyboxUntagged: sre-busybox:latest
docker image ls -a | grep  busybusybox      latest       ba5dc23f65d4   11 months ago   4.26MB
代码语言:javascript复制
# 强制删除一个镜像
代码语言:javascript复制
# 强制删除一个镜像docker image rm -f sre-mysql:learn_v1.0Untagged: sre-mysql:learn_v1.0

查看镜像详细信息

docker image inspect命令可以查看镜像的详细信息,包括配置、环境变量等。使用-f参数可以格式化输出,只显示特定部分的信息。

# 查看镜像详细信息

代码语言:javascript复制
# 查看镜像详细信息docker image inspect sre-mysql:learn_v1.0会返回一个 JSON 格式的输出,其中包含了关于镜像的大量元数据。以下是一些常见的信息字段及其简介:
Id: 镜像的唯一标识符(镜像 ID)。
RepoTags: 镜像的仓库名称、标签等信息,例如 sre-mysql:learn_v1.0。
RepoDigests: 镜像的摘要标签,提供了镜像内容的校验和,用于确保拉取的是正确的镜像。
Parent: 父镜像的 ID,表示该镜像可能是基于另一个镜像构建的。
Comment: 构建镜像时的注释信息。
Created: 镜像创建的时间。
Container: 使用该镜像运行的容器的默认名称。
DockerVersion: 构建镜像时使用的 Docker 版本。
Author: 镜像的作者。
Config: 容器运行时的配置,包括环境变量、命令、端口映射等。
Architecture: 镜像支持的系统架构,如 amd64。
Os: 镜像运行的操作系统类型。
Size: 镜像的大小。
VirtualSize: 镜像及其所有层的虚拟大小。
User: 镜像内部的默认用户。
Labels: 为镜像设置的标签,通常用于存储元数据。
History: 镜像构建过程中的每一层操作的简要描述。
RootFS: 描述了镜像的文件系统层。
GraphDriver: 用于存储镜像层的存储驱动类型,如 overlay2。Layers: 镜像由哪些层组成,每一层都有一个唯一的 ID。
代码语言:javascript复制
# 查看镜像的启动命令
代码语言:javascript复制
# 查看镜像的启动命令docker image inspect -f "{{.Config.Cmd}}"  sre-mysql:learn_v1.0[mysqld]
代码语言:javascript复制
# 查看镜像的环境变量
代码语言:javascript复制
# 查看镜像的环境变量docker image inspect -f "{{.Config.Env}}"  sre-mysql:learn_v1.0[PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin GOSU_VERSION=1.17 MYSQL_MAJOR=8.0 MYSQL_VERSION=8.0.36-1.el8 MYSQL_SHELL_VERSION=8.0.36-1.el8]

清理未使用的镜像

docker image prune命令可以清理所有未使用的镜像,释放空间。加上-f参数可以自动执行,不显示提示信息。

# 清理未使用的镜像

代码语言:javascript复制
# 清理未使用的镜像docker image pruneWARNING! This will remove all dangling images.Are you sure you want to continue? [y/N] yTotal reclaimed space: 0B
代码语言:javascript复制
# 强制清理,不显示提示信息
代码语言:javascript复制
# 强制清理,不显示提示信息docker image prune -fTotal reclaimed space: 0B

导入文件系统镜像

docker image import命令可以从tar文件导入镜像的文件系统。请注意,这样导入的镜像不会包含启动命令,因此不能直接用于创建容器。

# 从tar文件导入镜像文件系统

代码语言:javascript复制
# 从tar文件导入镜像文件系统docker image import sre-docker-mysql8.0.tar.gz sha256:c274242c2e88edd37ce999ddf0b07f75a86dc5a0eb5dc14c99d87e7a6395895f

案例介绍

在软件开发和运维中,容器化技术如 Docker 为应用部署提供了极大的便利。假设我们需要为一个项目创建一个自定义的Docker镜像,并且需要在多台机器上部署。以下是可能的步骤:(关于dockerfile将在下个篇章进行介绍,这里可以先混个脸熟)

1. 编写 Dockerfile

    首先,我们需要定义一个 Dockerfile 来构建我们的镜像。Dockerfile 是一个文本文件,包含了一系列的指令和参数,Docker 会根据这些指令一步步构建镜像。

代码语言:javascript复制
# 使用官方的 Ubuntu 20.04 镜像作为基础镜像FROM ubuntu:20.04
# 更新包索引并安装 NginxRUN apt-get update && apt-get install -y nginx
# 将本地的 Nginx 配置文件复制到镜像中的配置目录COPY ./my-site.conf /etc/nginx/conf.d/default.conf
# 设置容器启动时执行的命令,这里启动 Nginx 服务CMD ["nginx", "-g", "daemon off;"]
2. 构建镜像

    使用 docker build 命令根据 Dockerfile 构建镜像。-t 参数允许我们为镜像指定一个标签, -f 参数来指定 Dockerfile 的路径

代码语言:javascript复制
docker build -t sre-nginx -f demo_1.dockerfile .[ ] Building 118.7s (8/8) FINISHED                                            docker:default => [internal] load build definition from demo_1.dockerfile                             0.0s => => transferring dockerfile: 197B                                                    0.0s => [internal] load metadata for docker.io/library/ubuntu:20.04                         1.1s => [internal] load .dockerignore                                                       0.0s => => transferring context: 2B                                                         0.0s => [1/3] FROM docker.io/library/ubuntu:20.04@sha256:21ae67bf44d1d0a53ecdce48742c766e  24.4s => => resolve docker.io/library/ubuntu:20.04@sha256:21ae67bf44d1d0a53ecdce48742c766e4  0.0s => => sha256:cc61ae337f89ec395bf1d0b13c6f58ee834e3fc57b0de67694302bb63729 424B / 424B  0.0s => => sha256:b2c9e106c9d9e28be2a5b7177b6079722213e2f76f15033f96146880 2.30kB / 2.30kB  0.0s => => sha256:4477f8fe99ebfd23fa06d28a2fa42eaa05d726926afc0a055e1ff 27.51MB / 27.51MB  22.2s => => sha256:21ae67bf44d1d0a53ecdce48742c766e44aea4d16e18a3b88a3888ed 1.13kB / 1.13kB  0.0s => => extracting sha256:4477f8fe99ebfd23fa06d28a2fa42eaa05d726926afc0a055e1ff2b612b7a  2.0s => [internal] load build context                                                       0.0s => => transferring context: 328B                                                       0.0s => [2/3] RUN apt-get update && apt-get install -y nginx                               92.6s => [3/3] COPY ./my-site.conf /etc/nginx/conf.d/default.conf                            0.1s  => exporting to image                                                                  0.4s  => => exporting layers                                                                 0.4s  => => writing image sha256:c25f7e944dc3fcc28440fbc987d2dd5c05b4a9b106b7096f3460946ba4  0.0s  => => naming to docker.io/library/sre-nginx                                            0.0s
3. 导出镜像

    将构建好的镜像导出为 tar 文件,以便于迁移或备份。

代码语言:javascript复制
docker image save -o sre-nginx.tar.gz sre-nginxls sre-nginx.tar.gz sre-nginx.tar.gz
4. 在其他机器上导入镜像

    在目标机器上,使用 docker image load 命令加载 tar 文件中的镜像。

代码语言:javascript复制
docker image load -i sre-nginx.tar.gzLoaded image: sre-nginx:latest
5. 运行容器

    最后,使用 docker run 命令运行容器。-d 参数使容器在后台运行,-p 参数将容器的 80 端口映射到宿主机的同一端口。

代码语言:javascript复制
docker run -d -p 8081:80 sre-nginx9f60ba3749abe5463b3c3296c8a19d5c8f5c3fa49be10c711aeddf7f69b8ba88docker psCONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                                   NAMES9f60ba3749ab   sre-nginx   "nginx -g 'daemon of nginx   13 seconds ago   Up 11 seconds   0.0.0.0:8081->80/tcp, :::8081->80/tcp   upbeat_leavitt
通过上述步骤,我们可以在不同的机器上部署相同的服务,确保环境的一致性。

小结

    在本文中,我们深入探讨了Docker镜像管理的各个方面。从基础的镜像操作命令,如lspulltagsaveloadrm,到更高级的inspectpruneimport,我们了解了如何高效地管理Docker镜像。

    通过具体的命令示例和实际案例,我们展示了如何创建、操作、导出、导入和清理Docker镜像,以及如何通过Dockerfile构建自定义镜像并部署服务。掌握镜像管理对于任何希望利用Docker提高开发、测试和部署效率的SRE来说都是至关重要的。镜像管理不仅涉及到容器化应用的打包和分发,还关系到资源的有效利用和环境的一致性。

下篇章预告

    随着对Docker镜像管理的深入了解,我们为下一篇章做好了准备。在接下来的内容中,我们将转向Docker的容器管理。容器是Docker生态系统中的执行单元,它们基于镜像启动并运行应用。容器管理包括容器的创建、运行、停止、删除以及状态检查等多个方面。

我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

0 人点赞