\documentclass[a4paper]{article}
\usepackage[fontset=fandol]{ctex}
\usepackage{amsmath, amssymb}
\usepackage{graphicx}
\usepackage[margin=2.5cm]{geometry}
\usepackage[most]{tcolorbox}
\usepackage{etoolbox}
\usepackage{listings}
\usepackage{hyperref}
\usepackage{booktabs}
\usepackage{float}
\newtcolorbox{knowledgebox}[1]{enhanced, colback=blue!5!white, colframe=blue!75!black, colbacktitle=blue!75!black, coltitle=white, fonttitle=\bfseries, title=#1, attach boxed title to top left={yshift=-2mm, xshift=2mm}, boxrule=1pt, sharp corners}
\newtcolorbox{importantbox}[1]{enhanced, colback=yellow!10!white, colframe=yellow!80!black, colbacktitle=yellow!80!black, coltitle=black, fonttitle=\bfseries, title=#1, sharp corners}
\newtcolorbox{warningbox}[1]{enhanced, colback=red!5!white, colframe=red!75!black, colbacktitle=red!75!black, coltitle=white, fonttitle=\bfseries, title=#1, sharp corners}
\lstset{language=Python, basicstyle=\ttfamily\small, keywordstyle=\color{blue}, stringstyle=\color{red!60!black}, commentstyle=\color{green!60!black}, breaklines=true, frame=single, numbers=left, numberstyle=\tiny\color{gray}, captionpos=b, extendedchars=false}
\newcommand{\notetitle}{基于 Docker 的 veRL 环境安装与开发}
\newcommand{\noteauthors}{基于公开课程资料整理}
\newcommand{\notedate}{2025}
\newcommand{\videochannel}{五道口纳什}
\newcommand{\videopublishdate}{2025}
\newcommand{\videoduration}{约20分钟}
\newcommand{\videourl}{}
\newcommand{\videocoverpath}{cover.jpg}
\newcommand{\repourl}{https://github.com/hqhq1025/ai-course-notes}

% Footer with repo info
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\fancyfoot[C]{\thepage}
\fancyfoot[R]{\footnotesize\color{gray}\href{\repourl}{AI Course Notes}}
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0pt}

\begin{document}
\begin{titlepage}\centering
{\Large 课程笔记\par}\vspace{1.2cm}{\huge\bfseries \notetitle\par}\vspace{0.8cm}{\large \noteauthors\par}\vspace{0.3cm}{\large \notedate\par}\vspace{1.2cm}
\ifdefempty{\videocoverpath}{}{\includegraphics[width=0.82\textwidth,height=0.45\textheight,keepaspectratio]{\videocoverpath}\par}
\vfill
\begin{tcolorbox}[width=0.9\textwidth, colback=black!2!white, colframe=black!60, sharp corners]
\textbf{视频作者/频道}：\videochannel\par\textbf{发布日期}：\videopublishdate\par\textbf{视频时长}：\videoduration\par
\ifdefempty{\videourl}{}{\textbf{视频链接}：\href{\videourl}{\nolinkurl{\videourl}}\par}\par
\textbf{项目主页}：\href{\repourl}{\nolinkurl{\repourl}}\par
\end{tcolorbox}
\end{titlepage}
\tableofcontents\newpage

\section{引言}
本期介绍基于 Docker 的 veRL 安装方式，实现无痛的环境配置。

\begin{knowledgebox}{为什么用 Docker？}
传统的 pip install 方式经常遇到 Flash Attention 和 PyTorch 版本依赖冲突。Docker 提供了隔离的、可复现的环境，避免了这些问题。
\end{knowledgebox}

\section{Docker 基本概念}
\subsection{镜像与容器}
\begin{itemize}
  \item \textbf{Image}（镜像）：只读模板，包含操作系统和软件环境
  \item \textbf{Container}（容器）：镜像的运行实例，可读写
  \item 关系类似于``类和``对象
\end{itemize}

\subsection{宿主机与容器}
开发环境：Mac（本地终端）$\to$ 远程 GPU Server $\to$ Docker 容器中运行 veRL。通过 VSCode/Cursor 连接远程容器，实现本地开发体验。

\section{核心命令}
\texttt{docker run -it --rm -v <host>:<container> -w <workdir> <image>:<tag> <cmd>}
\begin{itemize}
  \item \texttt{-it}：交互式终端
  \item \texttt{--rm}：退出后删除容器
  \item \texttt{-v}：磁盘挂载（宿主机目录映射到容器）
  \item \texttt{-w}：设置工作目录
\end{itemize}

\subsection{本章小结}
Docker 是管理复杂 ML 环境的最佳实践。veRL 官方提供了 Docker 镜像，可快速搭建训练环境。

\newpage
\section{落地建议：环境先稳定，再谈训练效率}
对初学者来说，Docker 的最大价值不是“更高级”，而是让训练环境可复制。尤其在远程 GPU + 本地 IDE 的工作流里，只要镜像、挂载和工作目录定义清楚，大部分环境问题都能被提前消掉。

\begin{knowledgebox}{推荐的最小工作流}
\begin{itemize}
  \item 先用官方镜像验证依赖是否完整
  \item 再用挂载目录保存代码和实验输出
  \item 最后再接入 VSCode Remote 做日常开发
\end{itemize}
\end{knowledgebox}

\subsection{本章小结}
Docker 不是附属工具，而是 ML 工程的基础设施。先把环境复制问题解决，再去优化训练速度，通常更划算。

\newpage
\section{总结与延伸}
\begin{enumerate}
  \item Docker 解决了环境依赖冲突问题
  \item 镜像 $\to$ 容器 $\to$ 磁盘挂载的工作流
  \item VSCode Remote 连接容器实现本地开发体验
\end{enumerate}
\end{document}
