Docker镜像是容器化技术中的核心,它们为容器提供了运行环境。在Docker的生态中,镜像管理是一个重要的环节。以下是Docker镜像管理的一些常用命令及其用法,以及一些实际案例。
Docker提供了多种命令来管理镜像,根据使用频率和重要性,我们可以将它们分为三类:
ls:列出所有镜像。pull:从仓库拉取镜像。tag:为镜像设置新的标签。save:将镜像保存为tar文件。load:从tar文件加载镜像。rm:删除一个或多个镜像。
inspect:查看镜像详细信息。prune:清理未使用的镜像。import:从tar文件导入镜像。
build:根据Dockerfile构建镜像。history:查看镜像的构建历史。push:将镜像推送到远程仓库。
详细命令介绍
使用docker image ls
命令可以查看系统中的镜像列表。加上-q
参数可以只显示镜像ID,而-a
参数可以显示所有镜像,包括中间镜像。
# 查看所有镜像
# 查看所有镜像 docker image lsREPOSITORY TAG IMAGE ID CREATED SIZEbusybox latest ba5dc23f65d4 11 months ago 4.26MB
# 仅显示镜像ID# 仅显示镜像ID
# 仅显示镜像IDdocker image ls -qba5dc23f65d4
# 查看所有镜像,包括中间镜像
# 查看所有镜像,包括中间镜像docker image ls -aREPOSITORY TAG IMAGE ID CREATED SIZEbusybox latest ba5dc23f65d4 11 months ago 4.26MB
使用docker image pull
命令可以从Docker Hub或其他仓库拉取镜像。如果不指定标签,将默认拉取latest
标签的镜像。
# 拉取最新版的busybox镜像
# 拉取最新版的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
# 拉取最新版的busybox镜像
# 拉取特定版本的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
# 拉取镜像并隐藏过程信息
# 拉取镜像并隐藏过程信息docker image pull -q nginx:1.20.1docker.io/library/nginx:1.20.1
使用docker image tag
命令可以为镜像设置一个新的标签,这在创建自定义镜像时非常有用。
# 为alpine镜像设置新的标签
# 为alpine镜像设置新的标签docker image tag busybox sre-busybox
# 为mysql镜像设置新的标签和版本
# 为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文件
# 将镜像导出为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
# 从tar文件加载镜像
# 从tar文件加载镜像docker image load -i sre-docker-mysql8.0.tar.gz Loaded image: sre-mysql:learn_v1.0
使用docker image rm
命令可以删除一个或多个镜像。如果镜像正被使用,可以加上-f
参数强制删除。
# 删除一个镜像
# 删除一个镜像docker image rm sre-busyboxUntagged: sre-busybox:latest
docker image ls -a | grep busybusybox latest ba5dc23f65d4 11 months ago 4.26MB
# 强制删除一个镜像
# 强制删除一个镜像docker image rm -f sre-mysql:learn_v1.0Untagged: sre-mysql:learn_v1.0
docker image inspect
命令可以查看镜像的详细信息,包括配置、环境变量等。使用-f
参数可以格式化输出,只显示特定部分的信息。
# 查看镜像详细信息
# 查看镜像详细信息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。
# 查看镜像的启动命令
# 查看镜像的启动命令docker image inspect -f "{{.Config.Cmd}}" sre-mysql:learn_v1.0[mysqld]
# 查看镜像的环境变量
# 查看镜像的环境变量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
参数可以自动执行,不显示提示信息。
# 清理未使用的镜像
# 清理未使用的镜像docker image pruneWARNING! This will remove all dangling images.Are you sure you want to continue? [y/N] yTotal reclaimed space: 0B
# 强制清理,不显示提示信息
# 强制清理,不显示提示信息docker image prune -fTotal reclaimed space: 0B
docker image import
命令可以从tar文件导入镜像的文件系统。请注意,这样导入的镜像不会包含启动命令,因此不能直接用于创建容器。
# 从tar文件导入镜像文件系统
# 从tar文件导入镜像文件系统docker image import sre-docker-mysql8.0.tar.gz sha256:c274242c2e88edd37ce999ddf0b07f75a86dc5a0eb5dc14c99d87e7a6395895f
在软件开发和运维中,容器化技术如 Docker 为应用部署提供了极大的便利。假设我们需要为一个项目创建一个自定义的Docker镜像,并且需要在多台机器上部署。以下是可能的步骤:(关于dockerfile将在下个篇章进行介绍,这里可以先混个脸熟)
首先,我们需要定义一个 Dockerfile 来构建我们的镜像。Dockerfile 是一个文本文件,包含了一系列的指令和参数,Docker 会根据这些指令一步步构建镜像。
# 使用官方的 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;"]
使用 docker build
命令根据 Dockerfile 构建镜像。-t
参数允许我们为镜像指定一个标签, -f
参数来指定 Dockerfile
的路径
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
将构建好的镜像导出为 tar 文件,以便于迁移或备份。
docker image save -o sre-nginx.tar.gz sre-nginxls sre-nginx.tar.gz sre-nginx.tar.gz
在目标机器上,使用 docker image load
命令加载 tar 文件中的镜像。
docker image load -i sre-nginx.tar.gzLoaded image: sre-nginx:latest
最后,使用 docker run
命令运行容器。-d
参数使容器在后台运行,-p
参数将容器的 80 端口映射到宿主机的同一端口。
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镜像管理的各个方面。从基础的镜像操作命令,如ls
、pull
、tag
、save
、load
和rm
,到更高级的inspect
、prune
和import
,我们了解了如何高效地管理Docker镜像。
通过具体的命令示例和实际案例,我们展示了如何创建、操作、导出、导入和清理Docker镜像,以及如何通过Dockerfile
构建自定义镜像并部署服务。掌握镜像管理对于任何希望利用Docker提高开发、测试和部署效率的SRE来说都是至关重要的。镜像管理不仅涉及到容器化应用的打包和分发,还关系到资源的有效利用和环境的一致性。
下篇章预告
随着对Docker镜像管理的深入了解,我们为下一篇章做好了准备。在接下来的内容中,我们将转向Docker的容器管理。容器是Docker生态系统中的执行单元,它们基于镜像启动并运行应用。容器管理包括容器的创建、运行、停止、删除以及状态检查等多个方面。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。