六服务 Docker Compose 编排实战
本服务器六个容器全部由一张 docker-compose.yml 定义。从镜像选择、环境变量、端口映射到持久化卷,一份文件管理所有服务的生命周期。这是典型的"一个 compose 管一台服务器"的极简部署模式。
服务清单
maim-bot-core sengokucola/maibot:latest WebUI 8001
maim-bot-napcat mlikiowa/napcat-docker:latest OneBot 6099
astrbot soulter/astrbot:latest 6185
caddy caddy:2 80 / 443
sqlite-web coleifer/sqlite-web:latest 8120
gsuid_core gsuid-core:runtime 8765
核心配置:一个 service 示例
以主服务 core 为例,典型配置包含镜像、环境变量、端口映射和 volumes 挂载:
services:
core:
container_name: maim-bot-core
image: sengokucola/maibot:latest
environment:
- TZ=Asia/Shanghai
- WEBUI_HOST=0.0.0.0
- MAIBOT_LEGACY_0X_UPGRADE_CONFIRMED=1
ports:
- "18001:8001"
volumes:
- ./docker-config/mmc:/MaiMBot/config
- ./data/MaiMBot:/MaiMBot/data
- ./data/MaiMBot/plugins:/MaiMBot/plugins
- ./data/MaiMBot/logs:/MaiMBot/logs
restart: always
networks:
- maim_bot
networks:
maim_bot:
driver: bridge
命名网络的关键作用
所有容器都加入同一个自定义网络 maim_bot。在这个网络里,容器名就是 DNS 主机名。这意味着 Caddy 配置文件里可以直接写 reverse_proxy maim-bot-core:8001,而不需要查 IP——容器重建后 IP 变了也没关系。
volume 挂载策略
- 配置挂载:把 compose 同目录的配置文件映射进容器,编辑宿主机文件后 reload 容器即可生效。
- 数据挂载:把日志、插件、运行时数据都挂到宿主机
./data/,容器重建不会丢数据。 - 命名卷:Caddy 的证书和配置用命名卷
caddy_data/caddy_config,不对外暴露路径,更安全。
启动与重启
# 首次启动
docker compose up -d
# 修改配置后重启单个服务
docker compose restart caddy
# 查看所有容器状态
docker compose ps
restart: always:所有服务都配了这条。容器意外退出或宿主机重启后,Docker 会自动拉起,不需要手动干预。
为什么不用 systemd 单独管每个服务
单个容器配 systemd 反而更麻烦:每个服务要写 unit 文件、处理依赖顺序、单独管理日志。Docker Compose 把启动顺序(depends_on)、网络拓扑、卷管理和环境变量全部收敛到一份 YAML,运维成本显著更低。