Docker镜像管理
大约 5 分钟Docker指南Docker镜像
Docker镜像管理
什么是Docker镜像
Docker镜像是一个轻量级、独立、可执行的软件包,包含了运行某个软件所需的所有内容:代码、运行时环境、系统工具、系统库以及设置。镜像是Docker容器的基础,通过镜像可以创建容器。
镜像的分层结构
Docker镜像采用分层存储的架构,每一层都代表Dockerfile中的一条指令。这种分层结构有以下特点:
- 只读性:镜像层都是只读的,不能被修改
- 共享性:相同的镜像层可以在多个镜像之间共享
- 增量性:新的镜像层是在基础镜像层之上增加的
镜像基本操作
1. 查找镜像
# 从Docker Hub搜索镜像
docker search nginx
# 查看镜像详细信息
docker search --filter stars=100 nginx
2. 拉取镜像
# 拉取最新版本的镜像
docker pull nginx
# 拉取指定版本的镜像
docker pull nginx:1.21
# 拉取指定平台的镜像
docker pull --platform linux/amd64 nginx
3. 查看镜像
# 查看本地所有镜像
docker images
# 查看指定镜像的详细信息
docker inspect nginx
# 查看镜像的历史记录
docker history nginx
4. 删除镜像
# 删除指定镜像
docker rmi nginx
# 强制删除镜像
docker rmi -f nginx
# 删除所有未使用的镜像
docker image prune
# 删除所有镜像
docker rmi $(docker images -q)
5. 镜像标签管理
# 为镜像添加标签
docker tag nginx mynginx:v1.0
# 查看镜像标签
docker images nginx
镜像导入导出
1. 导出镜像
# 将镜像保存为tar文件
docker save -o nginx.tar nginx
# 导出多个镜像
docker save -o images.tar nginx mysql redis
2. 导入镜像
# 从tar文件加载镜像
docker load -i nginx.tar
# 从标准输入加载镜像
docker load < nginx.tar
3. 导出容器为镜像
# 将容器提交为新镜像
docker commit container_id myimage:v1.0
Dockerfile构建镜像
1. Dockerfile基础指令
# 指定基础镜像
FROM ubuntu:20.04
# 维护者信息
LABEL maintainer="example@example.com"
# 设置环境变量
ENV NODE_VERSION=14.15.0
# 复制文件
COPY . /app
# 添加文件(支持自动解压)
ADD app.tar.gz /app
# 设置工作目录
WORKDIR /app
# 运行命令
RUN apt-get update && apt-get install -y nodejs
# 暴露端口
EXPOSE 3000
# 设置卷
VOLUME ["/data"]
# 启动命令
CMD ["node", "app.js"]
2. 构建镜像
# 构建镜像
docker build -t myapp:v1.0 .
# 指定Dockerfile路径
docker build -f /path/to/Dockerfile -t myapp:v1.0 .
# 构建时传递参数
docker build --build-arg NODE_VERSION=16.0.0 -t myapp:v1.0 .
3. 多阶段构建
# 构建阶段
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 运行阶段
FROM node:14-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY package*.json ./
RUN npm install --production
EXPOSE 3000
CMD ["node", "dist/index.js"]
镜像优化技巧
1. 减少镜像层数
# 不推荐:多条RUN指令
RUN apt-get update
RUN apt-get install -y nginx
RUN rm -rf /var/lib/apt/lists/*
# 推荐:合并RUN指令
RUN apt-get update && \
apt-get install -y nginx && \
rm -rf /var/lib/apt/lists/*
2. 使用.dockerignore文件
创建.dockerignore
文件排除不必要的文件:
.git
node_modules
npm-debug.log
.DS_Store
README.md
3. 选择合适的基础镜像
# 不推荐:使用完整版系统镜像
FROM ubuntu:20.04
# 推荐:使用精简版镜像
FROM alpine:latest
# 或者使用官方应用镜像
FROM node:14-alpine
4. 多阶段构建优化
# 构建阶段
FROM golang:1.16 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .
# 运行阶段
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/main .
CMD ["./main"]
镜像安全最佳实践
1. 使用官方镜像
# 推荐使用官方镜像
FROM nginx:1.21-alpine
2. 定期更新基础镜像
# 定期拉取最新镜像
docker pull nginx:latest
3. 扫描镜像安全漏洞
# 使用Docker Scan扫描镜像
docker scan nginx
4. 以非root用户运行容器
# 创建非root用户
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
# 切换到非root用户
USER nextjs
镜像仓库管理
1. Docker Hub操作
# 登录Docker Hub
docker login
# 推送镜像到Docker Hub
docker tag myapp:v1.0 username/myapp:v1.0
docker push username/myapp:v1.0
# 从Docker Hub拉取镜像
docker pull username/myapp:v1.0
2. 私有仓库操作
# 登录私有仓库
docker login registry.example.com
# 推送镜像到私有仓库
docker tag myapp:v1.0 registry.example.com/myapp:v1.0
docker push registry.example.com/myapp:v1.0
常用镜像管理命令总结
命令 | 说明 |
---|---|
docker images | 查看本地镜像 |
docker pull | 拉取镜像 |
docker push | 推送镜像 |
docker rmi | 删除镜像 |
docker build | 构建镜像 |
docker tag | 添加镜像标签 |
docker save | 导出镜像 |
docker load | 导入镜像 |
docker commit | 从容器创建镜像 |
docker history | 查看镜像历史 |
docker inspect | 查看镜像详细信息 |
镜像管理最佳实践
1. 镜像版本管理
# 使用语义化版本号
docker tag myapp myapp:v1.0.0
# 使用Git commit ID作为版本
docker tag myapp myapp:$(git rev-parse --short HEAD)
2. 定期清理镜像
# 清理未使用的镜像
docker image prune -a
# 清理所有停止的容器
docker container prune
3. 镜像大小监控
# 查看镜像大小
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
# 查看镜像层信息
docker history nginx
总结
Docker镜像是容器技术的核心组成部分。通过合理的镜像管理,可以提高应用的部署效率和运行稳定性。在实际使用中,应该遵循镜像构建的最佳实践,定期维护镜像,确保镜像的安全性和高效性。