当前位置: 首页 > article >正文

Docker使用指南与Dockerfile文件详解:从入门到实战


Docker使用指南与Dockerfile文件详解:从入门到实战


文章目录

      • **Docker使用指南与Dockerfile文件详解:从入门到实战**
        • **引言**
      • **第一部分:Docker 核心概念速览**
        • **1. Docker 基础架构**
        • **2. Docker 核心命令**
      • **第二部分:Dockerfile 文件深度解析**
        • **1. Dockerfile 是什么?**
        • **2. Dockerfile 核心指令详解**
          • **① FROM:基础镜像**
          • **② WORKDIR:工作目录**
          • **③ COPY/ADD:复制文件**
          • **④ RUN:执行命令**
          • **⑤ ENV:环境变量**
          • **⑥ EXPOSE:声明端口**
          • **⑦ CMD/ENTRYPOINT:容器启动命令**
          • **⑧ VOLUME:数据卷**
          • **⑨ USER:切换用户**
        • **3. 完整 Dockerfile 示例**
      • **第三部分:Dockerfile 最佳实践**
        • **1. 镜像瘦身技巧**
        • **2. 安全性增强**
        • **3. 构建速度优化**
      • **第四部分:常见问题与调试**
        • **1. 镜像构建失败**
        • **2. 容器启动报错**
      • **结语**

引言

在云原生时代,Docker 已成为容器化技术的代名词。它通过轻量化的容器封装应用及其依赖,彻底改变了开发、测试和部署的流程。而 Dockerfile 作为构建镜像的“蓝图”,是掌握 Docker 的核心技能之一。本文将带你深入 Docker 的核心操作,并逐行解析 Dockerfile 的编写技巧与最佳实践。


第一部分:Docker 核心概念速览

1. Docker 基础架构
  • 镜像(Image):只读模板,包含应用代码、运行时环境和配置。
  • 容器(Container):镜像的运行实例,具有独立的文件系统和网络。
  • 仓库(Registry):存储和分发镜像的平台(如 Docker Hub)。
2. Docker 核心命令
# 拉取镜像
docker pull nginx:latest

# 运行容器(后台模式)
docker run -d --name my-nginx -p 80:80 nginx

# 查看运行中的容器
docker ps

# 进入容器终端
docker exec -it my-nginx /bin/bash

# 构建镜像
docker build -t my-app:1.0 .

第二部分:Dockerfile 文件深度解析

1. Dockerfile 是什么?

Dockerfile 是一个纯文本文件,通过逐行指令定义镜像的构建过程。每条指令对应镜像的一层(Layer),层级结构提高了复用性和构建效率。


2. Dockerfile 核心指令详解
① FROM:基础镜像
# 基于官方 Python 镜像
FROM python:3.9-slim
  • 作用:指定基础镜像,必须为第一条指令。
  • 技巧:优先选择官方镜像的轻量版本(如 -alpine-slim)。

② WORKDIR:工作目录
WORKDIR /app
  • 作用:设置后续指令的执行路径(若目录不存在则自动创建)。
  • 最佳实践:避免使用 RUN cd /app && ...,始终用 WORKDIR

③ COPY/ADD:复制文件
COPY requirements.txt ./
ADD ./src /app/src
  • COPY:仅复制本地文件到镜像。
  • ADD:支持自动解压压缩包和远程 URL(慎用)。
  • 重要区别:99% 的场景优先使用 COPY,避免 ADD 的不可预测行为。

