告别环境配置烦恼:基于 Docker 打造丝滑的 All In One远程开发环境

本文最后更新于 2025年11月9日 晚上

频繁切换设备、重复配置开发环境是每个开发者都会遇到的痛点。更糟糕的是,当你尝试让 AI Agent 帮你自动化操作时,一个错误的命令可能就会把你的本地环境搞崩溃。有没有一种方案既能实现环境的快速迁移,又能隔离 AI 操作带来的风险呢?

答案就是:基于 Docker 构建 All In One 远程开发容器。将所有开发环境打包到 Docker 镜像中,部署在服务器上,本地通过 SSH 连接进行开发。这样不仅可以在任何设备上快速接入开发环境,还能让 AI Agent 在隔离的容器中自由操作,即使环境崩溃也只需重启容器,宿主机安然无恙。

容器的优势

想象一下这样的场景:

  1. 周一早上,你坐在办公室的工作站前,代码跑得飞快;
  2. 周二家里用笔记本,发现本地环境和办公室的不一样,花了“亿”点时间调试发现是 Python 版本差了个小版本。
  3. 周三你出差了,带着公司的 MacBook,又要重新配置一遍环境。
  4. 周四你让 AI Agent 帮你自动化部署,结果一个 rm -rf 命令把整个开发环境置空了,本地机器直接进了 “ICU”。

这就是传统本地开发的”魔幻现实”。每个人都在本地配置自己的环境,自由度很高,但团队协作时就成了”环境大乱斗”——你的 Node 版本是 18,我的是 16,他的是 14,谁都不知道代码在别人电脑上能不能跑。

哈哈,有点画面感了

但如果你的开发环境就“住”在远程服务器上呢 🤔?

所有的工具、依赖、配置都被打包进 Docker 容器里,无论你在办公室、家里还是咖啡馆,只要一条 SSH 连接,就能接入完全相同的开发环境。

更妙的是,即使 AI Agent 手滑执行了危险命令,也只是容器崩溃,宿主机毫发无损,重启容器就能“起死回生”。这样既标准化了团队的开发环境,又给了 AI 自由操作的沙箱,还能随时随切换工作地点

graph TB
    A["📱 本地设备<br/>MacBook/Windows/Linux"] -->|SSH 连接| B["🐳 远程服务器"]
    B --> C["容器1<br/>Node.js 环境"]
    B --> D["容器2<br/>Python 环境"]
    B --> E["容器3<br/>Go 环境"]
    C --> F["工作空间<br/>持久化存储"]
    D --> F
    E --> F
    G["AI Agent"] -->|隔离操作| C
    G -->|隔离操作| D
    G -->|隔离操作| E
    H["环境崩溃?"] -->|重置容器| I["✨ 瞬间恢复"]
    
    style A fill:#e1f5ff
    style B fill:#fff3e0
    style C fill:#f3e5f5
    style D fill:#f3e5f5
    style E fill:#f3e5f5
    style F fill:#e8f5e9
    style G fill:#fce4ec
    style I fill:#c8e6c9

当然,你也可以直接 All In One,在云厂商的 Linux 服务器上部署容器,还可以使用云厂商的内网源:

graph LR
    A["💻 本地设备"] -->|SSH 连接| B["🐳 远程 Docker"]
    
    B --> C["容器内环境<br/>Node.js/Python/Go"]
    
    C --> D["📁 代码仓库<br/>Git 操作<br/>编译构建<br/>测试运行"]
    
    E["📦 工作空间<br/>持久化存储"] -.->|挂载| D
    
    G["⚡ 云厂商内网镜像<br/>npm/pip/maven"] -.->|加速依赖安装| D
    
    D -->|❌ 环境崩溃| F["🔄 force-recreate<br/>容器重建"]
    
    F -->|✨ 秒级恢复到初始状态| C
    
    style A fill:#e1f5ff,stroke:#01579b,stroke-width:2px
    style B fill:#fff3e0,stroke:#ff9800,stroke-width:3px
    style C fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
    style D fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px
    style E fill:#fce4ec,stroke:#c2185b,stroke-width:2px
    style F fill:#ffccbc,stroke:#d84315,stroke-width:2px
    style G fill:#fff9c4,stroke:#f57f17,stroke-width:2px,stroke-dasharray: 5 5

