玩转Docker镜像完全指南
一、镜像基础概念
镜像是Docker最核心的概念之一,自诞生以来就是开发者们讨论的热点。简单来说,要运行Docker容器,你的电脑里必须提前准备好对应的镜像文件。如果本地不存在,Docker会自动从网上的公共仓库(默认是Docker Hub)帮你下载,当然你也可以设置成从其他私人仓库获取。
本章我们就来手把手教你玩转镜像:从最基本的如何用下载命令获取镜像,到查看电脑里已经有的镜像和它们的版本标签;教你如何在镜像超市里精准搜索想要的镜像,删除不需要的旧镜像;还会教你怎么定制专属镜像、把镜像打包保存,最后还会教你如何把自己的作品上传到Docker Hub和别人分享。
二、镜像操作全流程
2.1 镜像获取
既然镜像是Docker的核心,那么首先需要先获取镜像,官方的Docker Hub网站目前提供了大量常用及不常用的镜像供各位下载,接下来详细介绍拉取镜像的pull命令
docker pull 命令直接从Docker Hub拉取镜像(如果配置了加速地址,Docker会将请求的镜像优先从镜像加速器(如阿里云、腾讯云等)拉取,若加速器中不存在,则回源到 Docker Hub。)
基础拉取命令
# 标准格式(推荐显式声明版本)
docker pull [仓库名]:[标签]
# 实战案例:拉取MySQL 8.0.35
docker pull mysql:8.0.35
如果没有版本号,则默认拉取仓库中的latest(最新版本)镜像,即
docker pull mysql 等价于 docker pull mysql:latest
笔者建议各位始终优先使用显式标签,避免依赖默认的 latest,因为latest不是固定的版本,后期使用容易产生版本冲突。
docker pull命令默认从官方仓库拉取镜像,如果需要从第三方仓库拉取镜像,则需要在镜像前加上完整的仓库地址,例如:
docker pull hub.c.163.com/public/mysql:8.0.11
镜像加速配置
- 创建/修改配置文件
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://{your_id}.mirror.aliyuncs.com"]
}
EOF
这里推荐使用阿里云的镜像加速地址,具体地址可登录阿里云官方控制台查询获取,也可以使用其它第三方加速地址
- 重启服务生效
sudo systemctl daemon-reload
sudo systemctl restart docker
2.2 镜像查看
列表查看
docker images
# 或
docker image ls
# 格式化输出
docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}\t{{.Size}}"
详细信息查看
# 查看元数据
docker inspect mysql:8.0.35
# 查看构建历史
docker history mysql:8.0.35
2.3 镜像搜索
# 基础搜索
docker search httpd
# 过滤官方镜像
docker search --filter "is-official=true" nginx
2.4 镜像删除
删除镜像的方式有很多种,常用的为docker rmi命令,以清除mysql镜像为例
docker rmi [-f] mysql:8.0.11
-f:可选(不管有无容器依赖,强制删除,慎用,如果有容器依赖,应该先删除对应的依赖再删除镜像)
上面的命令是根据镜像标签来删除,当然也可以根据镜像id来删除
docker rmi 5dbe5b6313e1
一般也用docker image prune命令来清理临时镜像文件或未被使用的镜像文件来清理磁盘存储空间
# 按标签删除
docker rmi mysql:8.0.35
# 按ID删除
docker rmi a4f32d8540a4
# 清理悬空镜像
docker image prune
三、镜像高阶操作
3.1 镜像创建
镜像创建的方式主要有一下几种方式,其中dockefile因其可塑性和扩展性成为主流。
3.1.1. Dockerfile构建(推荐方式)
核心原理
通过声明式文本文件定义镜像构建流程,支持版本控制与自动化构建
操作步骤
#### 创建Dockerfile
FROM alpine:3.18
RUN apk add --no-cache python3
COPY app.py /app/
CMD ["python3", "/app/app.py"]
#### 执行构建命令
docker build -t myapp:v1.0 .
优势特点
- 支持分层构建和缓存机制
- 构建过程可追溯可复用
- 适合CI/CD流水线集成
3.1.2. 容器commit创建
适用场景
快速保存容器当前状态为镜像(适合临时调试)
操作流程
#### 启动临时容器
docker run -it --name temp_container alpine:3.18 sh
#### 在容器内执行修改
/apk add --no-cache curl
#### 退出后提交为新镜像
docker commit -m "Added curl" temp_container myalpine:with-curl
注意事项
- 无法追溯变更历史
- 无法追溯变更历史
- 不建议生产环境使用
3.1.3. 镜像导入导出
离线迁移方案
# 导出镜像为tar包
docker save -o myapp.tar myapp:v1.0
# 导入本地镜像
docker load -i myapp.tar
与export区别
| 操作对象 | 命令 | 包含内容 |
|---|---|---|
| 镜像 | save | 完整镜像及标签 |
| 容器 | export | 仅容器文件系统 |
3.1.4. 多阶段构建(高级技巧)
Dockerfile示例
# 构建阶段
FROM golang:1.21 as builder
WORKDIR /app
COPY . .
RUN go build -o myapp .
# 运行阶段
FROM alpine:3.18
COPY --from=builder /app/myapp .
CMD ["./myapp"]
核心优势
- 大幅减小最终镜像体积
- 隔离构建环境和运行环境
- 保护敏感构建信息
建议
1. 优先采用多阶段构建方案
2. 生产镜像必须经过漏洞扫描
3. 使用.dockerignore过滤无用文件
4. 镜像标签遵循[名称]:[版本]-[环境]格式
5. 定期清理旧镜像:docker image prune -a
3.2 镜像发布
本地归档
# 打包镜像
docker save -o mypython.tar mypython:latest
# 加载镜像
docker load -i mypython.tar
推送到仓库
# 登录Docker Hub
docker login
# 标记镜像
docker tag mypython:latest username/mypython:v1.0
# 推送镜像
docker push username/mypython:v1.0
下期预告
《Docker容器的使用与常见问题(上)》将涵盖:
- 容器介绍
- 创建容器
- 终止容器和删除容器
- 进入容器
- 欢迎在评论区留言您遇到的典型问题,我们将选取典型问题进行专题讲解!
1517

被折叠的 条评论
为什么被折叠?



