windows下编程IDE使用docker搭建的rust开发环境(Linux)

新建 Dockerfile

------ 没有后缀,首字母大写,纯文本文件。

这是 Docker 官方硬编码的默认文件名,放在构建上下文根目录即可:

bash 复制代码
FROM jklincn/rust-os
RUN apt-get update && apt-get install -y openssh-server && \
    mkdir -p /var/run/sshd && \
    echo 'root:rust' | chpasswd && \
    sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
CMD ["/usr/sbin/sshd", "-D"]

以现成的jklincn/rust-os做底板,里面已有:

-- Ubuntu 22.04

-- rustup + nightly 工具链

-- cargo、rust-analyzer、常见编译依赖

  • RUN apt-get update && apt-get install -y openssh-server && ...更新包索引并安装 openssh-server(提供 sshd 守护进程)。
  • mkdir -p /var/run/sshdsshd 默认把 pid 文件放这里,目录若不存在会启动失败,先手动建好。
  • echo 'root:rust' | chpasswd 把 root 密码设成 rust,方便后面 SSH 登录。
  • sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config 官方配置里默认禁止 root 用密码登录,改成显式允许,否则即使密码对也会被拒。
  • CMD ["/usr/sbin/sshd", "-D"]容器启动时不再执行原来的 bash 或 code-server,而是直接跑 sshd 并让它前台阻塞(-D)。只要 sshd 在,容器就保持"UP"状态;SSH 连接断开也不会影响容器生命周期。

构建命令(注意命令最后面有个点):

bash 复制代码
docker build -t myrust .

如果你非要叫别的名字(比如 MyDockerfile.txt),也可以,但构建时要额外加 -f:

bash 复制代码
docker build -f MyDockerfile.txt -t myrust .

windows下把MyDockerfile.txt 改为Dockerfile

bash 复制代码
ren D:\MyDockerfile.txt Dockerfile
docker build -t myrust .

构建完,使用命令查看已构建的镜像

bash 复制代码
docker images

启动容器(挂载本地的C:\rustproj目录)

bash 复制代码
 docker run -d --name rust-dev -p 2222:22 -p 8080:8080 -v C:\rustproj:/workspace myrust

使用命令查看容器是否启动

bash 复制代码
docker ps

使用ssh命令登录

bash 复制代码
ssh root@localhost -p 2222

密码是:rust

删除SSH旧指纹

如果重建过容器,系统指纹变了,Windows 的 SSH 客户端发现"同一台主机"的密钥变了,会强制断开并报警告。可以使用以下命令删除SSH旧指纹

bash 复制代码
ssh-keygen -R "[localhost]:2222"

日常开发命令

任务 命令(在宿主机 PowerShell 里)
新建项目 docker exec rust-dev cargo new hello
实时编译 docker exec rust-dev cargo watch -x run
进入 Shell docker exec -it rust-dev bash
停容器 docker stop rust-dev
删容器 docker rm rust-dev

把镜像导出成一个 tar.gz 文件(方便拷贝/备份/离线分发):

bash 复制代码
docker save myrust:latest | gzip > myrust.tar.gz

执行完在 当前目录下会生成 myrust.tar.gz(约 1.2 GB)。

到目标机器再导入:

bash 复制代码
gunzip -c myrust.tar.gz | docker load

(Windows 没 gunzip 就用 7-Zip 先解压出 .tar,再 docker load -i myrust.tar)

在rust开发中使用docker版的maridb数据库

创建专用网络(让容器互通)

bash 复制代码
docker network create rust-net

启动 MariaDB(已换国内源,带数据库/用户)

bash 复制代码
docker run -d --name mariadb `
  --network rust-net `
  -e MARIADB_ROOT_PASSWORD=123456 `
  -e MARIADB_DATABASE=rust_demo `
  -e MARIADB_USER=rust `
  -e MARIADB_PASSWORD=rust `
  -p 3306:3306 `
  mariadb:11

停止并删除已启动的Rust 开发容器

bash 复制代码
docker stop rust-dev
docker rm rust-dev

启动 Rust 开发容器(连到同一网络)

bash 复制代码
docker run -d --name rust-dev `
  --network rust-net `
  -p 2222:22 -p 8080:8080 `
  -v C:\rustproj:/workspace `
  -w /workspace `
  myrust:latest

把下面 docker-compose.yml 放到 C:\rustproj,以后

bash 复制代码
docker compose up -d

即可同时拉起两个服务。

bash 复制代码
version: "3.9"
services:
  db:
    image: mariadb:11
    container_name: mariadb
    restart: unless-stopped
    environment:
      MARIADB_ROOT_PASSWORD: 123456
      MARIADB_DATABASE: rust_demo
      MARIADB_USER: rust
      MARIADB_PASSWORD: rust
    ports:
      - "3306:3306"
    networks:
      - rust-net

  rust-dev:
    image: myrust:latest
    container_name: rust-dev
    ports:
      - "2222:22"
      - "8080:8080"
    volumes:
      - C:\rustproj:/workspace
    working_dir: /workspace
    networks:
      - rust-net
    command: /usr/sbin/sshd -D

