🐳 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 或用户组,后续 RUN、CMD、ENTRYPOINT 都会以该用户身份执行。
-
核心价值 :避免容器以
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