接下来,我们就来看看如何构建这套 All In One 远程开发环境。

准备工作

其实准备工作,主要分为两个部分:

  • 构建部分: 构建远程开发容器需要的基础环境。
  • 部署部分: 将容器部署到宿主机上,使用宿主机的算力,容器环境,通过 SSH 连接进行开发。

构建部分

想要打造一个远程开发容器,首先得把它”造”出来。这个过程就像工厂,你需要一个组装厂(构建环境)和一个仓库来存放制品(镜像仓库)。

传统做法是在本地安装 Docker Engine、Docker Desktop,然后手动构建镜像,最后打包成 tar 文件传到服务器上。这个流程不仅繁琐,而且每次更新镜像都要重复一遍,简直是在折磨自己。

优雅的方案是:使用云端构建环境 + 远程镜像仓库

这里推荐一个小技巧,直接用 cnb.cool 来搞定这一切。

CNB 提供了两个核心能力:云开发环境制品库。云开发环境内置了 Docker 支持,可以直接在浏览器里编写 Dockerfile 并构建镜像;制品库则负责存储这些构建好的镜像,方便随时拉取使用。整个流程如下:

graph LR
    subgraph CNB["🌐 CNB 平台"]
        A["☁️ 云开发环境<br/>内置 Docker 支持"]
        B["📦 制品库<br/>镜像存储"]
    end
    
    C["📝 编写 Dockerfile"] --> A
    
    A --> D["🔨 构建、测试、推送镜像"]
    
    D --> B
    
    B --> F["🚀 部署服务器<br/>docker pull"]
    
    F --> G["✅ 运行容器<br/>开发环境就绪"]
    
    style CNB fill:#fff9e6,stroke:#ff9800,stroke-width:3px
    style A fill:#e1f5ff,stroke:#01579b,stroke-width:2px
    style B fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px
    style C fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
    style D fill:#fce4ec,stroke:#c2185b,stroke-width:2px
    style F fill:#e0f2f1,stroke:#00796b,stroke-width:2px
    style G fill:#c8e6c9,stroke:#388e3c,stroke-width:2px

这样做的好处显而易见:

  • 本地轻量化:无需在本地安装 Docker 环境,告别本地磁盘占用。镜像更新只需云端重新构建推送,无需手动传输文件。
  • 网络加速:CNB 对 Docker Hub 提供网络加速,基于官方镜像构建时无需担心网络问题,告别本地网络的不确定性。
  • 版本管理:制品库支持镜像版本控制,可随时回滚到历史版本。同时提供高带宽下载,部署速度更快。

之前也有做过一篇 CNB 的入门文章,可以参考:

甚至,本篇文章,最后实现的效果,就是启发自 CNB 的“云原生开发”。最后实现的效果也类似。可能最大的不同是 CNB 的“云原生开发”用的是 CNB 的算力,而本篇文章的“All In One 远程开发”,是使用宿主机的算力,容器环境

部署部分

相比构建环节,部署就简单多了。你只需要一个 Docker 的环境:

  • Linux 服务器:安装 Docker Engine
  • Windows/macOS:使用 Docker Desktop 或 Rancher Desktop

💡 推荐方案:正如前文说的,优先选择 Linux 服务器部署。即使在本地搭建,也建议使用 Linux 虚拟机 + Docker Engine 的“套娃”组合,这样可以获得更好的性能和稳定性。

部署流程非常直观:

graph LR
    A["🎯 准备 Docker 环境"] --> C["⚙️ 配置容器参数"]
    
    C --> D["📂 挂载工作目录<br/>持久化代码"]
    C --> E["🔌 映射 SSH 端口 → 宿主机端口"]
    
    D --> G["🚀 启动容器<br/>docker run / docker-compose"]
    E --> G
    
    G --> I["💻 本地 IDE 连接<br/>VSCode/JetBrains"]
    
    style A fill:#e1f5ff,stroke:#01579b,stroke-width:2px
    style C fill:#fff3e0,stroke:#ff9800,stroke-width:2px
    style D fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
    style E fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
    style G fill:#fce4ec,stroke:#c2185b,stroke-width:2px
    style I fill:#fff9e6,stroke:#f57c00,stroke-width:2px

