4.10dockerfile构建镜像

🐳 Dockerfile 极简概况

1. 是什么?

Dockerfile 是自动化构建 Docker 镜像的纯文本脚本,是镜像的「构建说明书」,由一系列指令组成,记录了从基础镜像到应用镜像的完整构建步骤。

2. 为什么需要?

解决镜像构建不可复现、环境不一致的问题,实现标准化、可追溯、自动化的镜像构建,是容器化和 CI/CD 流程的核心基础。

3. 能干什么?

  • 自定义打包各类应用(如 Java Spring Boot)的运行环境与启动逻辑
  • 统一配置环境变量、时区、依赖等,保障多环境一致性
  • 优化镜像体积、定义容器运行行为,支撑微服务、云原生部署

构建镜像

1commit构建镜像

docker commit把正在运行的容器,直接打包成一个新镜像的命令,不用写 Dockerfile。

bash 复制代码
docker commit -a "作者名" -m "修改说明" 容器ID 新镜像名:版本
实例
docker commit -a "张三" -m "安装了nginx插件" nginx111 my-nginx:v2

2build构建镜像

docker build根据 Dockerfile 自动构建出 Docker 镜像的命令。

docker build -t 镜像名:版本号 .

docker build -t springboot-docker:1.0 .

  • -t:给镜像起名字 + 版本
  • .最重要! 指定当前目录 为「构建上下文」,Docker 会在当前目录找 Dockerfile

Dockerfile常用指令

1. FROM

指定基础镜像(必须第一条)

复制代码
FROM openjdk:8

2. MAINTAINER

作者信息

复制代码
MAINTAINER zhangsan

3. RUN

构建镜像时执行命令(安装软件、执行脚本)

复制代码
RUN yum install -y nginx

4. COPY

复制文件到镜像(推荐用这个)

复制代码
COPY 1.txt /opt

5. ADD

复制 + 自动解压

复制代码
ADD abc.tar.gz /opt

6. WORKDIR

设置工作目录(相当于 cd)

复制代码
WORKDIR /usr/local

7. EXPOSE

声明暴露端口

复制代码
EXPOSE 8080

8. CMD

容器启动时执行的命令

复制代码
CMD ["java", "-jar", "app.jar"]

9. ENTRYPOINT

容器真正的启动入口,不会被覆盖(固定启动命令,生产必用)

复制代码
ENTRYPOINT ["java", "-jar", "app.jar"]

10. VOLUME

声明容器数据卷(持久化数据)

复制代码
VOLUME /tmp

11. ENV

设置环境变量(全局生效)

复制代码
ENV JAVA_OPTS="-Xms128m -Xmx256m"

扩展指令

1. USER 指令

作用 :指定容器运行时的用户、UID 或用户组,后续 RUNCMDENTRYPOINT 都会以该用户身份执行。

  • 核心价值 :避免容器以 root 超级用户运行,大幅降低容器逃逸、权限滥用的安全风险。

  • 语法示例

    复制代码
    # 创建非root用户
    RUN useradd -m -u 1000 appuser
    # 切换用户
    USER appuser
    # 也可指定UID
    # USER 1000
  • 注意 :必须先创建用户,否则会报错;若需切换回 root,可写 USER root


2. ARG 指令

作用 :定义 ** 构建时(build-time)** 的动态变量,可在 docker build 时通过 --build-arg 传入,仅在构建阶段生效,不会保留在运行时容器中。

  • 核心价值:实现「一份 Dockerfile,多环境 / 多版本构建」,无需修改文件即可灵活配置。

  • 语法示例

    复制代码
    # 定义参数,可设置默认值
    ARG JAVA_VERSION=8
    ARG APP_VERSION=1.0
    
    # 构建时使用参数
    RUN echo "Building app v${APP_VERSION} with Java ${JAVA_VERSION}"
    
    # 构建时传入参数
    # docker build --build-arg JAVA_VERSION=11 --build-arg APP_VERSION=2.0 -t myapp .
  • ENV 的区别ARG 仅构建时有效,ENV 会保留在容器运行时环境中。


3. ONBUILD 指令

作用 :定义一组指令,仅当当前镜像作为「基础镜像」被其他 Dockerfile 继承时,才会在子镜像构建阶段自动执行

  • 核心价值:制作标准化基础镜像,让子镜像自动遵循统一构建流程,减少重复配置。

  • 语法示例

    复制代码
    # 基础镜像 Dockerfile
    ONBUILD ADD . /app
    ONBUILD RUN mvn clean package -DskipTests
    ONBUILD EXPOSE 8080

    子镜像仅需写 FROM 基础镜像名,就会自动执行上述 3 条指令。

  • 注意ONBUILD 不会在当前镜像构建时执行,仅对「子镜像」生效;不可嵌套 ONBUILD


4. STOPSIGNAL 指令

作用 :指定 docker stop 命令发送给容器的系统信号,默认是 SIGTERM(15 号信号),可自定义为 SIGKILL(9 号信号)等。

  • 核心价值:适配需要特殊关闭逻辑的应用,实现优雅关闭,避免强制 kill 导致数据丢失。

  • 语法示例

    复制代码
    # 发送 SIGINT 信号(Ctrl+C)
    STOPSIGNAL SIGINT
    # 也可使用信号编号
    # STOPSIGNAL 2
  • 注意:仅指定信号,不处理信号;应用需自行实现对应信号的监听和处理逻辑。


5. HEALTHCHECK 指令

