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
相关推荐
czhc11400756636 小时前
c# 1216
windows·microsoft·c#
快乐就去敲代码@!6 小时前
Boot Cache Star ⭐(高性能两级缓存系统)
spring boot·redis·后端·缓存·docker·压力测试
爱学大树锯6 小时前
在Docker环境中安装RabbitMQ延迟消息插件实战记录
docker·容器·rabbitmq
rocksun6 小时前
Rust 异步编程:Futures 与 Tokio 深度解析
数据库·rust
Chen--Xing6 小时前
LeetCode LCR 119.最长连续序列
c++·python·算法·leetcode·rust
Colinnian7 小时前
Android Studio创建新项目时需要更改哪些地方
android·ide·android studio
一周困⁸天.7 小时前
K8s -蓝绿发布与金丝雀发布
docker·容器·kubernetes
轩轩Aminent7 小时前
WSL 中的 Ubuntu 系统中使用 Docker
ubuntu·docker·eureka
程序员老赵7 小时前
TDengine Docker 容器化部署指南
docker·自动化运维