R / Richie全部文章 ↑

Linux · 2 分钟阅读

03. 使用 Docker 镜像

拉取

# 完整语法
docker pull [options] [registry[:port]/]repo[:tag]

# 拉官方镜像
docker pull nginx:1.27

# 拉私有仓库
docker pull registry.example.com/team/app:1.0

不写 tag 默认 latest。生产环境永远写明版本。

启动容器

# 临时进 shell
docker run -it --rm ubuntu:24.04 bash

# 后台运行
docker run -d --name web -p 8080:80 nginx:1.27
参数 含义
-i 保持 stdin
-t 分配 tty
--rm 退出后自动删容器
-d 后台运行
--name 容器名
-p 端口映射

镜像管理

列表与过滤

docker image ls
docker image ls -a                  # 包含中间层
docker image ls -f since=nginx:1.27
docker image ls -f dangling=true    # 虚悬镜像
docker image ls -f label=stage=build

体积

docker image ls 显示的是本地展开大小(各层之和),而 Docker Hub 上看到的是压缩体积。镜像之间的层可以复用,所以多镜像实际占盘远小于 du 加总。

docker system df        # 总体占用
docker system df -v     # 详细

清理

docker image prune                  # 清 dangling
docker image prune -a               # 清未用
docker image rm <id>

格式化输出

# 简洁 ID + 仓库
docker image ls --format "{{.ID}}: {{.Repository}}:{{.Tag}}"

# 表格自定列
docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}\t{{.Size}}"

删除镜像

# 三种指定方式
docker image rm 502ad9a3d65a              # 短 ID
docker image rm nginx:1.27                # 仓库 + 标签
docker image rm nginx@sha256:b4f0e0b...  # 摘要

当镜像被容器引用时,rm 失败。要么先 docker rm 容器,要么加 -f。

删除行为

Untagged 只是移除标签;Deleted 才真正删除镜像层。只要还有任意标签或被某层引用,层就不会真删。

# 批量删某仓库
docker image rm $(docker image ls -q redis)

# 删所有 mongo:3.2 之前的
docker image rm $(docker image ls -q -f before=mongo:3.2)

一些经验

  • 镜像 tag latest 不一定最新,是"默认 tag"——别迷信
  • 镜像体积能小则小:多阶段构建、--no-install-recommends、清理包缓存
  • CI/CD 里的镜像 digest 比 tag 更稳

参考