Skip to content

Docker - 镜像

Docker 镜像(image) 是容器(container)的蓝图。它们是只读模板,包含应用程序运行所需的代码、库、依赖项、工具和其他文件。 容器 是镜像的可运行实例。

当你运行类似 docker run hello-world 的命令时:

  • docker:Docker 客户端命令。
  • run:用于创建和启动容器的命令。
  • hello-world:用作容器模板的镜像名称。如果在本地未找到此镜像,Docker 会尝试从配置的 镜像仓库(registry)(默认为 Docker Hub)下载(拉取,pull)它。

要查看当前存储在你本地机器上的 Docker 镜像列表,请使用 docker images 命令(或 docker image ls)。

docker images

输出显示每个镜像的信息:

  • REPOSITORY:镜像 仓库(repository)的名称(例如,ubuntu、nginx、yourusername/myapp)。
  • TAG:仓库中特定的 版本或变体标识符(例如,22.04、latest、1.0、stable-alpine)。如果省略,通常默认为 latest。
  • IMAGE ID:镜像的唯一标识符。
  • CREATED:镜像构建的时间。
  • SIZE:镜像占用的磁盘空间大小。

示例输出:

REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fbbc894d6882 7 months ago 13.3kB
ubuntu 22.04 a7be6190844e 2 weeks ago 77.8MB
nginx stable-alpine c7150a2f507e 3 days ago 23.5MB
my-apache-server 1.0 e4b1a9f8d2c1 5 minutes ago 198MB

虽然 docker run 在本地不存在镜像时会自动 拉取(pull)镜像,但你可以使用 docker pull 明确地下载镜像。

# 拉取 MySQL 镜像的特定版本 8.0
docker pull mysql:8.0

这会从镜像仓库(通常是 Docker Hub)下载镜像层并将其存储在本地。

要删除一个或多个本地镜像并释放磁盘空间,请使用 docker rmi 命令(或 docker image rm)。你可以通过镜像 ID 或 仓库:标签(repository:tag) 组合来引用镜像。

# 按仓库和标签删除 hello-world 镜像
docker rmi hello-world:latest
# 按 IMAGE ID 删除 ubuntu 镜像(使用前几个唯一的字符)
docker rmi a7be6190844e
# 删除多个镜像
docker rmi mysql:8.0 my-apache-server:1.0

注意:你不能删除当前被容器使用的镜像(即使是已停止的容器)。在删除镜像之前,你必须先删除容器(docker rm <container_id>)。可以使用 -f 标志(docker rmi -f <image>)来强制删除,但请谨慎使用。

要轻松删除未使用的镜像(悬空镜像 - dangling images,即没有标签的镜像,通常是构建后剩余的),请使用:

docker image prune

要删除所有未使用的镜像(不仅仅是悬空镜像):

docker image prune -a

要获取关于镜像的详细、底层信息(JSON 格式),包括其层、环境变量、暴露的端口和构建历史,请使用 docker inspect。

docker inspect nginx:stable-alpine

这对于理解镜像是如何构建和配置的很有用。

你可以为现有镜像创建额外的 标签(tag)。这通常在将镜像 推送到(push) 镜像仓库之前使用。

# 为本地镜像 'my-apache-server:1.0' 打上适合 Docker Hub 的新标签
docker tag my-apache-server:1.0 yourdockerhubusername/my-web-app:v1

现在,yourdockerhubusername/my-web-app:v1 指向与 my-apache-server:1.0 相同的镜像 ID。这并不会复制镜像数据。