docker-compose.yml示例:
version: "3.8"
services:
baota:
image: btpanel/baota:latest
container_name: baota
restart: unless-stopped
ports:
- "38888:8888" # 宝塔面板
- "8080:80" # HTTP
- "8443:443" # HTTPS
- "33306:3306" # MySQL(可选)
- "22022:22" # SSH(可选)
volumes:
- ./www:/www
- ./data:/data
environment:
- TZ=Asia/Shanghai
用途:日常敲命令、查错、运维用
适用人群:你已经会用 Docker,但记不住参数
==================== Docker Compose 常用命令 ====================
【生命周期】
docker compose up -d 启动所有服务(后台)
docker compose down 停止并删除容器
docker compose restart 重启所有服务
docker compose stop 停止服务
docker compose start 启动已存在容器
docker compose pause 暂停容器
docker compose unpause 恢复容器
【状态与日志】
docker compose ps 查看运行中的容器
docker compose logs 查看所有日志
docker compose logs -f 实时查看日志
docker compose logs 服务名 查看指定服务日志
docker stats 查看容器资源占用
【镜像管理】
docker compose pull 拉取最新镜像
docker images 查看本地镜像
docker rmi 镜像名 删除镜像
【清理】
docker system prune 清理无用容器、镜像、网络
docker system prune -a 清理所有未使用资源
docker volume prune 删除未使用的 volume(谨慎)
【配置检查】
docker compose config 检查 yml 语法
docker compose version 查看版本
【进入容器】
docker exec -it 服务名 bash
exit
【宝塔常用】
docker compose up -d
docker compose ps
docker compose logs baota
docker compose restart baota
docker compose stop
用途:写 docker-compose.yml时的参考手册
特点:解释 + 示例 + 实战用法
==================== Docker Compose YML 用法 ====================
【最小结构】
version: "3.8"
services:
app:
image: nginx
【image】
services:
baota:
image: btpanel/baota:latest
【container_name】
container_name: baota
# 添加的资源限制 ↓
mem_limit: 2g
cpus: "1.5"
【ports】
ports:
- "宿主机端口:容器端口"
ports:
- "38888:8888"
【volumes】
volumes:
- 宿主机路径:容器路径
volumes:
- ./www:/www
【environment】
environment:
- TZ=Asia/Shanghai
【restart】
restart: unless-stopped
【networks】
networks:
- app_net
networks:
app_net:
driver: bridge
【depends_on】
depends_on:
- mysql
【command】
command: nginx -g "daemon off;"
【entrypoint】
entrypoint: ["sh", "-c"]
【宝塔完整示例】
version: "3.8"
services:
baota:
image: btpanel/baota:latest
container_name: baota
restart: unless-stopped
ports:
- "38888:8888"
- "8080:80"
- "8443:443"
volumes:
- ./www:/www
environment:
- TZ=Asia/Shanghai
【PHP + SQLite 示例】
services:
php:
image: php:8.1-fpm
volumes:
- ./app:/var/www/html
【关键字速查】
version 版本
services 服务定义
image 镜像
container_name 容器名
ports 端口映射
volumes 数据卷
environment 环境变量
restart 重启策略
networks 网络
depends_on 依赖关系
command 启动命令
entrypoint 入口点
【最佳实践】
1. 使用 volumes 持久化数据
2. 使用 restart: unless-stopped
3. 一个服务一个容器
4. 宿主机端口不要冲突
5. yml 缩进使用 2 个空格
示例:生产级 Docker Compose 模板(通用)
version: "3.8"
services:
app:
image: btpanel/baota:latest
container_name: baota
restart: unless-stopped
ports:
- "38888:8888"
- "8080:80"
- "8443:443"
volumes:
- ./www:/www
- ./data:/data
environment:
- TZ=Asia/Shanghai
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "5"
networks:
- app_net
networks:
app_net:
driver: bridge
✅ 生产级说明
| 项 | 说明 |
| restart | 服务器重启后自动启动 |
| volumes | 数据不丢 |
| logging | 防止日志撑爆磁盘 |
| networks | 隔离网络 |
| 非 host 模式 | 更安全 |
示例:宝塔 + PHP + SQLite 一键部署(你的项目专用)
version: "3.8"
services:
baota:
image: btpanel/baota:latest
container_name: baota
restart: unless-stopped
ports:
- "38888:8888"
- "8080:80"
- "8443:443"
- "22022:22"
volumes:
- ./www:/www
- ./db:/www/wwwroot/db
environment:
- TZ=Asia/Shanghai
networks:
- baota_net
networks:
baota_net:
driver: bridge
/opt/baota/
├── docker-compose.baota-sqlite.yml
├── www/
│ ├── wwwroot/
│ │ └── 云盘.史记.网络/
│ │ ├── admin/
│ │ │ ├── api.php
│ │ │ └── database.db
│ │ ├── assets/
│ │ └── login.html
├── db/
│ └── database.db
✅ SQLite 数据库 单独挂载
✅ 网站文件 独立目录
✅ 可直接备份 www + db
一键启动命令
docker compose -f docker-compose.baota-sqlite.yml up -d
#查看初始账号密码:
docker logs baota
SQLite 权限修复(常见坑)
docker exec -it baota chown -R www:www /www
docker exec -it baota chmod -R 755 /www
先给结论(最重要 ✅)
容器一旦创建:
❌ docker-compose.yml 里的某些配置改了
✅ 不会自动生效
❌ 必须重建容器才会生效
❌ 重建 = 容器消失(但数据不一定丢)
⚠️ 容器 ≠ 数据
哪些东西“改了也没用”(必须重建)
❌ 以下配置 改了必须重新创建容器
| 配置项 | 原因 |
image | 镜像变了 |
ports | 端口映射 |
volumes | 挂载路径 |
environment | 环境变量 |
container_name | 容器名 |
networks | 网络 |
command | 启动命令 |
entrypoint | 入口 |
✅ 这些都在容器创建时就写死了
哪些东西“改了立即生效”(不用重建)
✅ 容器内可随时改
- 网站代码(在 volume 里)
- 配置文件(nginx.conf / php.ini)
- 宝塔面板设置
- 数据库内容(SQLite / MySQL)
✅ 前提是:在 volume 里
快速启用容器 SSH 的方法
#1,先进入容器:
docker exec -it baota bash
#2,设置 root 密码(默认可能没密码):
whoami
passwd
#3,启动 sshd:
/usr/sbin/sshd
#4,宿主机通过映射的端口连接:
ssh root@宿主机IP -p 映射的宿主机端口
#容器里 sshd 默认不启动
ps aux | grep sshd
#✅ 解决:/usr/sbin/sshd
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config
#✅ 正确、100% 有效的修复(照抄执行)
#✅ 1️⃣ 强制开启密码登录(关键)
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config
#✅ 2️⃣ 强制允许 root 登录
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
#✅ 3️⃣ 确认 root 有密码
passwd root
#✅ 4️⃣ 重载 sshd(不是 restart)
kill -HUP $(cat /var/run/sshd.pid)
#如果报错,直接:
/usr/sbin/sshd -t # 检查配置
/usr/sbin/sshd # 重启