单元五 Docker 发布与部署 · 第 21 课
正式部署:让它一直运行
第 19 课的容器关掉终端就停了。这一课把运行方式写进一个配置文件,让周报助手在后台一直运行,服务器重启后也能自动恢复。
本课目标
- 理解 Docker Compose 的作用,写好
compose.yaml。 - 用 Compose 在后台运行周报助手,学会查看状态和日志。
- 验证服务器重启后服务会自动恢复。
先懂概念:把命令写成配置
第 19 课的 docker run 命令又长又容易打错,而且每次都要重新输入。Docker Compose 把这些参数写进一个 compose.yaml 文件,以后只需要:
docker compose up -d文件就是部署的“说明书”:用哪个镜像、读哪个 .env、映射哪个端口、挂了要不要自动重启,一目了然。以后再加 HTTPS 等服务,也只是在这个文件里多写一段。
YAML 格式靠缩进表示层级,必须用空格,不能用 Tab 键,同一层级的缩进要对齐。
跟着做
以下命令都在服务器上运行。
1. 写 compose.yaml
cd ~/apps/weekly-report
cat > compose.yaml <<'EOF'
services:
app:
image: 你的用户名/weekly-report:v1
env_file: .env
restart: unless-stopped
ports:
- "127.0.0.1:3000:3000"
EOF粘贴前把 你的用户名 改成你的 Docker Hub 用户名。也可以用 vim compose.yaml 手动输入,正好练习上一单元的 Vim。
| 配置 | 意思 |
|---|---|
services | 要运行的服务清单,这里只有一个叫 app 的服务 |
image | 用仓库里的哪个镜像、哪个版本 |
env_file | 从同一文件夹的 .env 读取环境变量 |
restart: unless-stopped | 程序崩溃或服务器重启后自动拉起来,除非你手动停止 |
ports | 只在服务器本机开放 3000 端口,外网访问不到 |
检查配置有没有写错:
docker compose config --quiet && echo 配置正确2. 启动
docker compose up -d-d 表示在后台运行,命令执行完终端就还给你了。
3. 查看状态和日志
docker compose psSTATUS 一列显示 Up 表示正在运行。
docker compose logs -f app实时查看日志,按 Ctrl + C 停止查看。这只是停止查看,服务本身仍在运行。
4. 访问
和第 19 课一样,在自己电脑上建立隧道:
ssh -L 3000:127.0.0.1:3000 ai-server浏览器打开 http://localhost:3000。这次即使你退出 SSH,周报助手也在服务器上照常运行。
5. 重启服务器试试
sudo rebootSSH 连接会断开。等一分钟后重新登录:
ssh ai-server看到服务器的提示符后,再运行:
cd ~/apps/weekly-report
docker compose ps周报助手已经自动恢复运行了。
常用命令
都要在 compose.yaml 所在的文件夹里运行:
| 命令 | 作用 |
|---|---|
docker compose up -d | 按配置启动;配置改了再运行一次就会按新配置重建 |
docker compose ps | 查看状态 |
docker compose logs -f app | 实时日志 |
docker compose restart app | 重启服务 |
docker compose down | 停止并删除容器(镜像和 .env 都还在) |
docker compose pull | 从仓库拉取配置里写的镜像 |
你应该看到
docker compose ps显示app服务Up。- 通过隧道能正常使用周报助手。
- 重启服务器后,服务自动恢复。
常见问题
yaml: line X: ... 之类的报错? 缩进有问题。检查有没有用 Tab、同一层级是否对齐、冒号后面有没有空格。
pull access denied? image 里的镜像名写错了,或者仓库是私有的但没有登录。和 Docker Hub 网页上的名字对照一下。
docker compose ps 显示 Restarting,一直在重启? 程序启动就出错了,用 docker compose logs app 看报错。
提示 3000 端口已被占用? 第 19 课的测试容器可能还在运行,docker ps 找到它并 docker stop。
自检
- 我能说出
compose.yaml里每一项的作用。 - 周报助手在后台运行,
docker compose ps显示Up。 - 我知道
logs -f按Ctrl + C只是停止查看。 - 重启服务器后服务自动恢复。