前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >五分钟学K8S系列<三> - docker镜像管理

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

原创
作者头像
五分钟学SRE
发布2024-04-30 02:03:49
1380
发布2024-04-30 02:03:49
举报
文章被收录于专栏:五分钟学K8S五分钟学K8S

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腾讯技术创作特训营最新征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 镜像命令概述
    • 基础命令
      • 进阶命令
        • 高级命令
          • 1. 编写 Dockerfile
          • 2. 构建镜像
          • 3. 导出镜像
          • 4. 在其他机器上导入镜像
          • 5. 运行容器
      • 查看镜像列表
      • 拉取镜像
      • 为镜像设置别名
      • 导出和导入镜像
      • 删除镜像
      • 查看镜像详细信息
      • 清理未使用的镜像
      • 导入文件系统镜像
      • 案例介绍
      • 小结
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档