Docker Compose 容器化部署实战:从 Ubuntu 安装到生产上线

容器能启动,不等于服务能上线。真正可用的部署,必须同时解决安装、配置、网络、数据持久化、健康检查、升级和恢复。本教程以 Ubuntu 22.04/24.04 与 Docker Compose 为例,带你完成一套可验证、可维护的生产部署。

一、部署前准备

  • 一台 Ubuntu 22.04 或 24.04 服务器,建议至少 2 核 CPU、2 GB 内存。
  • 具备 sudo 权限的账户;生产环境不建议长期直接使用 root 登录。
  • 安全组只开放实际需要的端口,通常为 22、80、443。
  • 域名可选;需要 HTTPS 时,应提前完成域名解析。

先把服务绑定到服务器本机,再交给 Nginx 或 Caddy 对外提供 HTTPS,可以减少应用端口直接暴露的风险。

二、按官方仓库安装 Docker

sudo apt update
sudo apt install -y 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

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo \"${UBUNTU_CODENAME:-$VERSION_CODENAME}\") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

安装后先验证,不要急着部署业务:

sudo systemctl enable --now docker
sudo docker run --rm hello-world
sudo docker compose version

三、建立清晰的项目目录

sudo mkdir -p /opt/knowhub-demo/html
sudo chown -R "$USER":"$USER" /opt/knowhub-demo
cd /opt/knowhub-demo

创建 html/index.html

<!doctype html>
<html lang="zh-CN">
<meta charset="utf-8">
<title>Know Hub 容器部署验证</title>
<h1>部署成功</h1>
<p>Nginx 正在 Docker 容器中运行。</p>
</html>

四、编写 compose.yaml

services:
  web:
    image: nginx:alpine
    container_name: knowhub-demo-web
    restart: unless-stopped
    ports:
      - "127.0.0.1:8080:80"
    volumes:
      - ./html:/usr/share/nginx/html:ro
    healthcheck:
      test: ["CMD", "wget", "-q", "--spider", "http://127.0.0.1/"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 10s
    security_opt:
      - no-new-privileges:true

这里把容器端口映射到 127.0.0.1:8080,外网无法直接访问 8080,后续由反向代理统一处理域名和证书。restart: unless-stopped 让服务在异常退出或服务器重启后自动恢复。

五、检查配置并启动

cd /opt/knowhub-demo
sudo docker compose config
sudo docker compose pull
sudo docker compose up -d
sudo docker compose ps
sudo docker compose logs --tail=100 web
curl -I http://127.0.0.1:8080

验收标准:

  • docker compose config 没有语法错误。
  • docker compose ps 显示容器为 Up,稍后健康状态为 healthy
  • curl 返回 HTTP 200。
  • 日志中没有循环报错、权限错误或连接失败。

六、用 Nginx 接入域名与 HTTPS

如果服务器已经有宝塔或系统 Nginx,在站点配置中把域名反向代理到:

location / {
    proxy_pass http://127.0.0.1:8080;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

保存前执行 nginx -t,确认语法无误后再平滑重载。证书建议使用 ACME 自动续期,并分别检查 HTTP 跳转、HTTPS 访问和续期任务。

七、生产环境升级与回滚

# 升级前记录当前镜像
sudo docker compose images

# 拉取并重建
sudo docker compose pull
sudo docker compose up -d --remove-orphans

# 验证
sudo docker compose ps
sudo docker compose logs --tail=200
curl -I https://你的域名

生产环境不要长期使用不可控的 latest。应固定镜像版本;升级失败时,把 compose 文件中的镜像标签改回上一版本并重新执行 docker compose up -d

八、上线检查清单

  • 镜像使用明确版本,来源可信。
  • 密码与密钥放在环境变量或 secrets 中,不写进镜像和 Git 仓库。
  • 数据库、上传文件使用命名卷或明确的数据目录。
  • 只暴露必要端口,应用端口优先绑定 127.0.0.1。
  • 配置健康检查、自动重启和日志轮转。
  • 升级前备份,升级后同时验证页面、接口、日志和数据写入。
  • 备份不只“生成成功”,还要定期做恢复演练。

九、常用运维命令

sudo docker compose ps
sudo docker compose logs -f --tail=200
sudo docker stats
sudo docker system df
sudo docker compose restart web
sudo docker compose stop
sudo docker compose start
sudo docker compose down

注意:docker compose down 会删除容器和默认网络;加上 -v 会进一步删除数据卷。没有确认备份前,不要执行带 -v 的删除命令。

官方资料


遇到问题时,请在论坛附上:系统版本、compose.yaml(隐藏密码)、docker compose ps 与最近 100 行日志。信息越完整,越容易一次定位。

Related Articles

Responses