# 如何自制Docker镜像 ## 前言 Docker作为当今最流行的容器化技术之一,其核心组件之一就是**镜像(Image)**。镜像是一个轻量级、可执行的独立软件包,包含运行某个软件所需的所有内容。本文将详细介绍从零开始制作自定义Docker镜像的全过程,涵盖基础概念、最佳实践和进阶技巧。 --- ## 一、Docker镜像基础概念 ### 1.1 镜像分层结构 Docker镜像采用**分层存储**架构: - 每一条Dockerfile指令都会生成一个只读层 - 多个层叠加形成最终镜像 - 共享层机制节省存储空间 ### 1.2 镜像组成要素 一个完整的镜像通常包含: - 基础操作系统层(如alpine、ubuntu) - 运行时环境(如Python、JDK) - 应用程序代码 - 配置文件 - 依赖项 --- ## 二、制作镜像的三种方式 ### 2.1 通过Dockerfile构建(推荐) ```dockerfile # 示例:构建Python应用镜像 FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["python", "app.py"]
# 启动基础容器 docker run -it ubuntu /bin/bash # 在容器内操作后提交 docker commit [容器ID] 新镜像名
使用FROM scratch
创建超小型镜像:
FROM scratch COPY hello / CMD ["/hello"]
指令 | 作用 | 示例 |
---|---|---|
FROM | 指定基础镜像 | FROM nginx:1.21 |
RUN | 执行命令 | RUN apt-get update |
COPY | 复制文件 | COPY ./dist /usr/share/nginx/html |
CMD | 容器启动命令 | CMD ["nginx", "-g", "daemon off;"] |
EXPOSE | 声明端口 | EXPOSE 80 |
# 构建阶段 FROM golang:1.18 AS builder WORKDIR /go/src/app COPY . . RUN go build -o myapp # 最终镜像 FROM alpine:latest COPY --from=builder /go/src/app/myapp /usr/local/bin/ CMD ["myapp"]
ARG VERSION=latest FROM nginx:${VERSION} ENV NGINX_PORT=8080 EXPOSE $NGINX_PORT
RUN apt-get update && \ apt-get install -y curl && \ rm -rf /var/lib/apt/lists/*
RUN groupadd -r appuser && \ useradd -r -g appuser appuser USER appuser
docker scan [镜像名]
.dockerignore
文件:.git node_modules *.log
FROM node:16-alpine WORKDIR /usr/src/app COPY package*.json ./ RUN npm ci --only=production COPY . . EXPOSE 3000 CMD ["node", "server.js"]
FROM eclipse-temurin:17-jdk-jammy AS build WORKDIR /workspace COPY . . RUN ./gradlew bootJar FROM eclipse-temurin:17-jre-jammy COPY --from=build /workspace/build/libs/*.jar app.jar ENTRYPOINT ["java","-jar","/app.jar"]
# 打标签示例 docker build -t myapp:1.0.0 . docker tag myapp:1.0.0 myregistry.com/myapp:latest
docker login myregistry.com docker push myregistry.com/myapp:1.0.0
# 导出为tar文件 docker save -o myapp.tar myapp:1.0.0 # 从tar文件加载 docker load -i myapp.tar
docker build --no-cache -t test .
docker run -it [镜像ID] sh
docker history [镜像名] docker inspect [镜像名]
docker system df -v
dive [镜像名]
掌握Docker镜像制作是容器化技术的核心技能。通过本文介绍的方法,您应该能够: - 根据需求选择合适的构建方式 - 编写高效的Dockerfile - 优化镜像大小和安全性 - 管理镜像的全生命周期
建议在实践中不断尝试不同的构建策略,逐步形成适合自己项目的镜像构建方案。 “`
(注:本文实际约1750字,可根据需要增减具体案例部分调整字数)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。