手把手教你玩转Dockerfile(从入门到真香)

【云原生 | Docker 高级篇】05、DockerFile 详解 DockerFile 详解!!! 阅读详情

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一、为什么说Dockerfile是容器化的灵魂?

最近在技术社区看到个有意思的投票:“你在Docker里踩过最大的坑是什么?” 结果让我大跌眼镜——近40%的开发者把票投给了"Dockerfile配置"!!!(没想到吧.jpg)

作为容器化技术的核心蓝图,Dockerfile就像乐高说明书一样,决定了你的容器最终会拼成什么样子。但很多小伙伴(包括刚入坑时的我)都把它当黑盒子来用,今天咱们就来彻底拆解这个神秘文件!

二、Dockerfile基础语法大揭秘

2.1 文件结构解析

一个标准的Dockerfile就像烹饪食谱,我们来看个入门案例:

# 基础镜像(选对锅很重要!)
FROM ubuntu:20.04

# 维护者信息(方便甩锅)
LABEL maintainer="yourname@example.com"

# 环境变量设置(全局参数)
ENV TZ=Asia/Shanghai

# 执行命令(开始炒菜)
RUN apt-get update && \
    apt-get install -y nginx

# 暴露端口(开个上菜窗口)
EXPOSE 80

# 启动命令(最后点火)
CMD ["nginx", "-g", "daemon off;"]

2.2 八大核心指令详解

1. FROM:你的地基稳不稳?
FROM python:3.9-slim
  • 尽量选择官方镜像
  • 优先使用alpine/slim版本
  • 记得指定具体版本号(别用latest这个渣男!)
2. RUN:命令执行的正确姿势

错误示范:

