服务器:阿贝云免费云服务器 / 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.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精选营
暂无评论,来抢沙发吧~