
文章目录一、Dockerfile 基础语法与结构Dockerfile 基础语法基本结构示例指令详解环境变量与参数二、多阶段镜像的制作多阶段构建的优势多阶段构建示例手工部署 Nginx多阶段的 Dockerfile 文件一、Dockerfile 基础语法与结构Dockerfile 是一个文本文件包含一系列指令用于构建 Docker 镜像。每条指令对应镜像的一层最终生成一个可运行的容器环境。Dockerfile 基础语法常用指令FROM指定基础镜像必须是第一条指令。RUN在镜像内执行命令通常用于安装软件包。COPY将文件从主机拷贝到镜像中。ADD将文件从主机拷贝到镜像中ADD指令可自动解压tar包且支持网络资源。WORKDIR设置工作目录后续指令在此目录下执行唯一。EXPOSE声明容器运行时监听的端口/协议。CMD和ENTRYPOINT指定容器启动时运行的命令。同时使用时CMD指令中的内容为ENTRYPOINT指令的参数唯一。ENV设置环境变量。USER指定容器使用的用户唯一。基本结构示例FROM rockylinux:9 RUN dnf -y install httpd COPY . /app WORKDIR /app CMD [/bin/ls, -l]指令详解FROM指令必须位于Dockerfile开头指定构建的基础镜像。RUN指令会在当前镜像层执行命令并提交结果。多条命令可用连接以减少层数RUN dnf -y install net-tools vim ip-route \ dnf clean all ...COPY和ADD指令都用于拷贝文件但ADD具有额外功能如解压缩COPY test.txt /tmp/ ADD project.tar.gz /app/WORKDIR指令用于设置工作目录如果目录不存在会自动创建WORKDIR /usr/local/nginxCMD指令为容器默认的启动参数FROM rockylinux:9 CMD [/bin/ls, -l] # 启动容器时最后的参数会替换掉CMD中的内容ENTRYPOINT与CMD指令同时使用FROM rockylinux:9 ENTRYPOINT [/usr/bin/echo] CMD [/bin/ls, -l] # 制作镜像启动容器后执行 echo ls -l环境变量与参数使用ENV设置环境变量ARG定义构建时参数ARG APP_VERSION1.0 ENV APP_HOME/app构建时可通过--build-arg传递参数dockerbuild --build-argAPP_VERSION2.0-tmyapp.二、多阶段镜像的制作对于需要编译环境的场景可使用多阶段构建减小最终镜像大小多阶段构建的优势多阶段构建允许在一个Dockerfile中定义多个构建阶段每个阶段可以基于不同的基础镜像且最终仅保留所需的文件到最终镜像中。优势包括减小镜像体积仅保留运行时必要的文件剔除中间构建工具和依赖。安全性提升避免将构建环境如编译器、敏感数据暴露到生产镜像中。简化流程无需额外脚本清理中间文件。多阶段构建示例以下是一个Nginx的多阶段构建示例手工部署 Nginx# 将Nginx源码包上传到Linux虚拟机中的/root目录下lsnginx-1.27.5.tar.gz nginx-1.27.5.tar.gz# 创建容器并以守护进程的方式启动dockerrun-itd--nameweb img:base# 将宿主机中的Nginx源码包拷贝到web容器中dockercpnginx-1.27.5.tar.gz web:/# 进入web容器中并解压缩Nginx的源码包dockerexec-itweb /bin/bashtar-zxfnginx-1.27.5.tar.gz# 进入到工作目录下源码编译时方便找到Makefile文件cdnginx-1.27.5# Nginx运行时需要的安装包dnf-yinstallpcre zlib openssl# Nginx源码编译时需要的安装包dnf-yinstallpcre-devel zlib-devel openssl-devel gccmake# 清理yum缓存dnf clean all# 生成Makefile文件指定Nginx的安装目录还可自定义安装所需的模块./configure--prefix/usr/local/nginx --with-http_ssl_module# 编译make# 安装拷贝文件makeinstall# 为Nginx添加默认的首页文件echoNginx is Running.../usr/local/nginx/html/index.html# 添加全局变量指定Nginx程序所在的目录exportPATH${PATH}:/usr/local/nginx/sbin/ nginx-gdaemon off;# 前台进程终端卡住# 另开一个终端过滤出启动的容器的IP地址并测试Nginx服务是否正常启动dockerinspect web|grep-iipaddresscurlhttp://172.17.0.2 Nginx is Running...创建工作目录mkdirnginx# 将源码包拷贝到当前目录下mvnginx-1.27.5.tar.gz nginx;cdnginx# 编写DockerfilevimDockerfile多阶段的 Dockerfile 文件第一阶段构建环境FROM img:base as builder ADD nginx-1.27.5.tar.gz / WORKDIR /nginx-1.27.5 RUN dnf install -y openssl-devel pcre-devel zlib-devel gcc make RUN ./configure --prefix/usr/local/nginx --with-http_ssl_module RUN make RUN make install RUN echo Nginx is running... /usr/local/nginx/html/index.html第二阶段运行环境FROM img:base RUN dnf install -y pcre zlib openssl dnf clean all COPY --frombuilder /usr/local/nginx /usr/local/nginx ENV PATH${PATH}:/usr/local/nginx/sbin WORKDIR /usr/local/nginx EXPOSE 80/tcp CMD [nginx, -g, daemon off;]制作镜像并测试# 制作镜像dockerbuild-tmyos:nginx.# 查看镜像dockerimages REPOSITORY TAG IMAGE ID CREATED SIZE myos nginx 399bd2cbc51c56seconds ago 265MB img base f099dd33d8113days ago 259MB rockylinux9bc587475a29411months ago 170MB# 创建容器并测试效果dockerrun-itd--rm--namenginx-p80:80 myos:nginx a8e28bc5fdfdbfeb014f482f2f3881b6cc3d70d20c9c03cedf1268edb439db36curlhttp://localhost Nginx is running...# 删除容器dockerrm-fnginx关键指令解析FROM ... AS定义构建阶段并命名后续可通过--from引用。COPY --from从指定阶段复制文件到当前阶段。最终阶段选择最后一个FROM指令定义的镜像为最终产出。最佳实践使用.dockerignore文件排除不必要的文件合并多个RUN指令减少镜像层数固定基础镜像版本而非使用latest清理不必要的缓存和临时文件按依赖频率排序指令利用 Docker 缓存机制对静态文件使用多阶段构建时考虑压缩如 gzip以减小体积。复用公共阶段多个阶段可基于同一基础镜像减少重复下载依赖。选择性复制文件仅复制必要的二进制文件或配置文件忽略测试代码和临时文件。混合语言构建例如第一阶段用 node 构建前端第二阶段用 nginx 部署静态文件。通过多阶段构建可以显著提升镜像的效率和安全性尤其适合需要复杂构建流程但轻量运行的应用场景。