镜像基础操作
搜索镜像
# 在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的常用指令和最佳实践
- 镜像优化技巧
- 镜像标签管理
实践作业
- 创建一个简单的Web应用Dockerfile
- 使用多阶段构建优化镜像大小
- 为你的镜像添加合适的标签
- 比较不同基础镜像的大小差异
思考题
- 什么时候使用CMD,什么时候使用ENTRYPOINT?
- 多阶段构建的优势是什么?
- 如何确保镜像的安全性?
下一课我们将学习Docker容器的操作和管理。
📚 文章对你有帮助?请关注我的公众号,万分感谢!
获取更多优质技术文章,第一时间掌握最新技术动态

关注公众号
第一时间获取最新技术文章

添加微信
技术交流 · 问题答疑 · 学习指导
评论讨论
欢迎留下你的想法和建议