使用 Docker 搭建 Rust Web 应用开发环境及常用中间件配置详解
本指南介绍如何用 Docker 与 Docker Compose 搭建 Rust Web 应用(如 actix-web/axum/rocket 等)的本地开发环境,并集成 MySQL、Redis、Kafka 等常用中间件。适合个人开发、本地测试与小型团队协作。
一、项目目录结构建议
project-root/
├── app/ # Rust 应用源码目录
│ ├── Dockerfile
│ ├── Cargo.toml
│ ├── Cargo.lock
│ └── src/
├── docker-compose.yml
├── mysql-data/
├── redis-data/
└── .env # 环境变量,勿提交敏感信息
二、Rust 应用 Dockerfile 示例
dockerfile
# app/Dockerfile
FROM rust:1.77-alpine AS builder
WORKDIR /app
COPY Cargo.toml Cargo.lock ./
COPY src ./src
RUN apk add --no-cache musl-dev pkgconfig openssl-dev \
&& cargo build --release
# 运行阶段
FROM alpine:latest
WORKDIR /app
RUN apk add --no-cache openssl
COPY --from=builder /app/target/release/app .
EXPOSE 8080
CMD ["./app"]
说明:
- 多阶段构建,最终镜像极小。
openssl-dev
方便使用 Diesel、SQLx 等依赖 MySQL/SSL 的库。- 若用其他原生依赖,需补充包管理器安装。
三、docker-compose.yml 配置示例
yaml
version: "3.9"
services:
app:
build:
context: ./app
dockerfile: Dockerfile
container_name: rust-web-app
ports:
- "8080:8080"
environment:
DATABASE_URL: mysql://devuser:devpass@mysql:3306/devdb
REDIS_URL: redis://redis:6379
KAFKA_BROKERS: kafka:9092
volumes:
- ./app:/app # 开发可选热重载
depends_on:
- mysql
- redis
- kafka
mysql:
image: mysql:8.0
container_name: mysql
restart: always
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: devdb
MYSQL_USER: devuser
MYSQL_PASSWORD: devpass
volumes:
- ./mysql-data:/var/lib/mysql
redis:
image: redis:7
container_name: redis
restart: always
ports:
- "6379:6379"
volumes:
- ./redis-data:/data
zookeeper:
image: bitnami/zookeeper:3.8
container_name: zookeeper
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
ports:
- "2181:2181"
kafka:
image: bitnami/kafka:3.5
container_name: kafka
depends_on:
- zookeeper
environment:
KAFKA_BROKER_ID: 1
KAFKA_CFG_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_CFG_LISTENERS: PLAINTEXT://:9092
KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
ALLOW_PLAINTEXT_LISTENER: "yes"
ports:
- "9092:9092"
说明:
- Rust 应用通过环境变量连接中间件,host 用 compose 服务名(如 mysql、redis、kafka)。
- 挂载
./app:/app
便于本地代码热更新(需结合 cargo-watch 等工具)。
四、Rust 应用中间件连接示例
假设使用 actix-web、sqlx、redis、rdkafka 等库:
rust
// MySQL (sqlx)
let db_url = std::env::var("DATABASE_URL").unwrap();
let pool = sqlx::MySqlPool::connect(&db_url).await?;
// Redis
let redis_url = std::env::var("REDIS_URL").unwrap();
let client = redis::Client::open(redis_url)?;
// Kafka (rdkafka)
let kafka_brokers = std::env::var("KAFKA_BROKERS").unwrap();
// 用 kafka_brokers 初始化 rdkafka consumer/producer
- 配置统一用环境变量,便于多环境切换。
五、开发和运行流程
-
准备代码和依赖
- 在
app
目录编写 Rust Web 应用,Cargo.toml 加入所需依赖(如 actix-web、sqlx、redis、rdkafka 等)。
- 在
-
构建和启动所有服务
bashdocker compose up -d --build
-
查看服务状态和日志
bashdocker compose ps docker compose logs -f app
-
访问应用
- 访问 http://localhost:8080
- 用 Postman/curl 验证业务接口
六、常见注意事项
-
端口冲突
- 确认本机未占用 8080、3306、6379、9092、2181 等端口,或适当调整端口映射。
-
依赖服务就绪
depends_on
仅保证启动顺序,Rust 应用需实现数据库/中间件连接失败的重试机制。
-
热重载开发
-
推荐用 cargo-watch 实现代码变动自动编译重启。
-
Dockerfile(开发版)可加:
dockerfileRUN cargo install cargo-watch CMD ["cargo", "watch", "-x", "run"]
-
或本地运行 cargo watch,容器仅承载中间件。
-
-
数据持久化
- 挂载本地数据卷,防止中间件数据丢失,勿将数据卷目录提交到 git。
-
配置安全
.env
存放敏感参数,勿上传到代码仓库。生产环境配置应通过 CI/CD 或 secrets 管理。
-
Kafka 配置
- Kafka 依赖 Zookeeper,须确保其正常启动。
- 生产环境建议加鉴权和更严格的网络隔离。
-
数据库初始化
- 可将初始化 SQL 文件挂载到
/docker-entrypoint-initdb.d/
(MySQL)。
- 可将初始化 SQL 文件挂载到
-
健康检查
- 可为各服务添加 healthcheck 提升健壮性。