# Docker 构建和运行 ## 镜像结构 镜像使用三个构建阶段 - `oven/bun:1.3.14-debian` 负责编译 Web 静态资源 - `rust:1.97.1-trixie` 负责构建 Rust 和 RocksDB - `debian:trixie-slim` 只保留运行所需的二进制静态资源和 C++ 运行库 最终容器只运行一个非 root `dht-search` 进程 ## 构建 在仓库根目录执行 ```shell docker build --platform linux/amd64 -t dht-search:dev . ``` 构建会复用 Cargo registry Git 和 target BuildKit 缓存 可以使用以下命令检查镜像 ```shell docker image inspect dht-search:dev docker run --rm --entrypoint id dht-search:dev docker run --rm --entrypoint ldd dht-search:dev /dht-search/dht-search ``` ## Compose 运行 在仓库根目录执行 ```shell docker compose up -d --build docker compose logs -f ``` 容器内应用统一位于 `/dht-search` ```text /dht-search/ ├── dht-search ├── config.toml ├── web/ └── data/ ``` Compose 将仓库根目录的 `config.toml` 直接映射到 `/dht-search/config.toml` 网页保存配置时会同步修改宿主机文件 Compose 只创建一个 `dht-search-data` 命名卷并挂载到 `/dht-search/data` RocksDB Tantivy SQLite 日志和检查点全部位于该数据卷 配置保存通常使用临时文件原子替换 在 Docker 单文件挂载环境中会自动改用同步覆盖写入 本地配置保留 `127.0.0.1:8080` `src/web/dist` 和文件日志方便直接运行 容器启动参数会覆盖监听地址和静态目录并将日志切换到容器标准输出 HTTP 默认只发布到宿主机回环地址 UDP DHT 端口默认公开 如果端口冲突可以临时覆盖 ```powershell $env:DHT_HTTP_BIND = "127.0.0.1:18080" $env:DHT_UDP_PORT = "22313" docker compose up -d ``` ## 验证 ```shell curl http://127.0.0.1:8080/health curl http://127.0.0.1:8080/ready docker compose logs -f ``` 浏览器访问 `http://127.0.0.1:8080` 公网访问 Web 应使用反向代理或 SSH 通道 ## 停止和重启 ```shell docker compose stop docker compose start ``` 更新镜像或重新创建容器时执行 `docker compose up -d --build` 即可复用根配置和数据卷 `docker compose down` 只删除容器和网络 不删除数据卷 不要执行 `docker compose down --volumes` 除非已经确认 RocksDB 权威数据和其他运行数据都不再需要 ## 远程设备 远程设备是 x86_64 时构建 `linux/amd64` 需要导出镜像时执行 ```shell docker save dht-search:dev -o dht-search-dev.tar ``` 将文件复制到远程设备后执行 ```shell docker load -i dht-search-dev.tar ```