搬瓦工安装 Docker 与 Docker Compose:部署、更新、日志和备份

搬瓦工安装 Docker 与 Docker Compose:部署、更新、日志和备份
搬瓦工运维与建站教程 · 部署、更新、日志和备份

Docker 的好处是部署方式更容易重复,但镜像、容器和业务数据并不是同一回事。容器删掉可以重建,数据库卷误删却不一定能找回来。本文从一个只在本机开放的静态网站开始,讲清安装、Compose、日志、更新和备份。

安装命令以新装 Ubuntu 24.04 LTS为例。已经有 Docker、containerd、Podman 或面板管理的容器时,先查现有项目和数据,不要直接卸载再装。系统准备可参考 搬瓦工重装系统教程:Ubuntu / Debian 怎么选。

一、安装前先查现状

容器部署的四个部分
重建容器与删除数据卷是两种不同操作。
cat /etc/os-release
command -v docker || true
command -v containerd || true
dpkg -l | grep -E 'docker|containerd|runc|podman' || true

发行版的 docker.io、旧 Compose、containerd 等可能与 Docker 软件源中的包冲突。按安装文档逐项核对已存在的包和工作负载,不在有业务的服务器执行一长串自动卸载命令。加入 docker 组相当于授予很高的主机管理能力;本例保持使用 sudo。[1]

二、通过软件源安装 Engine 和 Compose 插件

确认这是新的 Ubuntu 部署,且下列 keyring 与 source 文件尚未由其他安装方式管理后再执行:

sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
-o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc. /etc/os-release
sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: ${UBUNTU_CODENAME:-$VERSION_CODENAME}
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
docker-buildx-plugin docker-compose-plugin
sudo systemctl status docker --no-pager
sudo docker version
sudo docker compose version
sudo docker run --rm hello-world

这里只适用于 Ubuntu。Debian 应使用对应仓库,不能只改一个代号混装。docker compose 是本文使用的插件形式,不混用旧的 docker-compose 命令。软件包和镜像下载也会消耗流量。[1]

三、用 Compose 部署一个本地可访问的服务

mkdir -p ~/bwh-demo/site
cd ~/bwh-demo
printf '%s\n' '<h1>BandwagonHost demo</h1>' > site/index.html

把包内 configs/compose.yaml 保存到该目录。示例内容如下:

name: bwh-demo
services:
  web:
    image: ${WEB_IMAGE:-nginx:stable-alpine}
    restart: unless-stopped
    ports:
      - "127.0.0.1:8080:80"
    volumes:
      - ./site:/usr/share/nginx/html:ro
    cpus: "0.50"
    mem_limit: 256m
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"
sudo docker compose config --quiet
sudo docker compose pull
sudo docker compose up -d
sudo docker compose ps
curl -I http://127.0.0.1:8080/

stable-alpine 是会随发布更新的标签,不是永久固定版本。拉取并验证后可以记录镜像摘要,在 .env 中用 WEB_IMAGE=nginx@sha256:实际摘要 固定部署。不要从教程复制一串过期或虚构的摘要。0.50 CPU 和 256 MiB 是本例服务的预算,不代表适合所有程序,也不替代套餐资源规则。[2]

四、理解端口发布,不要只看 UFW

先本地监听,再决定公网入口
不要把 Docker Socket 暴露给公开应用。

本例只绑定 127.0.0.1,管理电脑可通过 SSH 隧道访问。下面在管理电脑运行,SSH 端口换成实际值:

ssh -N -L 8080:127.0.0.1:8080 -p 你的SSH端口 你的用户@VPS_IP

浏览器打开本地 http://127.0.0.1:8080/。保持隧道窗口运行,不需要把服务器的 8080 暴露给全网。

Docker 的端口发布会建立自己的转发规则,不能仅凭 UFW 显示“拒绝 8080”就认定映射端口已被挡住。使用 iptables 或 nftables 后端时,应按实际后端配置来源控制;不要直接清空 Docker 创建的规则。公开网站可通过宿主机 Nginx 的 443 统一入口反代该本机端口。[3]

五、查看日志、资源和数据位置

sudo docker compose logs --tail 100 web
sudo docker stats --no-stream
sudo docker system df -v
sudo docker compose ps -q web

需要检查某容器的挂载时,用它的真实 ID 执行 docker inspect --format '{{json .Mounts}}' CONTAINER_ID。完整 inspect 输出可能包含环境变量和凭据,不要直接发布到论坛。

本例 site 是绑定目录,内容在宿主机项目中;命名卷则由 Docker 管理。数据库不应把唯一数据留在容器可写层。复制数据库卷之前,要使用数据库支持的备份方法,或正确停止写入和数据库后再做冷备份。

日志大小设置应用于容器创建配置,已有容器需要安排重建。不要手动编辑 Docker 的日志文件;先通过 docker compose logs 取证,再处理轮转和程序异常输出。[4]

六、怎样更新和回滚

更新前先保存可回退状态
不要使用 down -v 作为日常更新命令。

更新前保存 Compose、环境变量来源、当前镜像摘要和必要数据。这里的演示站没有数据库,流程相对简单:

sudo docker compose pull web
sudo docker compose up -d web
sudo docker compose logs --tail 100 web
curl -I http://127.0.0.1:8080/

生产项目应先测试新版本,并在维护窗口执行。回滚时把 WEB_IMAGE 调回已验证的旧摘要,再重新创建服务;如果应用已经升级数据库结构,仅回退镜像可能无法启动,需要按应用的迁移与回滚说明处理。

日常更新不需要 docker compose down -v。-v 会涉及数据卷删除,不能当成“重启”使用。清理旧镜像时也先保留上次稳定版本。[2][5]

七、备份与资源限制

运维时优先关注这些
sudo docker 具有很高权限,谨慎授予 docker 组访问。

演示站备份 compose.yaml、必要的 .env 配置和 site 即可;真实应用还要保存数据库导出、附件与其他持久化目录。密钥文件使用受限权限和加密备份,不把凭据放进公开仓库。

给容器设置内存上限后,达到上限可能触发容器 OOM;主机仍有内存也不代表容器能继续申请。CPU 限额则影响可获得的计算时间。出现反复退出先看日志和状态,再对照 搬瓦工 CPU 占用过高导致 VPS 暂停怎么办,不要取消全部限制去掩盖程序死循环。

快照与自动备份 可作为系统变更前的补充。恢复演练应在新项目名、新目录和非公开端口完成,避免把试恢复的服务和线上业务写到同一个数据库。

常见问题

安装 Docker 后,UFW 还能管理所有容器端口吗?

不能这样假定。Docker 发布端口的转发路径与普通主机服务不同,应结合实际网络后端检查。

容器重建会清空绑定目录吗?

正常重建容器不会直接删除绑定目录,但应用本身仍可能修改数据。卷删除、脚本清理和错误挂载是另一类风险。

可以把所有应用都用 latest 吗?

测试方便,但不利于稳定复现。上线记录可验证的版本或镜像摘要,并在更新前检查变更说明。

相关阅读

参考资料

  1. Docker Engine:Ubuntu 安装
  2. Docker Compose:服务配置
  3. Docker:防火墙与端口发布
  4. Docker:json-file 日志轮转
  5. Docker:unused objects 与 prune

微信订阅号

VPS收割者微信公众号

QQ群(全员禁言)

VPS收割者QQ群(全员禁言)