新建 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