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 行日志。信息越完整,越容易一次定位。
Responses