networks:
  rust-net:

日常命令速查

任务 命令
停两容器 docker stop rust-dev mariadb
删两容器 docker rm rust-dev mariadb
备份数据库 docker exec mariadb mysqldump -uroot -p123456 rust_demo > backup.sql
导入数据 docker exec -i mariadb mysql -uroot -p123456 rust_demo < backup.sql

Windows 本地 VS Code远程到docker rust开发环境

在容器里修改cargo国内镜像源

进入容器

bash 复制代码
docker exec -it rust-dev bash

新建目录

bash 复制代码
mkdir /usr/local/cargo

写入config.toml

bash 复制代码
cat >> /usr/local/cargo/config.toml <<'EOF'
[net]
git-fetch-with-cli = true

[source.crates-io]
replace-with = "tuna"

[source.tuna]
registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"
EOF

升级Rust 工具链nightly(容器内执行)

直接卸载重装

bash 复制代码
rustup toolchain uninstall nightly
rustup toolchain install nightly
rustup default nightly

创建一个hello-db项目示例(在容器里执行)

bash 复制代码
# 进 Rust 容器
docker exec -it rust-dev bash

# 新建示例
cargo new hello-db
cd hello-db

Cargo.toml

bash 复制代码
[package]
name = "hello-db"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
sqlx = { version = "0.8", features = ["runtime-tokio-rustls", "mysql"] }
tokio = { version = "1", features = ["full"] }

src/main.rs

功能:连上数据库 → 统计系统表数量 → 打印结果

rust 复制代码
use sqlx::mysql::MySqlPoolOptions;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let pool = MySqlPoolOptions::new()
        .max_connections(5)
        .connect("mysql://rust:rust@mariadb:3306/rust_demo")  // 注意 host 是 mariadb
        .await?;

    let row: (i64,) = sqlx::query_as("SELECT COUNT(*) FROM information_schema.tables")
        .fetch_one(&pool)
        .await?;
    println!("tables count = {}", row.0);
    Ok(())
}

装插件(仅第一次)

打开 VS Code → 左侧 Extensions 图标 → 搜索并安装:

  • Remote - SSH
  • Remote - SSH: Editing Configuration (自动装)

写 SSH 连接配置(仅第一次)

按 F1 → 选 Remote-SSH: Open SSH Configuration File... → 选 C:\Users<你>.ssh\config

追加:

bash 复制代码
Host rust-docker
    HostName localhost
    Port 2222
    User root

保存后左侧 REMOTE EXPLORER 面板会出现 rust-docker 条目。

  • 点击 rust-docker → 弹窗选 Linux → 输入密码 rust
  • 连接成功后,VS Code 会自动在容器里装 VS Code Server(几十秒)
  • 左下角绿标变成 SSH: rust-docker 表示已远程。

打开 hello-db 项目

File → Open Folder → 输入 /workspace/hello-db → OK

现在 文件树、终端、调试 全部是容器内部环境。

装 Rust 插件(容器内仅第一次)

Extensions 图标 → 搜索 rust-analyzer → Install in SSH: rust-docker

(会自动连带装好 CodeLLDB,可单步调试)

验证

bash 复制代码
cd /workspace/hello-db
rm -f /root/.cargo/config
rm -rf /root/.cargo/registry/index
cargo metadata          # 验证索引能拉下来
cargo run               # 正常编译运行

输出:

bash 复制代码
tables count = 88
相关推荐
日更嵌入式的打工仔21 小时前
Visual Studio 与 Visual Studio Code 区别
ide·vscode
Rust研习社1 天前
关于 Rust Option 的那些事:从基础到常用 API 全解析
rust
问简1 天前
docker 镜像相关
运维·docker·容器
韭菜钟1 天前
WIndows下一键切换网卡IP脚本
windows·网络协议·tcp/ip
Dontla1 天前
go语言Windows安装教程(安装go安装Golang安装)(GOPATH、Go Modules)
开发语言·windows·golang
Benszen1 天前
Docker容器化技术实战指南
运维·docker·容器
Hommy881 天前
【开源剪映小助手】Docker 部署
docker·容器·开源·github·aigc
爱分享的阿Q1 天前
Rust加WebAssembly前端性能革命实践指南
前端·rust·wasm
斯普信云原生组1 天前
Prometheus 环境监控虚机 Redis 方案(生产实操版)
运维·docker·容器
喵了几个咪1 天前
如何在 Superset Docker 容器中安装 MySQL 驱动
mysql·docker·容器·superset