核心步骤只有两个:

  • 拉取镜像:从制品库下载构建好的开发环境镜像。
  • 启动容器:挂载工作目录,映射 SSH 端口,配置网络访问。

支持创作

制作教程不易,如果热心的小伙伴,想支持创作,可以加入我们的电圈(还可以解锁远程协助、好友位😃):

WebChart Recognise

志同道合的小伙伴也是知音难觅。

  • 开发者爱好群: 👉 如果你对云服务器、CDN、云数据库和Linux等云计算感兴趣,亦或者喜欢编程、设计、产品、运营等领域,欢迎加入我们的开发者爱好群,一起交流学习(目前可能就我一个人?🤔,毕竟才刚刚创建~)。
QQ_Group Recognise

当然,也欢迎在B站、YouTube或微信公众号上关注我们:

MintimateBlog Recognise

更多:

如果你也想使用腾讯云的轻量应用服务器部署 All In One 的开发环境;那么你可以使用博客的专属链接购买体验:

云原生构建

本次使用 CNB 的云原生进行构建,本次的构建可以参考我的仓库:

正如前文所说,我们可以使用 CNB 的云原生开发:

启动 CNB 的云原生构建

上面有 Docker Engine 的支持,可以直接在浏览器里编写 Dockerfile 并构建镜像:

查看当前 CNB 的 Docker Engine 版本

接下来我们需要编写 Dockerfile 来编写我们的开发环境。

基础镜像

建议基础镜像使用完整的 Debian 系列,这样可以保证系统的完整性,避免出现一些意外情况。

当前的 Debian 镜像,可以到 https://hub.docker.com/_/debian 查看,这里选择了 bookworm-slim 版本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
FROM debian:bookworm-slim

ENV WORKSPACE=/data/workspace
ENV TMP_DIR=/data/temp
ARG TMP_DIR=/data/temp

# 安装 ssh 服务(用于支持 VSCode 客户端通过 Remote-SSH 访问开发环境);
# 脚本必须依赖: unzip、wget/curl、zsh、git
RUN apt update && \
apt install -y \
curl unzip zsh git wget \
openssh-server \
vim \
webp \
locales \
fonts-noto-cjk \
tzdata && \
chsh -s /bin/zsh

# 开启 SSH并修改端口为 36000 (密码将在entrypoint.sh中动态生成)
RUN mkdir /var/run/sshd \
&& sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config \
&& sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config \
&& sed -i 's/UsePAM yes/UsePAM no/' /etc/ssh/sshd_config \
&& sed -i 's/#Port 22/Port 36000/' /etc/ssh/sshd_config

# 生成中文locale并设置字符集
RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \
sed -i '/zh_CN.UTF-8/s/^# //g' /etc/locale.gen && \
locale-gen

# 指定字符集支持命令行输入中文
ENV LANG=zh_CN.UTF-8
ENV LANGUAGE=zh_CN:zh
ENV LC_ALL=zh_CN.UTF-8

# 设置当前的时区为中国上海
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

WORKDIR $WORKSPACE

解释一下 keypoint:

  • 安装基础软件:安装了一些常用的软件,比如 zshcurlunzipwgetgitopenssh-servervimwebplocalesfonts-noto-cjktzdata
  • 开启 SSH 服务:开启了 SSH 服务,并修改了端口为 36000,用于远程登录和。
  • 设置字符集:设置了中文的字符集,以便支持命令行输入中文。
  • 设置时区:设置了上海时区,以便支持时区相关的操作。
  • 设置工作目录:设置了工作目录为 /data/workspace,便于持久化目录和 VSCODE 等工作空间

我们后续是直接 SSH 远程到这个容器内,自然需要初始化一下 SSH 密码或者映射一下宿主机的密钥

我们可以设置一个 entrypoint.sh 脚本,在容器启动时执行,来完成这个操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 检查是否已经生成过密码
PASSWORD_FILE="/data/tmp/root_password.txt"
if [ ! -f "$PASSWORD_FILE" ]; then
echo "首次启动,生成随机强密码..."

# 生成32位随机强密码,包含大小写字母、数字和特殊字符
RANDOM_PASSWORD=$(openssl rand -base64 32 | tr -d "=+/" | cut -c1-32)

# 设置root密码
echo "root:$RANDOM_PASSWORD" | chpasswd

