← 返回首页

Docker容器化部署指南

docker部署容器化devopsci cd

2026年的开发环境与五年前截然不同。根据Docker官方2026年开发者调查,超过67%的团队已经在生产环境中使用容器化技术,这一数字在2020年仅为31%。Kubernetes不再是巨头的专利,中小型团队通过Docker Compose和轻量级编排工具同样实现了容器化部署。WordPress、Node.js应用、Python爬虫、Django博客——所有这些项目都可以容器化,然后一键部署到任何VPS。

本文提供的是一套可直接落地的容器化部署方案。不讲概念,直接给步骤、给配置、给避坑指南。

什么是Docker容器化?为什么2026年你必须掌握

容器化本质上是将应用程序及其所有依赖打包为一个标准化的单元。这个单元可以在任何支持Docker的环境中一致运行——无论是你本地MacBook、公司Linux服务器,还是云端VPS。

对比传统虚拟机的核心差异:

维度虚拟机Docker容器
启动时间几分钟几秒钟
资源占用完整操作系统,占用GB级共享宿主机内核,MB级
隔离性完全隔离进程级隔离
镜像大小数GB通常数十至数百MB
管理复杂度高(独立OS)低(统一CLI)

对于开发者而言,容器化最大的价值是。你在本地开发环境测试通过的应用,在生产服务器上拥有完全相同的运行环境,不再出现"在我电脑上是好的"这类问题。

Docker部署完整步骤:从零到生产环境(10步)

以下步骤适用于Ubuntu 22.04 LTS服务器,覆盖从安装到自动化部署的完整链路。



推荐配置:

连接服务器后,先做基础安全配置:

# 创建新用户
adduser deploy
usermod -aG sudo deploy

# 设置SSH密钥登录(将本地公钥复制到服务器)
ssh-copy-id deploy@你的服务器IP

# 禁用密码登录和root登录
sudo nano /etc/ssh/sshd_config
# 设置:PasswordAuthentication no
# 设置:PermitRootLogin no
sudo systemctl restart sshd



# 更新系统包
sudo apt update && sudo apt upgrade -y

# 安装必要依赖
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release

# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 添加Docker APT仓库
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 将deploy用户添加到docker组
sudo usermod -aG docker deploy

# 验证安装
docker --version
docker compose version



# 安装Certbot
sudo apt install -y certbot python3-certbot-Nginx 性能调优

# 关闭Nginx(如果正在运行)
sudo systemctl stop nginx

# 申请证书(替换为你的域名和邮箱)
sudo certbot certonly --standalone -d yourdomain.com -d www.yourdomain.com --agree-tos --email your@email.com --non-interactive

证书自动续期配置:

# 测试续期
sudo certbot renew --dry-run



在你的项目根目录创建Dockerfile

# Node.js项目示例
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:20-alpine
WORKDIR /app
ENV NODE_ENV=production
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/index.js"]

Python项目示例:

FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app:app"]



version: '3.8'

services:
  app:
    build: .
    restart: always
    ports:
      - "127.0.0.1:3000:3000"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=${DATABASE_URL}
    networks:
      - web

  nginx:
    image: nginx:alpine
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - /etc/letsencrypt:/etc/letsencrypt:ro
    depends_on:
      - app
    networks:
      - web

networks:
  web:
    driver: bridge



创建nginx.conf

events {
    worker_connections 1024;
}

http {
    upstream app {
        server app:3000;
    }

    server {
        listen 80;
        server_name yourdomain.com www.yourdomain.com;
        return 301 https://$host$request_uri;
    }

    server {
        listen 443 ssl http2;
        server_name yourdomain.com www.yourdomain.com;

        ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

        location / {
            proxy_pass http://app;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_cache_bypass $http_upgrade;
        }
    }
}



使用GitHub Actions实现推送代码后自动部署:

创建.github/workflows/deploy.yml

name: Deploy to VPS

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Deploy to server
        uses: appleboy/ssh-action@v1.0.0
        with:
          host: ${{ secrets.VPS_HOST }}
          username: deploy
          key: ${{ secrets.VPS_SSH_KEY }}
          script: |
            cd /opt/myapp
            git pull origin main
            docker compose -f docker-compose.yml up -d --build

在GitHub仓库Settings → Secrets中配置:



# 启用UFW
sudo ufw enable

# 只开放SSH(修改默认端口)、HTTP、HTTPS
sudo ufw default deny incoming
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# 验证规则
sudo ufw status verbose