④ RUN:执行命令
RUN apt-get update && apt-get install -y \
    git \
    curl \
    && rm -rf /var/lib/apt/lists/*
  • 作用:在镜像层中执行命令(如安装依赖)。
  • 优化技巧:合并多条命令减少层数,清理无用缓存(如 apt-get clean)。

⑤ ENV:环境变量
ENV NODE_ENV=production \
    PORT=3000
  • 作用:设置容器运行时环境变量。
  • 扩展:可通过 docker run -e PORT=4000 覆盖。

⑥ EXPOSE:声明端口
EXPOSE 80
  • 作用:文档化容器监听的端口(实际映射需通过 -p 参数生效)。
  • 注意:即使不写 EXPOSE-p 仍可映射端口。

⑦ CMD/ENTRYPOINT:容器启动命令
# 方式1:直接执行命令
CMD ["python", "app.py"]

# 方式2:ENTRYPOINT 接收 CMD 参数
ENTRYPOINT ["gunicorn"]
CMD ["--bind", "0.0.0.0:80", "app:app"]
  • CMD:定义默认命令,可被 docker run 后的参数覆盖。
  • ENTRYPOINT:定义固定命令,CMD 作为其参数。
  • 黄金组合:用 ENTRYPOINT 包装脚本,CMD 传递动态参数。

⑧ VOLUME:数据卷
VOLUME /var/lib/mysql
  • 作用:声明持久化数据的存储位置。
  • 实际使用:需通过 -v 参数挂载主机目录。

⑨ USER:切换用户
USER nobody
  • 作用:避免以 root 身份运行容器,提升安全性。
  • 前置条件:确保目标用户已存在(需在 RUN 中创建)。

3. 完整 Dockerfile 示例
# 阶段1:构建应用
FROM node:16 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# 阶段2:运行应用
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
FROM alpine:3.20
ENV LANG=zh_CN.UTF-8 \
    TZ=Asia/Shanghai \
    PS1="\u@\h:\w \$ "
# RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
RUN    apk add --update --no-cache \
       nginx \
       nginx-mod-stream \
       nginx-mod-http-headers-more \
       nginx-mod-http-lua \
       nginx-mod-http-brotli \
       nginx-mod-rtmp \
       openjdk8-jre \
       net-tools \
       curl \
       wget \
       ttf-dejavu \
       fontconfig \
       tzdata \
       logrotate \
       tini \
       acme.sh \
    && fc-cache -f -v \
    && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \
    && echo "${TZ}" > /etc/timezone \
    && rm -rf /var/cache/apk/* /tmp/*
COPY target/nginxWebUI-*.jar /home/nginxWebUI.jar
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
RUN ["chmod", "+x", "/usr/local/bin/entrypoint.sh"]
VOLUME ["/home/nginxWebUI"]
ENTRYPOINT ["tini", "entrypoint.sh"]

第三部分:Dockerfile 最佳实践

1. 镜像瘦身技巧
  • 多阶段构建:分离构建环境和运行时环境(如上例)。
  • 删除缓存:在 RUN 中清理包管理器缓存。
  • 使用小镜像:如 alpine(5MB)替代默认镜像(100MB+)。
2. 安全性增强
  • 避免敏感信息:不在 Dockerfile 中硬编码密码,改用环境变量或 Secrets。
  • 非 root 用户:通过 USER 指令降权。
3. 构建速度优化
  • 利用缓存:将不常变动的指令(如 COPY package.json)放在前面。
  • 并行下载:包管理器使用并行安装(如 npm install --prefer-offline)。

第四部分:常见问题与调试

1. 镜像构建失败
  • 错误定位:通过 docker build --progress=plain 查看详细日志。
  • 临时调试:注释失败行后的指令,逐步构建并进入容器检查。
2. 容器启动报错
  • 日志查看docker logs <container_id>
  • 交互调试:覆盖启动命令进入 Shell:
    docker run -it --entrypoint /bin/sh my-image
    

结语

掌握 Dockerfile 的编写,意味着你能够将应用与环境完美封装,实现“一次构建,处处运行”。无论是微服务架构还是 CI/CD 流水线,Dockerfile 都是标准化交付的核心工具。现在,尝试为你的项目编写一个 Dockerfile,体验容器化带来的效率革命吧!


延伸阅读

  • Docker 官方文档
  • Dockerfile 最佳实践(官方指南)
  • 《Docker 进阶与实战》—— 机械工业出版社

http://www.kler.cn/a/541775.html

相关文章:

  • 解决VsCode的 Vetur 插件has no default export Vetur问题
  • 什么是矩阵账号?如何做矩阵账号运营?
  • C语言-结构体
  • 大语言模型需要的可观测性数据的关联方式
  • 循环神经网络学习01——transformer:输入部分-嵌入层位置编码
  • DeepSeek从入门到精通教程PDF清华大学出版
  • DeepSeek与GPT大语言模型教程
  • 2/11QT
  • DeepSeek有什么技术创新?为什么这么火
  • 组合模式 + 访问者模式:树形结构与复杂操作的最佳拍档
  • 【算法学习】拓扑排序(Topological Sorting)
  • bazel 小白理解
  • 鸿蒙开发WebUrl跳转到手机浏览器
  • 第五篇:运放的“架构师”——BMS信号链中的虚短虚断法则
  • SwiftUI 中 .overlay 两种写法的区别及拓展
  • java和vue开发的图书馆借阅管理系统小程序
  • 在服务器部署JVM后,如何评估JVM的工作能力,比如吞吐量
  • 神经网络常见激活函数 8-SELU函数
  • 《easy3d与vtk数据类型相互转换》
  • vue3+ts+vite+element plus设置日期时间禁止选择小于当前时间精确到时分秒
  • 网络安全网格架构(CSMA) 网络安全框架csf
  • HTML全局属性与Meta元信息详解:优化网页的灵魂
  • DeepSeek-R1的蒸馏
  • 网络安全检查漏洞内容回复 网络安全的漏洞
  • Halcon.Net与Numpy、OpenCV联合编程
  • hi3516cv610用海思arm-v01c02-linux-musleabi-strip工具,对库进行瘦身