# 保存密码到文件
echo "$RANDOM_PASSWORD" > "$PASSWORD_FILE"
chmod 600 "$PASSWORD_FILE"

echo "随机密码已生成并保存到 $PASSWORD_FILE"
echo "Root密码: $RANDOM_PASSWORD"
else
echo "密码文件已存在,使用现有密码"
EXISTING_PASSWORD=$(cat "$PASSWORD_FILE")
echo "root:$EXISTING_PASSWORD" | chpasswd
echo "Root密码: $EXISTING_PASSWORD"
fi

# 如果存在挂载的SSH密钥,复制到容器内部
if [ -d "/tmp/host-ssh" ]; then
mkdir -p /root/.ssh
cp -r /tmp/host-ssh/* /root/.ssh/ 2>/dev/null || true
chmod 700 /root/.ssh
chmod 600 /root/.ssh/* 2>/dev/null || true
chmod 644 /root/.ssh/*.pub 2>/dev/null || true
chown -R root:root /root/.ssh
fi

到此,一个可以远程 SSH 访问的开发环境就完成了。

开发环境

接下来,我们再融合常见的开发环境即可。比如 Go、Node.js:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 安装 Node.js 22.x 和 yarn
RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \
&& apt-get install -y nodejs \
&& npm install -g yarn

# 安装 Go 1.24.5
RUN mkdir -p ${TMP_DIR} \
&& wget https://go.dev/dl/go1.24.5.linux-amd64.tar.gz -O ${TMP_DIR}/go1.24.5.linux-amd64.tar.gz \
&& tar -C /usr/local -xzf ${TMP_DIR}/go1.24.5.linux-amd64.tar.gz \
&& rm ${TMP_DIR}/go1.24.5.linux-amd64.tar.gz

RUN echo "# Go Version: 1.24.5" >> /root/.zshrc \
&& echo "export PATH=\$PATH:/usr/local/go/bin" >> /root/.zshrc \
&& echo "export GOPATH=/data/go" >> /root/.zshrc \
&& echo "export GOPROXY=https://goproxy.cn,direct" >> /root/.zshrc \
&& echo "export GO111MODULE=on" >> /root/.zshrc

RUN mkdir -p $GOPATH/src $GOPATH/bin $GOPATH/pkg

让我猜测一下

有时候也需要 python 环境,我们这里再按一个 miniconda 的环境:

1
2
3
4
5
# 配置 miniconda
RUN echo "# miniconda" >> /root/.zshrc && \
wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh && \
/bin/bash ~/miniconda.sh -b -p /opt/conda && echo "export PATH=/opt/conda/bin:\$PATH" >> /root/.zshrc && \
rm ~/miniconda.sh

最后的 Dockerfile 就完成了:

镜像整合完毕

构建镜像

和以往一样,我们使用 docker build 命令进行镜像的构建:

1
docker build -t devbox:latest .

在云原生的构建环境内测试构建

当然,在推送到制品库之前,我们需要先进行一些测试,比如:

1
docker run -it --rm devbox:latest zsh

![进入容器内进行简单测试](https://imagehost.mintimate.cn/post_aioDevContainer/devboxDockerfileTest2.webp

接下来,我们就可以将镜像推送到制品库了。

![]

制品库托管

制品库我们依旧使用 CNB,可以参考官方的教程:

我们这里就写一个流水线,在 Tag Push 时自动触发构建:

制品库流水线

构建后,可以在制品库中查看构建的镜像:

查看制品库中的镜像

部署开发环境

接下来,我们就在目标服务器中部署我们的开发环境。正如前文所说,建议在 Linux 服务器上操作,可以直接使用云厂商的镜像源,同时也可以发挥我们 SSH 的优势,直接通过 SSH 连接到服务器上的容器进行操作。

使用的腾讯云CVM

建议配置: 最少需要 4G 内存以上的服务器,以便支持开发环境。如果跑的业务比较多,可以适当增加内存。

在安装好了 Docker 后,我们创建一个 docker-compose.yml 文件,用于启动我们的开发环境:

1
2
3
4
5
6
7
8
9
10
11
12
13
# docker-compose.yml
services:
devbox:
image: docker.cnb.cool/mintimate/code-nest/cloud-base-devbox/all-in-one:latest
container_name: devbox
restart: unless-stopped
volumes:
- /root/.ssh:/tmp/host-ssh:ro
- ./workspace:/workspace
ports:
- 36000:36000
tty: true
stdin_open: true

启动开发环境

之后,使用 docker 相关命令,你可以直接进入容器内:

1
docker exec -it devbox zsh

进入容器内

当然,我的制作的这个镜像是支持 ARM64 和 AMD64 架构的。所以,你也可以再 ARM64 架构设备上使用这个镜像,比如: Kali Arm64 系统。

在 Kali Arm64 系统上使用

接下来,我们看看本地如何使用这个容器。

使用指南

刚刚我们在镜像的构建阶段,就已经把 SSH 配置上去了,自然是为了容器启动后,本地的 VSCODE、JetBrains 可以直接通过 SSH 连接到容器内进行开发。

以 Codebuddy 为例,我们需要在 Codebuddy 中配置一个 SSH 连接,然后就可以直接在 Codebuddy 中进行开发了:

在 Codebuddy 中配置 SSH 连接

之后再双击 Item 即可:

使用 Codebuddy 进入远程开发容器内

这样的好处是,AI Agent 在容器内“大闹天宫”、“为所欲为”后,我们的宿主机环境也不会有影响。

演示的是 Codebuddy,同理在 VSCODE 和 JetBrains 等 IDE 上也是一样的(只要是支持 IDE 远程连接的,基本上主流 IDE 都支持)。

还是很有趣的

常见问题

通篇下来,你肯定也有很多的疑问。

如何配置镜像源

如果你部署的服务器是云厂商的(比如腾讯云、阿里云等),强烈建议配置对应的内网镜像源,可以大幅提升依赖安装速度。以下是各个工具的镜像源配置方法(以腾讯云为例):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# APT 配置腾讯云镜像源(Debian)
sudo sed -i 's|deb.debian.org|mirrors.cloud.tencent.com|g' /etc/apt/sources.list
sudo sed -i 's|security.debian.org|mirrors.cloud.tencent.com|g' /etc/apt/sources.list
sudo apt update

# Miniconda 配置清华软件源
echo "channels:
- defaults
show_channel_urls: true
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud" > ~/.condarc

# Python pip 配置腾讯云镜像源
mkdir -p ~/.pip
echo "[global]
index-url = https://mirrors.cloud.tencent.com/pypi/simple
trusted-host = mirrors.cloud.tencent.com" > ~/.pip/pip.conf

# Go 配置腾讯云镜像源
echo "export GO111MODULE=on" >> ~/.zshrc
echo "export GOPROXY=https://mirrors.cloud.tencent.com/go/,direct" >> ~/.zshrc
source ~/.zshrc

# Node.js npm 和 yarn 配置腾讯云镜像源
npm config set registry https://mirrors.cloud.tencent.com/npm/
yarn config set registry https://mirrors.cloud.tencent.com/npm/

配置完镜像源后,依赖安装速度会有显著提升,特别是在云服务器内网环境下。

容器占用空间过大

首先,如何确定一个容器占用空间过大?

1
2
# 查看各个容器的占用空间
docker system df -v

查看容器占用空间过大的容器

如果看到容器确实很大,可以看看是不是有很多核心转储文件(core dump)

1
2
# 查看核心转储文件
sudo find /var/lib/docker/overlay2 -name "core*" -type f -size +500M -exec ls -lh {} \; 2>/dev/null

这些文件是容器内进程崩溃时生成的,用于调试。你可以直接删除这些文件:

1
2
# 删除核心转储文件
sudo find /var/lib/docker/overlay2 -name "core*" -type f -size +500M -exec rm -f {} \; 2>/dev/null

END

其实呢? 我们这篇文章,就是一个云原生开发环境的制作教程。

云原生这个概念其实已经非常流行了,使用云原生技术来构建一个 All In One 的开发环境,确实是一个非常好、非常酷的选择。希望大家也可以通过这篇文章,感受到云原生带来的便利。

最后,如果你觉得本篇教程对你有帮助,欢迎加入我们的开发者交流群: 812198734 ,一起交流学习,共同进步。



告别环境配置烦恼:基于 Docker 打造丝滑的 All In One远程开发环境
https://www.mintimate.cn/2025/11/09/aioDevContainer/
作者
Mintimate
发布于
2025年11月9日
许可协议