作用:定义容器健康检查规则,Docker 会定期执行该命令,判断容器是否正常运行。

  • 核心价值:监控服务状态,配合 K8s 等编排工具实现自动重启、负载剔除,保障服务可用性。

  • 语法示例

    复制代码
    # 检查 Nginx 服务
    HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
      CMD curl -f http://localhost:8080/health || exit 1
    
    # 检查 Spring Boot 应用
    # HEALTHCHECK --interval=10s CMD wget -q -O /dev/null http://localhost:8080/actuator/health || exit 1

springboot项目镜像构建

Dockerfile文件编辑

bash 复制代码
# 关联基础镜像 => jdk
FROM openjdk:8

# 将项目jar包拷贝到容器中(明确指定jar包名,避免多jar冲突)
ADD *.jar app.jar

# 配置项目环境变量
ENV APP_OPTS=""

# JVM环境变量(可根据需求调整内存参数)
ENV JVM_OPTS="-Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:+UseG1GC"

# 暴露端口
EXPOSE 8888

# 设置启动命令(保留环境变量动态替换能力)
ENTRYPOINT ["sh", "-c", "java $JVM_OPTS -jar /app.jar $APP_OPTS"]

build构建镜像

bash 复制代码
docker build -t springboot:1.0 .

Nginx源码构建docker镜像

Dockerfile文件编辑

bash 复制代码
# 1. 指定基础镜像:CentOS 7(必须固定7,latest是CentOS8会报错)
FROM centos:7

# 2. 作者信息(新版用LABEL代替旧的MAINTAINER)
LABEL maintainer="laoli<laoli@qq.com>"

# 3. 关键:替换 CentOS7 YUM 源为 阿里云国内源(解决yum安装失败问题)
#    注释原有官方源 → 启用阿里云baseurl → 清空缓存 → 重建缓存
RUN sed -i 's|mirrorlist=|#mirrorlist=|g' /etc/yum.repos.d/CentOS-Base.repo && \
    sed -i 's|#baseurl=http://mirror.centos.org|baseurl=https://mirrors.aliyun.com|g' /etc/yum.repos.d/CentOS-Base.repo && \
    yum clean all && yum makecache

# 4. 把本地的pcre正则库源码包 复制并解压到镜像内
ADD pcre-8.38.tar.gz /usr/local/src

# 5. 把本地的nginx源码包 复制并解压到镜像内
ADD nginx-1.14.2.tar.gz /usr/local/src

# 6. 安装Nginx编译必需的依赖包(编译器、make、openssl开发库)
#    gcc/gcc-c++:C语言编译器
#    make:编译工具
#    openssl-devel:HTTPS功能依赖
RUN yum install -y gcc gcc-c++ make openssl-devel

# 7. 创建Nginx专用运行用户www(禁止登录、不创建家目录,安全规范)
RUN useradd -s /sbin/nologin -M www

# 8. 切换工作目录到Nginx源码文件夹
WORKDIR /usr/local/src/nginx-1.14.2

# 9. 配置Nginx编译参数(核心关键步骤)
RUN ./configure \
    --prefix=/usr/local/nginx \          # Nginx安装路径
    --user=www \                         # 运行用户
    --group=www \                        # 运行用户组
    --with-http_ssl_module \             # 开启HTTPS支持
    --with-http_stub_status_module \     # 开启状态监控页面
    --with-pcre=/usr/local/src/pcre-8.38 # 指定pcre正则库源码路径

# 10. 编译Nginx + 安装Nginx
RUN make && make install

# 11. 关键:让Nginx在Docker前台运行(不加这行容器启动就退出)
RUN echo 'daemon off;' >> /usr/local/nginx/conf/nginx.conf

# 12. 把Nginx命令加入系统环境变量(直接能用nginx命令)
ENV PATH=/usr/local/nginx/sbin:$PATH

# 13. 把本地首页文件 复制到Nginx网页目录
ADD index.html /usr/local/nginx/html

# 14. 声明容器暴露80端口(给用户看的,不实际开放端口)
EXPOSE 80

# 15. 容器启动时执行的命令:启动Nginx
CMD ["nginx"]

构建镜像,启动容器

bash 复制代码
docker build -t nginx-docker .

docker run -P -d --name ngix-docke nginx-docker:latest 

javaweb项目镜像构建

Dockerfile文件编辑

bash 复制代码
FROM tomcat:9.0

WORKDIR /usr/local/tomcat/webapps

ADD *.war ROOT.war

ENTRYPOINT ["sh", "-c", "../bin/catalina.sh run"]

构建镜像,启动容器

bash 复制代码
 docker build -t tomcat-docker .

docker run -d --name tomcat -P tomcat-docker:latest 
相关推荐
fish_xk2 小时前
c++内存管理
开发语言·c++·算法
阿维的博客日记2 小时前
锁消除和锁粗化
java·逃逸分析
云烟成雨TD2 小时前
Spring AI 1.x 系列【26】结构化输出执行流程
java·人工智能·spring
独特的螺狮粉2 小时前
城市空气质量简易指数查询卡片:鸿蒙Flutter框架 实现的空气质量查询应用
开发语言·flutter·华为·架构·harmonyos
网域小星球2 小时前
C语言从0入门(八)|函数基础:封装、调用与参数传递精讲
c语言·开发语言
东宇科技2 小时前
如何使用js进行抠图。识别商品主体
开发语言·javascript·ecmascript
Dxy12393102162 小时前
Python使用PyEnchant详解:打造高效拼写检查工具
开发语言·python
网域小星球2 小时前
C 语言从 0 入门(十五)|综合小项目:菜单交互与简易功能实现
c语言·开发语言·交互
网域小星球3 小时前
C 语言从 0 入门(十六)|动态内存管理:malloc /free/calloc /realloc 精讲
c语言·开发语言·free·malloc·动态内存