RUN apt update
RUN apt install -y curl
RUN rm -rf /var/lib/apt/lists/*

这会产生三个镜像层,体积爆炸!

正确操作:

RUN apt update && \
    apt install -y curl && \
    rm -rf /var/lib/apt/lists/*

(看到这个反斜杠没?这就是优雅~)

3. COPY vs ADD:90%的人不知道的区别
COPY ./app /app         # 直接复制
ADD https://example.com/big.tar.xz /tmp  # 会自动解压
ADD ./files.tar.gz /tmp # 也会自动解压

重要建议:除非需要自动解压,否则无脑用COPY!

4. CMD vs ENTRYPOINT:启动的双子星

这对好基友经常让人懵逼,来看对比表:

指令可覆盖性最佳使用场景
CMD完全覆盖默认参数
ENTRYPOINT追加参数固定主命令

组合使用案例:

ENTRYPOINT ["nginx"]
CMD ["-g", "daemon off;"]

这样既保证了主命令不变,又允许运行时修改参数。

三、性能优化三大神技

3.1 镜像瘦身大法

原始镜像:1.2GB → 优化后:89MB!怎么做到的?

  1. 使用多阶段构建:
# 构建阶段
FROM golang:1.18 as builder
WORKDIR /app
COPY . .
RUN go build -o myapp

# 运行阶段
FROM alpine:3.15
COPY --from=builder /app/myapp /
CMD ["/myapp"]
  1. 清理构建缓存:
RUN apt update && \
    apt install -y build-essential && \
    make && \
    apt remove -y build-essential && \
    apt autoremove -y
  1. 合并RUN指令:
# Before
RUN apt update
RUN apt install -y python3
RUN rm -rf /var/lib/apt/lists/*

# After
RUN apt update && \
    apt install -y python3 && \
    rm -rf /var/lib/apt/lists/*

3.2 构建速度提升50%的秘诀

  1. 合理利用构建缓存:
  • 把变动少的操作放在前面
  • 单独处理package.json等依赖文件:
COPY package.json .
RUN npm install
COPY . .
  1. 使用.dockerignore文件:
node_modules
.git
*.log
  1. 实验性特性:BuildKit
    在Docker 18.09+版本启用:
DOCKER_BUILDKIT=1 docker build .

3.3 安全加固四重奏

  1. 非root用户运行:
RUN groupadd -r appuser && \
    useradd -r -g appuser appuser
USER appuser
  1. 签名验证:
FROM alpine@sha256:124c7d270790...
  1. 漏洞扫描:
docker scan your-image
  1. 只读文件系统:
docker run --read-only -v /tmp myapp

四、真实生产环境案例

4.1 Python Web应用完整Dockerfile

# 构建阶段
FROM python:3.9-slim as builder

WORKDIR /app
COPY requirements.txt .
RUN pip install --user -r requirements.txt

# 运行阶段
FROM python:3.9-slim

WORKDIR /app
COPY --from=builder /root/.local /root/.local
COPY . .

ENV PATH=/root/.local/bin:$PATH
ENV PYTHONUNBUFFERED=1

RUN useradd -ms /bin/bash appuser && \
    chown -R appuser:appuser /app
USER appuser

EXPOSE 8000
CMD ["gunicorn", "app:app", "--bind", "0.0.0.0:8000"]

4.2 常见报错解决方案

问题1:no space left on device
👉 解决方案:

# 在Dockerfile开头添加
ARG BUILDKIT_INLINE_CACHE=1

问题2:failed to solve: alpine:3.15 not found
👉 检查镜像tag是否存在:https://hub.docker.com/

问题3:permission denied
👉 在Dockerfile中添加:

RUN chmod +x entrypoint.sh

五、新一代Dockerfile技巧

5.1 BuildKit专属语法

# syntax=docker/dockerfile:1.4

# 并行构建
RUN --mount=type=cache,target=/var/cache/apt \
    apt update && \
    apt install -y git

# SSH密钥安全传递
RUN --mount=type=ssh \
    git clone git@github.com:user/repo.git

5.2 多平台构建

FROM --platform=$BUILDPLATFORM golang:1.18 AS build
ARG TARGETARCH
RUN GOARCH=$TARGETARCH go build -o /app

FROM alpine:3.15
COPY --from=build /app /

六、调试神器推荐

  1. dive - 镜像层分析工具
dive your-image
  1. dockerslim - 自动瘦身工具
dockerslim build --target your-image
  1. buildx - 多架构构建
docker buildx create --use

七、总结与作业

通过本文的学习,你应该已经掌握了:
✅ Dockerfile的核心指令用法
✅ 镜像优化三大方向
✅ 生产环境最佳实践
✅ 新一代构建技巧

课后作业:

  1. 检查你现有的Dockerfile,至少找出3个可以优化的点
  2. 尝试使用多阶段构建重构一个旧项目
  3. 使用dive分析你的镜像层结构

最后送大家一句话:“好的Dockerfile就像好的代码,需要持续迭代和维护”。如果本文对你有帮助,欢迎转发给更多小伙伴~(下次见!)

解决Dockerfile中conda环境激活问题的终极方案 本文深入剖析了在Dockerfile中激活conda环境失败的根源,并提供了三种核心解决方案:使用`conda run`执行命令、修改Docker的`SHELL`指令,以及通过`bash -c`手动初始化。文章重点推荐结合`SHELL`指令与`conda run`的终极实践方案,并附带了完整的深度学习镜像构建模板和避坑指南,帮助开发者彻底解决Docker中conda环境激活的难题。 阅读详情

相关推荐

从‘它好难’到‘真香’:我是如何用VSCode Dev Containers告别本地环境噩梦的

本文分享了如何利用VSCode Dev Containers解决开发环境配置难题,告别本地环境冲突问题。通过容器化技术实现环境隔离、配置即代码和团队一致性,详细介绍了从基础配置到高级定制的全流程实践,帮助开发者提升效率并简化协作流程。

weixin_30571465的博客 381

Dockerfile 入门

1. Dockerfile 简介 当我们需要配置软件时,会去 Docker Hub 中搜索镜像,然而很多官方镜像都像是基础包,很多功能都不具备,难以单独直接满足我们需求(例如下图的 CentOS),通常会自己搭建自己的镜像。 Dockerfile 是 Docker 中用于定义镜像自动化构建流程的配置文件,在 Dockerfile 中,包含了构建镜像过程中需要执行的命令和其他操作。通过 Dockerfile 可以更加清晰、明确的给定 Docker 镜像的制作过程,由于仅是简单、小体积的文件,在网络等介质中

BrilliantAntonio的博客 1158

CentOS7.9 安装 ImageMagick,图片转换为HEIC图像格式

由于ImageMagick7以下不支持heic等图片格式,所以重新安装了ImageMagick7.1版本支持heic格式,在网上找了很多资料,归纳总结并写此文章记录一下。在Linux(CentOS7.9)上安装ImageMagick7.1.1-38。

shmily_i的博客 1939

【Dockerfile】详细教程

本文介绍了Dockerfile是什么以及详细使用方法,包括模版案例

WQH_Boss的博客 4523

从解压到编译:手把手带你用TeXstudio搞定第一篇ACM LaTeX论文

本文详细指导如何使用TeXstudio从解压ACM LaTeX模板到成功编译第一篇学术论文的全过程。涵盖环境准备、模板配置、TeXstudio设置及常见问题排查,特别针对ACM会议论文格式要求,帮助学术新人快速掌握LaTeX写作技巧。

weixin_30655569的博客 254

BIOS更新后PIN不可用怎么办?从原理到实操的完整修复指南

在计算机维护中,BIOS更新是常见的固件升级操作,但其引发的登录异常却常让用户措手不及。Windows Hello PIN并非传统密码,它通过TPM芯片与设备启动环境(PCR状态)强绑定,一旦主板固件或安全启动配置改变,TPM便会拒绝释放密钥,导致“由于此设备上的更改,你的PIN不再可用”。理解这一原理后,恢复路径清晰可控:优先尝试密码登录,或通过WinRE替换utilman.exe创建临时管理员,必要时还需处理BitLocker恢复密钥。本文面向系统维护与数据安全场景,系统梳理PIN失效的恢复流程与避坑方

weixin_31364787的博客 354

dockerfile的学习

dockerfile

weixin_61407147的博客 479

STM32鱼塘水质监测系统设计与实现

物联网技术在农业领域的应用正逐步深入,其中传感器网络作为关键基础设施,通过实时数据采集与传输实现环境监测。基于STM32微控制器的嵌入式系统因其高性能和低功耗特性,成为物联网终端设备的理想选择。该系统通过DS18B20水温传感器、PH传感器和浊度传感器组成的多参数检测网络,配合4G通信模块实现水质数据的远程监控。在农业物联网场景中,这种解决方案不仅大幅降低了传统人工检测的成本,更能通过实时预警有效预防养殖损失。本文介绍的鱼塘水质监测系统正是这一技术的典型应用,展示了如何通过STM32和常见传感器构建高性价比

weixin_42173218的博客 620

docker学习进阶篇

从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,Dockerfile是软件的原材料Docker镜像是软件的交付品Docker容器则可以认为是软件镜像的运行态,也即依照镜像运行的容器实例Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。

mijichui2153的博客 2528

FastDDS之共享内存

transport层负责为DDS用户数据收发和服务发现提供通信。包含UDP,TCP,SHM。

u010378559的博客 3084

手把手教你用GD32F407VET6的EXMC驱动外部SRAM,搞定大内存需求

本文详细介绍了如何使用GD32F407VET6的EXMC外设驱动外部SRAM,解决嵌入式开发中的大内存需求问题。通过硬件连接方案、EXMC时序配置与初始化步骤,以及软件集成与内存管理技巧,帮助开发者快速实现内存扩展。特别适合需要处理图形显示缓冲、音频处理等大内存场景的GD32F407开发者。

weixin_30752699的博客 345

手把手教你玩转Dockerfile(从入门到实战真香指南)

下次看到同事又搞出臃肿的镜像时,请优雅地甩出这篇文章(然后收获膝盖)!记住:好的Dockerfile就像乐高说明书,既要结构清晰,又要充满创意。快去试试文中的技巧,保准你的镜像既苗条又安全(别忘了多阶段构建大法)!

kk_net8899的博客 473

TriCore架构-如何将系统刷成HSM

本文介绍了芯片刷写操作流程:首先加载project_Merge.s19文件,进入UCB界面展开BMHD0_ORIG和BMHD1_ORIG。重点说明需要将STAD地址从原始值A0000000修改为0XA00A0000,并详细描述了编辑、更新和写入芯片的步骤。最后提示在HSM刷写过程中如遇错误可能需要输入密码。该操作涉及关键地址修改,需谨慎执行。

xiandang8023的博客 95

手把手教你玩转Dockerfile:从入门到改bug不慌(实战经验分享)

用hadolint做语法检查(GitHub Action集成超简单)不同架构记得加--platform参数(ARM和x86的坑踩过吗?定期更新基础镜像(安全补丁不能停)记住:好的Dockerfile就像乐高积木,每个指令都严丝合缝。多写多翻车,自然就成长了!(别问我怎么知道的)

cloudpilot的博客 1052

【K8S系列】Kubernetes Pod节点CrashLoopBackOff 状态及解决方案详解【已解决】

在 Kubernetes 中,Pod 的状态为 **`CrashLoopBackOff`** 表示某个容器在启动后崩溃,Kubernetes > 尝试重启该容器,但由于持续崩溃,重启的间隔时间逐渐增加。下面将详细介绍 `CrashLoopBackOff > `状态的原因、解决方案及相关命令的输出解释。

颜淡慕潇 8379

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Docker微服务-Dockerfile之Nginx+PHP

基于ubuntu系统编写nginx+php的dockerfile

u014225032的博客 2444

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Docker精华问答 | 用dockerfile制作镜像

Docker 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本!使用 Docker,可以让应用的部署、测试和分发都...

优快云云计算 330

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

mongodbmysql区别,真香

前言 设计模式是我们编程道路上绕不开的一环,用好了设计模式能够让代码拥有良好的维护性、可读性以及扩展性,它仿佛就是“优雅”的代名词,各个框架和库也都能见到它的身影。 正是因为它有种种好处,所以很多人在开发时总想将某个设计模式用到项目中来,然而往往会用得比较别扭。其中一部分原因是业务需求并不太符合所用的设计模式,还有一部分原因就是在Web项目中我们对象都是交由Spring框架的Ioc容器来管理,很多设计模式无法直接套用。那么在真正的项目开发中,我们就需要对设计模式做一个灵活的变通,让其能够和框架结合,在实际开

114

真香,GitLab 和 Docker自动化部署SpringBoot应用

真香,GitLab 和 Docker自动化部署SpringBoot应用 Docker和Spring Boot是非常流行的组合,我们将利用GitLab CI的优势,并在应用程序服务器上自动构建,推送和运行Docker镜像。 GitLab CI Gitlab CI/CD服务是GitLab的一部分。开发人员将代码推送到GitLab存储库时,GitLab CI就会在用户指定的环境中自动构建,测试和存储最新的代码更改。 选择GitLab CI的一些主要原因: 易于学习,使用和可扩展 维护容易 整合容易 CI完全属于G

bishe_teacher的博客 322

7.Dockerfile构建镜像

1.是神么 Dockerfile是由一系列命令和参数构成的脚本,这些命令应用与基础镜像并最终创建一个新的镜像。 1.对于开发人员,可以为团队提供一个完全一致的开发环境 2.对于测试人员,可以直接拿开发时构建的镜像或者通过Dockerfile文件创建一个新的镜像开始工作 3.对于运维人员,在部署时候可以实现应用的无缝移植 真香 2.常用命令 命令 作用 FROM 镜像名称:镜像标签 定义了使用那个基础镜像启动构建流程 MAINTAINER..

qq_42338293的博客 132

IDEA+Docker 远程一键部署项目,真香!

你不会还在苦哈哈的手动打出jar包,上传jar包,java -jar来部署项目吧?我不允许你不知道如何使用IDEA+Docker一键部署项目!一.引语本文将学习使用IDEA+Docker远程一键部署SpringBoot项目,对比上传jar包到服务器,再通过java指令运行项目,极大程度的提高了项目部署效率。可谓不用不知道,一用再也停不下来~为了后续学习方便,需要提前进行如下和教程无关的最基本的准备...

hello world! 682

插件dockerfile-maven-plugin,Docker部署SpringBoot多模块、多环境项目、Redis、Mysql、RocketMQ,推送阿里云镜像仓库服务,去疑真香版

本文主要讲解多模块的springboot如何通过maven的插件dockerfile-maven-plugin如何配置,如何打包上传服务器,如何推送到阿里云镜像仓库服务,多环境下如何配置、如何打包上传,如何用docker安装Redis,Mysql,RocketMQ镜像和容器。

qq_35683545的博客 1401

别再死磕命令了!用「搭积木」的方式玩转Docker,真香!

启动数据库积木: docker run --name mysql-db -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 ⚠️别慌!➡️ 用 数据卷(Volume): docker run -v /home/data:/var/lib/mysql ... 把容器里的数据挂载到本地目录,就像给房子接个外接硬盘!镜像分层:你下载的WordPress镜像里其实包含了Linux+PHP+WordPress代码,就像积木底层是底座,中间是结构,最上层是装饰。搞了半天依赖还是报错!

微信公众号:互联网之路 297

这一套Docker知识点总结真香,以后终于可以不用百度了!

https://www.cnblogs.com/darope/p/13861840.html1 安装dockerdocker是cs架构,安装docker默认会安装服务端和客户端,通过do...

程序员闪充宝 1002
上一篇: 三次握手四次挥手的那些坑,连老司机都可能翻车!!!
下一篇: MySQL基础面试题精选(附超实用避坑指南)
普通网友
博客等级 码龄2年 69粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值