第4课:Docker 镜像管理

【腾讯云】语音识别准确率高,支持多语种,多场景,限时特惠,最低14.9元起

推广

【腾讯云】语音识别准确率高,支持多语种,多场景,限时特惠,最低14.9元起

镜像基础操作

搜索镜像

# 在Docker Hub搜索镜像
docker search nginx
docker search python

# 搜索官方镜像
docker search --filter is-official=true nginx

拉取镜像

# 拉取最新版本
docker pull nginx

# 拉取指定版本
docker pull nginx:1.21

# 拉取指定平台的镜像
docker pull --platform linux/amd64 nginx

查看镜像

# 列出所有镜像
docker images

# 查看镜像详细信息
docker inspect nginx:latest

# 查看镜像历史
docker history nginx:latest

删除镜像

# 删除单个镜像
docker rmi nginx:latest

# 删除多个镜像
docker rmi nginx:1.21 nginx:alpine

# 强制删除镜像
docker rmi -f nginx:latest

# 删除所有未使用的镜像
docker image prune

创建自定义镜像

方法一:使用docker commit

从现有容器创建镜像:

# 1. 运行一个基础容器
docker run -it ubuntu:20.04 /bin/bash

# 2. 在容器中安装软件(在容器内执行)
apt update
apt install -y nginx
echo "Hello Docker!" > /var/www/html/index.html

# 3. 退出容器(Ctrl+D)

# 4. 提交容器为新镜像
docker commit <容器ID> my-nginx:v1.0

方法二:使用Dockerfile(推荐)

创建Dockerfile文件:

# 使用官方nginx镜像作为基础
FROM nginx:alpine

# 设置维护者信息
LABEL maintainer="your-email@example.com"

# 设置工作目录
WORKDIR /usr/share/nginx/html

# 复制本地文件到容器
COPY index.html .

# 暴露端口
EXPOSE 80

# 设置启动命令
CMD ["nginx", "-g", "daemon off;"]

构建镜像:

# 构建镜像
docker build -t my-nginx:v2.0 .

# 指定Dockerfile路径
docker build -f /path/to/Dockerfile -t my-nginx:v2.0 .

# 不使用缓存构建
docker build --no-cache -t my-nginx:v2.0 .

Dockerfile 详解

常用指令

FROM

指定基础镜像:

FROM ubuntu:20.04
FROM node:16-alpine
FROM scratch  # 空白镜像

RUN

执行命令:

# Shell形式
RUN apt update && apt install -y nginx

# Exec形式(推荐)
RUN ["apt", "update"]
RUN ["apt", "install", "-y", "nginx"]

COPY 和 ADD

复制文件:

# COPY(推荐)
COPY src/ /app/
COPY package.json /app/

# ADD(支持URL和自动解压)
ADD https://example.com/file.tar.gz /tmp/
ADD archive.tar.gz /tmp/  # 自动解压

WORKDIR

设置工作目录:

WORKDIR /app
RUN npm install  # 在/app目录下执行

ENV

设置环境变量:

ENV NODE_ENV=production
ENV PATH="/app/bin:${PATH}"

EXPOSE

声明端口:

EXPOSE 80
EXPOSE 443
EXPOSE 3000/tcp

CMD 和 ENTRYPOINT

设置启动命令:

# CMD(可被覆盖)
CMD ["nginx", "-g", "daemon off;"]
CMD nginx -g "daemon off;"

# ENTRYPOINT(不可被覆盖)
ENTRYPOINT ["nginx"]
CMD ["-g", "daemon off;"]  # 默认参数

最佳实践示例

# 多阶段构建示例
FROM node:16-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

FROM node:16-alpine AS runtime
WORKDIR /app

# 创建非root用户
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001

# 复制构建结果
COPY --from=builder /app/node_modules ./node_modules
COPY . .

# 设置用户
USER nextjs

EXPOSE 3000
CMD ["npm", "start"]

镜像优化

1. 选择合适的基础镜像

# 大小对比
FROM ubuntu:20.04      # ~72MB
FROM alpine:3.14       # ~5MB
FROM scratch           # 0MB(仅适用于静态编译的程序)

2. 减少镜像层数

# 不好的做法
RUN apt update
RUN apt install -y nginx
RUN apt clean

# 好的做法
RUN apt update && \
    apt install -y nginx && \
    apt clean && \
    rm -rf /var/lib/apt/lists/*

3. 使用.dockerignore

创建.dockerignore文件:

node_modules
npm-debug.log
.git
.gitignore
README.md
.env
.nyc_output
coverage
.cache

4. 多阶段构建

# 构建阶段
FROM golang:1.17 AS builder
WORKDIR /app
COPY . .
RUN go build -o main .

# 运行阶段
FROM alpine:3.14
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/main .
CMD ["./main"]

镜像标签管理

标签操作

# 给镜像打标签
docker tag my-app:latest my-app:v1.0
docker tag my-app:latest registry.example.com/my-app:v1.0

# 推送到仓库
docker push my-app:v1.0
docker push registry.example.com/my-app:v1.0

标签策略

  • latest:最新版本
  • v1.0.0:语义化版本
  • stable:稳定版本
  • dev:开发版本

小结

在这一课中,我们学习了:

  • Docker镜像的基础操作
  • 使用Dockerfile创建自定义镜像
  • Dockerfile的常用指令和最佳实践
  • 镜像优化技巧
  • 镜像标签管理

实践作业

  1. 创建一个简单的Web应用Dockerfile
  2. 使用多阶段构建优化镜像大小
  3. 为你的镜像添加合适的标签
  4. 比较不同基础镜像的大小差异

思考题

  1. 什么时候使用CMD,什么时候使用ENTRYPOINT?
  2. 多阶段构建的优势是什么?
  3. 如何确保镜像的安全性?

下一课我们将学习Docker容器的操作和管理。

Vue3 + TypeScript 企业级项目实战

课程推荐

Vue3 + TypeScript 企业级项目实战
Python 全栈开发工程师培训

热门课程

Python 全栈开发工程师培训

📚 文章对你有帮助?请关注我的公众号,万分感谢!

获取更多优质技术文章,第一时间掌握最新技术动态

关注公众号

关注公众号

第一时间获取最新技术文章

添加微信

添加微信

技术交流 · 问题答疑 · 学习指导

评论讨论

欢迎留下你的想法和建议