通过 Docker 容器在 VS Code 中进行 R 编程
曾经试图与同事分享 R 代码,却花费大量时间调试”在我机器上能跑”的问题?Docker 容器就像代码的集装箱——将 R 环境、库和依赖打包到密封容器中,在任何地方都能以相同方式运行。此外,你还可以使用 Docker Hub 上的数万个预构建镜像——这些是软件开发者发布的即用环境,让你免去手动安装软件的麻烦。本教程将教你如何使用 VS Code 和 Docker Desktop 在隔离、可重现的环境中运行 R。
核心概念
- Docker Desktop - 在计算机上运行容器的应用,管理隔离环境
- Dev Container - VS Code 功能,允许在 Docker 容器内编写代码,具有完整 IDE 支持
- 容器隔离 - 代码在独立 Linux 环境中运行,只能看到项目文件夹,而非整个计算机
- Rocker - 为 R 开发设计的预构建 Docker 镜像
准备工作
- 已完成 在 VS Code 中运行 R
- 已完成 版本控制入门指南
- 20-25 分钟
步骤 1:安装 Docker Desktop
- 访问 Docker Desktop 下载页面
- 点击 Download for Windows(或根据系统选择 Mac/Linux)
- 运行安装程序并按照向导操作
- 出现提示时,启用 WSL 2(Windows 用户)或接受默认设置
- 安装完成后,启动 Docker Desktop
- 等待 Docker 引擎启动(左下角显示绿色状态指示器)
步骤 2:安装 Dev Containers 扩展
- 打开 VS Code
- 点击左侧边栏的 Extensions 图标(或 View > Extensions)
- 在搜索框输入
dev containers - 找到 Microsoft 的 Dev Containers
- 点击 Install
步骤 3:使用 GitHub Desktop 克隆 Vibe 项目
- 打开 GitHub Desktop
- 点击 File > Clone repository
- 点击 URL 选项卡
- 在 Repository URL 字段粘贴:
https://github.com/gexijin/vibe - 选择保存项目的位置(Local Path 字段)
- 点击 Clone
- GitHub Desktop 会将项目下载到所选位置
步骤 4:在 VS Code 中打开项目
- VS Code 中,点击 File > Open Folder
- 导航到刚克隆的
vibe文件夹 - 点击 Select Folder
- 资源管理器(Explorer)侧边栏会显示项目文件
步骤 5:在容器中重新打开
- 查找右下角通知:Folder contains a Dev Container configuration file
- 点击 Reopen in Container
- 如果没看到通知,点击左下角的 >< 图标
- 从菜单选择 Reopen in Container
- VS Code 会构建容器(首次需 5-10 分钟)
- 会显示构建步骤的进度通知
- 完成后,左下角的 >< 图标会显示 Dev Container: R in Docker (AMD64)
Apple Silicon Mac:此镜像是为 Intel/AMD 处理器构建的。Docker Desktop 会通过模拟运行它,因此首次构建和 R 本身会慢一些,但一切都能正常工作。
注意:容器自动包含 R 扩展和 languageserver 包。Dockerfile 和 devcontainer.json 会处理这些。
步骤 6:了解容器环境
现在你在 Linux 容器内编写代码。让我们探索一下这意味着什么。
- 点击 Terminal > New Terminal 在容器内打开终端
- 检查当前位置:
pwd
会看到 /workspaces/vibe - 这是容器内的项目文件夹。
- 列出文件:
ls
会看到项目中的相同文件:R/、docs/、README.md 等。(以点开头的文件夹,如 .devcontainer/,是隐藏的;ls -a 可以显示它们)
- 尝试向上移动一个目录:
cd ..
ls
只会看到 vibe/ - 容器是隔离的。你无法访问计算机的其他文件夹、桌面或文档。这种隔离确保 R 环境干净且可重现。
- 返回项目文件夹:
cd vibe
步骤 7:逐行运行 R 代码
容器预装了 R 和常用包。让我们运行一个简单的数据分析脚本。
- VS Code 资源管理器中,导航到
R/iris_analysis.R - 点击打开文件
- 会看到分析 iris 数据集的 R 代码
- 点击 View > Command Palette,输入
R: Create R Terminal,然后按 Enter。底部会打开一个带有>提示符的 R 终端(此容器会把代码发送到你正在使用的终端,所以请保持选中这个 R 终端) - 如果 VS Code 询问是否安装 sess 包,点击 Yes(或 Install bundled sess)并等待安装完成。它让 VS Code 能够显示你的图表
- 点击回到
iris_analysis.R,选择第一行:data(iris) - 按
Ctrl+Enter(Windows/Linux)或Cmd+Enter(Mac)运行 - 继续逐行运行每一行
- 运行
head(iris)时,会在终端看到前 6 行 - 运行
summary(iris)时,会看到统计摘要 - 运行
hist()命令时,直方图会显示在 VS Code 内的绘图标签页中 - 也可以选择多行,用
Ctrl+Enter或Cmd+Enter一起运行
步骤 8:运行应用程序
项目包含一个演示 Shiny 应用,用于创建交互式直方图。
- VS Code 资源管理器中,导航到
R/app.R - 点击打开文件
- 会看到 Shiny Web 应用的代码
- 查看编辑器右上角的 ▶ 按钮
- 点击旁边下拉箭头,选择 Run Shiny App
- 应用会启动,并在 VS Code 内的预览标签页中打开
- 如果想改在常用的 Web 浏览器中打开,点击底部面板中的 Ports 标签,然后点击已转发端口旁边的地球图标
- 移动滑块改变直方图区间数 - 图表实时更新
步骤 9:进行简单更改
让我们修改应用,了解开发流程。
- 保持应用运行
- VS Code 中,编辑
R/app.R - 找到第 16 行:
titlePanel("Old Faithful Geyser Data"), - 只修改引号内的文字,保留行末的逗号:
titlePanel("My First R Docker App"),
- 保存文件(File > Save)
- Shiny 扩展会自动重新加载应用
- 如果预览没有自动更新,点击预览标签页顶部的重新加载箭头(或刷新浏览器)
- 标题现在显示自定义文本
步骤 10:了解 Dockerfile(可选)
- VS Code 资源管理器中,导航到
.devcontainer/Dockerfile - 点击打开文件
- 会看到完整配置:
# choose a Dockerhub base image with R, Shiny Server, and tidyverse packages
FROM rocker/shiny-verse:latest
# 1. System deps commonly needed by R packages
RUN apt-get update && apt-get install -y \
libcurl4-openssl-dev libssl-dev libxml2-dev git curl && \
rm -rf /var/lib/apt/lists/*
# 2. R packages for VS Code integration: language server + debugger
RUN R -q -e 'install.packages(c("rstudioapi", "languageserver"), repos="https://cloud.r-project.org")'
# 3. Install Node.js LTS from NodeSource
RUN curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - \
&& apt-get install -y nodejs \
&& npm install -g npm@latest
# 4. Install Claude Code globally (newer npm blocks its setup script unless allowed)
RUN npm config set allow-scripts=@anthropic-ai/claude-code --location=global \
&& npm install -g @anthropic-ai/claude-code
# 5. Give shiny passwordless sudo for updating Claude Code from VS Code
RUN echo 'shiny ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers && \
rm -rf /var/lib/apt/lists/*
# Expose Shiny server port
EXPOSE 3838
关键部分:
FROM rocker/shiny-verse:latest- 预装 R、Shiny 和 tidyverse 的基础镜像RUN apt-get install- R 包所需的 Linux 系统库RUN R -q -e 'install.packages(...)'- 永久安装 R 包RUN curl... && apt-get install -y nodejs- 安装 Node.js,运行 Claude Code 所需RUN npm config set allow-scripts=... && npm install -g @anthropic-ai/claude-code- 全局安装 Claude Code 获取 AI 辅助(第一部分让 Claude Code 能够完成自身的设置,否则较新版本的 npm 会阻止这一步)RUN echo 'shiny ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers- 让容器的用户无需输入密码即可运行sudo claude updateEXPOSE 3838- 为 Shiny 应用打开端口 3838
可用的其他 Rocker 镜像:
rocker/r-ver:4.5.3- 仅 R(特定版本)rocker/rstudio:latest- 带 RStudio Server 的 Rrocker/tidyverse:latest- 带 tidyverse 包的 Rrocker/shiny-verse:latest- 带 Shiny 和 tidyverse 的 R(我们正在使用)
更改基础镜像后,重新构建容器以应用更改。
步骤 11:在 Docker 镜像中安装 R 包(可选)
通过 R 控制台(install.packages())安装的包是临时的,重新构建容器时会消失。要使包永久存在,将它们添加到 Dockerfile 中。
- VS Code 资源管理器中,导航到
.devcontainer/Dockerfile - 点击打开文件
- 在其他 ‘install.packages’ 行下方添加新行以安装
data.table包:RUN R -q -e 'install.packages("data.table", repos="https://cloud.r-project.org")' - 保存文件(File > Save)
- 点击左下角的 >< 图标
- 从菜单选择 Rebuild Container
- VS Code 会用新包重新构建容器(需 2-5 分钟)
- 要验证安装,请打开 R 终端并输入:
library(data.table)
如果加载无错误,则包已永久安装。
下一步
- 创建新 R 脚本 - 在
R/文件夹创建新.R文件,使用内置数据集(如mtcars或iris)编写数据分析代码 - 安装 R 包 - 通过编辑 Dockerfile 并重新构建容器来添加所需包
- 探索 tidyverse - 尝试用
dplyr进行数据操作,用ggplot2和示例数据集进行可视化
故障排除
- Docker Desktop 未运行 - 打开 Docker Desktop,等待绿色状态指示器,然后再重新打开容器
- 容器构建失败 - 检查互联网连接;首次构建会下载约 2GB 数据。点击 Rebuild Container 重试
工作流程概述
此设置提供专业的 R 开发环境:
- VS Code 提供带语法高亮和智能感知的代码编辑器
- Docker 容器运行隔离的 Linux 环境,包含 R 和所有依赖
- Rocker 镜像(
rocker/shiny-verse)包含 R、Shiny、tidyverse 和开发工具 - Dev Container 配置(
.devcontainer/)自动安装用于 R 和 Shiny 的 VS Code 扩展 - 端口转发允许从浏览器访问容器内运行的 Shiny 应用
日常工作流程
一旦设置完成,这是日常例程:
- 启动 Docker Desktop - 打开应用并等待绿色状态指示器(Docker 必须运行)
- 打开 VS Code - 启动 VS Code 并打开项目文件夹
- 在容器中重新打开 - 如果尚未在容器中,点击 >< 图标(左下角)并选择 Reopen in Container
- 编写和运行代码 - 编辑
.R文件,用Ctrl+Enter/Cmd+Enter逐行运行,或用 ▶ Run Shiny App 按钮运行 Shiny 应用 - 保存工作 - 代码文件(
.R、.Rmd)保存到计算机,在会话之间持久存在 - 提交和推送 - 使用 GitHub Desktop 提交更改并推送到仓库
什么是 Docker Desktop?
Docker Desktop 是一个让你在计算机上更轻松使用 Docker 的应用。它提供 Docker 所需的后台服务,还有一个可视化窗口,让你查看和管理容器、镜像、存储以及其他 Docker 资源。
可以把 Docker Desktop 看作容器的控制中心。打开 Docker Desktop 时,它会启动 Docker 引擎。Docker 引擎是 Docker 中真正创建和运行容器的部分。通常你不需要直接操作引擎,因为 Docker Desktop 会替你管理它。
Docker Desktop 做什么?
Docker Desktop 承担几项重要工作:
- 运行 Docker 引擎 - 引擎负责创建和运行装有你的软件的容器。
- 下载镜像 - 镜像是一个现成的起步包,例如装有 R 和常用 R 包的 Linux 系统。在本教程中,项目使用的是 Rocker 项目提供的镜像。
- 构建容器 - Docker 根据本项目中的 Dockerfile 和 Dev Container 设置,创建一个为 R 开发准备好的容器。
- 启动和停止容器 - 需要时,你可以打开、暂停、重启或停止容器。
- 将容器连接到你的文件 - 项目文件夹可以在容器内访问,因此你可以在 VS Code 中编辑文件,而代码在容器中运行。
- 将容器连接到你的浏览器 - 当 Shiny 应用在容器内运行时,Docker Desktop 和 VS Code 协同工作,让你能在 Web 浏览器中打开该应用。
Docker Desktop 在本教程中的作用
有三个部分协同工作:
- Docker Desktop 在你的计算机上运行 Docker 引擎。
- VS Code 提供编辑器,你在其中编写和运行 R 代码。
- Dev Container 提供一个准备好的 Linux 环境,包含 R、R 包以及本项目使用的工具。
当你选择 Reopen in Container 时,VS Code 会请 Docker Desktop 构建或启动项目的容器。应用仍然在你的计算机上运行,但 R 环境位于容器内。这样可以让 R 版本、包和系统工具与计算机的其他部分分开。
Docker Desktop 不会取代 VS Code、R 或 Web 浏览器。它提供运行容器的环境。VS Code 是你工作的地方,R 是你使用的语言,浏览器则是你查看 Shiny 应用的地方。
为什么使用 Docker Desktop?
直接在计算机上安装 R 和所有需要的包,有时会导致版本冲突。一个项目可能需要与另一个项目不同版本的包。Docker Desktop 为每个项目提供独立、可控的环境,帮助避免这些冲突。
例如,如果同学使用相同的项目文件和 Docker 设置,Docker 可以构建一个与你非常接近的环境。这样就不太容易遇到仅仅因为软件版本不同而导致的错误。你的 R 代码和项目文件仍保存在计算机上,而运行它们所需的工具则整理在容器内。
在构建项目或在容器中重新打开项目之前,Docker Desktop 必须已打开并正在运行。如果 Docker Desktop 已关闭,VS Code 将无法启动容器,你可能会看到提示 Docker 未运行的错误。
由 Steven Ge 创建于 2025 年 12 月 7 日。