服务器:阿贝云免费云服务器 / Ubuntu 22.04 LTS 目标:用 Docker Compose 跑通一个 Next.js 前端 + FastAPI 后端 + PostgreSQL 数据库的全栈项目

这篇记录一下我在 Ubuntu 22.04 上从零开始安装 Docker、配置国内镜像源、编写 docker-compose.prod.yml,最终把一个全栈项目跑上线的完整过程。如果你也在用国内网络环境部署,应该能避开不少我踩过的坑。

一、安装 Docker 与 Docker Compose

Ubuntu 22.04 默认源里的 docker.io 虽然能装,但 docker-compose-plugin 经常找不到。建议直接换阿里云或官方源:

# 安装基础依赖
apt update && apt install -y ca-certificates curl gnupg lsb-release

# 添加 Docker 官方 GPG 与源(国内推荐阿里云镜像)
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
  $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list

# 安装
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu jammy stable
apt update && apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

装完后验证:

docker --version          # Docker version 24.x
docker compose version    # v2.x

安装 Docker 与 Docker Compose

二、配置国内 Docker 镜像加速器

国内直接拉 docker.io 很容易超时,必须配加速器。我踩了腾讯、163、阿里云专属加速器几个坑,最后 DaoCloud 公共加速器 最稳:

mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<'EOF'
{
  "registry-mirrors": ["https://docker.m.daocloud.io"]
}
EOF
systemctl daemon-reload && systemctl restart docker

注意:registry-mirrors 地址末尾不要加斜杠,否则可能报 403。

三、项目结构与生产配置

项目根目录 /opt/eduai 结构:

/opt/eduai
├── backend/              # FastAPI
├── frontend/             # Next.js
├── docker-compose.prod.yml
├── .env.prod
└── deploy/nginx.conf

生产 docker-compose.prod.yml 核心要点:

  • API 去掉 --reload,加 --workers 4
  • Web/Api 只绑 127.0.0.1,避免直接暴露;
  • ${VAR:?} 强制必填环境变量;
  • PostgreSQL 数据持久化到命名卷。
services:
  postgres:
    image: postgres:15-alpine
    environment:
      POSTGRES_DB: ${POSTGRES_DB:?}
      POSTGRES_USER: ${POSTGRES_USER:?}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?}
    volumes:
      - pgdata:/var/lib/postgresql/data
    networks:
      - backend

  api:
    build: ./backend
    command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --workers 4
    env_file: .env.prod
    depends_on:
      - postgres
    networks:
      - backend

  web:
    build: ./frontend
    env_file: .env.prod
    depends_on:
      - api
    networks:
      - backend

  nginx:
    image: nginx:1.18-alpine
    ports:
      - "80:80"
    volumes:
      - ./deploy/nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - api
      - web
    networks:
      - backend

volumes:
  pgdata:

networks:
  backend:

四、Dockerfile 国内源

后端 backend/Dockerfile 加清华 pip 源:

ARG PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple
ENV PIP_TRUSTED_HOST=pypi.tuna.tsinghua.edu.cn

前端 frontend/Dockerfile 加淘宝 npm 源:

ENV npm_config_registry=https://registry.npmmirror.com

这三件套(DaoCloud + 清华 pip + 淘宝 npm)基本能覆盖国内大部分镜像拉取和包安装场景。

五、启动与验证

cd /opt/eduai
docker compose -f docker-compose.prod.yml up -d --build

等 20 秒左右,容器冷启动完成后验证:

docker compose ps
curl -s http://127.0.0.1:8000/health

正常应返回:

{"status":"ok","env":"prod"}

六、踩坑总结

现象 原因 解决
Unable to locate package docker-compose-plugin 默认源没这个包 换阿里云 Docker CE 源
拉镜像 i/o timeout docker.io 被墙/慢 配 DaoCloud 镜像加速器
pip/npm install 超时 境外源 Dockerfile 里加清华/淘宝源
COPY /app/public not found Next.js standalone 需要 public 目录 frontend/public/.gitkeep
/health 一开始空响应 API 冷启动慢 等 20 秒或加健康检查重试
时区 aware/naive 报错 PostgreSQL 列是 naive,代码写 aware 统一用 datetime.utcnow() 或落库前 replace(tzinfo=None)

七、小结

阿贝云免费云服务器 上跑 Ubuntu 22.04 + Docker Compose 完全可行。只要提前做好「国内源三件套」配置,大部分网络问题都能避免。这套部署方式后续也方便迁移到任何支持 Docker 的付费主机上。

如果大家对 Dockerfile、Compose 文件或 nginx 反向代理配置感兴趣,可以在评论区留言,我把完整文件贴出来。


关于作者

码农刚子,六年 ERP / 制造业系统开发,专注 C# / .NET / Blazor。 写 PCB 行业 ERP 与多租户 SaaS 的实战与踩坑,不写面试八股。

博客:https://www.coderlog.net/ | 公众号:CSharp精选营