# 安装Portainer(轻量级Docker管理界面)
docker volume create portainer_data
docker run -d -p 9000:9000 --name portainer \
    --restart always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v portainer_data:/data \
    portainer/portainer-ce:latest

# 查看容器日志
docker compose -f /opt/myapp/docker-compose.yml logs -f

# 查看资源使用
docker stats



创建backup.sh脚本:

#!/bin/bash
BACKUP_DIR="/opt/backups"
APP_DIR="/opt/myapp"
DATE=$(date +%Y%m%d_%H%M%S)

mkdir -p $BACKUP_DIR

# 备份Docker配置文件
tar -czf $BACKUP_DIR/config_$DATE.tar.gz $APP_DIR

# 保留最近7个备份
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete

加入crontab每日执行:

crontab -e
# 添加:0 3 * * * /opt/backup.sh

2026年最适合Docker部署的VPS推荐

根据实测,以下VPS供应商对Docker支持最好,生态最完善:

腾讯云轻量应用服务器 — 国内首选

:腾讯云轻量应用服务器提供Docker预装镜像,可跳过手动安装步骤直接使用。境内节点延迟低,适合面向国内用户的应用。配合COS对象存储,可以低价存储Docker镜像和备份文件。

:2核2GB/4GB内存/80GB SSD,月付约33元起

:面向国内用户的Web应用、Docker Compose中小规模部署

:https://cloud.tencent.com/

阿里云ECS — 企业级稳定性

:阿里云容器镜像服务(ACR)可托管私有Docker镜像,配合ECS部署实现镜像分发加速。ESS弹性伸缩组可根据负载自动扩缩容,适合流量波动大的业务。

:ECS共享型s6 / 2核4GB / 40GB SSD,按量付费约0.1元/小时起

:企业级应用、需要弹性伸缩的生产环境

:https://www.aliyun.com/

Cloudflare — 边缘部署对比方案

Cloudflare Pages和Workers提供另一种容器化思路:无服务器容器化。你的Dockerfile可以在Cloudflare Pages中构建并部署到全球280+边缘节点,首年每月免费10万个请求。

📌 本文由 AI 辅助生成并经人工审核发布 | TechPassive — AI 驱动的内容测试站点,专注于效率工具与 SaaS 真实评测

对于静态站点和Jamstack应用,这是不需要管理服务器的选择。但需要注意Workers的CPU执行时间限制(每次50ms),不适合计算密集型任务。

:https://www.cloudflare.com/

常见问题与避坑指南

**容器启动后立即退出**:检查docker logs container_name,通常是ENTRYPOINT或CMD指令错误,或.env文件缺失必要变量。

**Nginx 502 Bad Gateway**:确认docker-compose中app服务的端口映射正确(上例中使用127.0.0.1:3000:3000避免对外暴露),Nginx的proxy_pass地址与服务名一致。

:Let's Encrypt证书90天有效期,必须确保Certbot能够停止Nginx并启动standalone服务器。推荐使用webroot方式或Cloudflare DNS验证方式。

**磁盘空间不足**:Docker镜像、日志、临时文件会快速填满磁盘。定期运行docker system prune -a清理未使用的镜像和容器,并配置日志大小限制:

services:
  app:
    # ...
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

:如果使用Docker运行MySQL/PostgreSQL等数据库,必须配置named volume:

services:
  db:
    image: postgres:16-alpine
    volumes:
      - db_data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}

volumes:
  db_data:

下一步:现在开始你的容器化之旅

Docker容器化已经不是可选项,而是2026年开发者的基本技能。从本文的步骤开始,你可以在一个周末内完成从本地开发到生产环境的完整容器化部署。

建议从最小可行性开始:选择一个已有项目,编写Dockerfile,在本地测试通过,然后按照本文步骤部署到VPS。获得第一次成功的自动化部署后,你会理解容器化为什么值得投入。

 在评论区描述你的场景,我可以提供针对性的排查建议。如果本文帮助你了简化了部署流程,欢迎分享给同样在搭建项目的开发者朋友。

🔗 Related Tech Articles

Deep dive into related technical topics:

Docker容器化部署指南
技术标签: docker部署, 容器化
Docker Compose v5 迁移踩坑全记录
技术标签: docker compose, vps
Docker Compose v5 迁移踩坑全记录
技术标签: docker compose, vps
🐳 Docker Dev Environment Hardware
查看推荐 →