Docker 容器化部署从入门到实战:个人站长的高效运维之路

为什么个人站长需要 Docker

传统的网站部署方式——在服务器上直接安装 Nginx、PHP、MySQL 等环境,然后通过 FTP 上传代码——在网站数量少、业务简单时还能应付。但当你的服务器上运行着多个网站,或者需要频繁迁移、测试新版本时,这种"裸机部署"的弊端就会暴露无遗:

  • 环境冲突:一个网站需要 PHP 7.4,另一个需要 PHP 8.1,在同一台服务器上难以共存
  • 迁移困难:换一台服务器就要从头安装配置所有软件,耗时且容易遗漏
  • 回滚麻烦:升级某个组件后网站出问题了,想回到旧版本往往要重新编译
  • 环境不一致:本地开发环境正常,上传到服务器就报错,排查半天发现是版本差异

Docker 容器化正是为了解决这些问题而生。它并不是什么高深的技术,本质上就是一种"轻量级虚拟机",让你可以把应用和它的依赖环境打包在一起,随处运行。

Docker 核心概念速览

镜像与容器

理解 Docker 最关键的两个概念是镜像容器

  • 镜像(Image):一个只读的模板,包含了运行应用所需的代码、运行时、系统工具、库文件等。你可以把镜像理解为一个"安装包"。
  • 容器(Container):镜像的运行实例。容器可以被创建、启动、停止、删除,就像虚拟机一样,但它比虚拟机轻量得多——因为它共享宿主机的操作系统内核。

打个比方:镜像就像一张 CD 安装盘,容器就像你用这张盘安装并运行起来的游戏。

Dockerfile

Dockerfile 是一个文本文件,里面写着一行行的指令,告诉 Docker 如何构建镜像。比如你要一个运行 PHP 7.4 的环境,Dockerfile 可能是这样的:

FROM php:7.4-fpm
COPY . /var/www/html
RUN docker-php-ext-install mysqli pdo_mysql
EXPOSE 9000

每一条指令都会在镜像中创建一个新的"层",这样下次构建时可以复用已有的层,大大加快构建速度。

Docker Compose

当你的网站需要多个容器协同工作时——比如一个 Nginx 容器做反向代理、一个 PHP-FPM 容器解析 PHP、一个 MySQL 容器存数据——一个个手动启动就太麻烦了。Docker Compose 允许你用一个 docker-compose.yml 文件定义所有服务,然后一条命令全部启动。

实战:用 Docker 部署一个 WordPress 网站

理论讲完了,我们来动手做一个完整的实战——用 Docker 部署一个支持 HTTPS 的 WordPress 站点。

第一步:安装 Docker

在 Ubuntu 22.04 上安装 Docker:

# 卸载旧版本
sudo apt remove docker docker-engine docker.io containerd runc

# 安装依赖
sudo apt update
sudo apt install ca-certificates curl gnupg lsb-release

# 添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 添加软件源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.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 docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 将当前用户加入 docker 组,避免每次输入 sudo
sudo usermod -aG docker $USER
newgrp docker

安装完成后运行 docker --version 确认安装成功。

第二步:创建项目目录

mkdir ~/wordpress-docker
cd ~/wordpress-docker

第三步:编写 docker-compose.yml

version: '3.8'

services:
  db:
    image: mysql:8.0
    container_name: wp_db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword123
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: wppassword123
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - wp_network

  wordpress:
    image: wordpress:6.5-php8.1-fpm
    container_name: wp_app
    restart: always
    depends_on:
      - db
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: wppassword123
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wp_data:/var/www/html
    networks:
      - wp_network

  nginx:
    image: nginx:1.25-alpine
    container_name: wp_nginx
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - wp_data:/var/www/html
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
      - ./ssl:/etc/nginx/ssl
    depends_on:
      - wordpress
    networks:
      - wp_network

volumes:
  db_data:
  wp_data:

networks:
  wp_network:
    driver: bridge

这三个服务分别对应 WordPress 架构中的三部分:MySQL 存数据、PHP-FPM 处理动态请求、Nginx 处理静态文件和反向代理。

第四步:配置 Nginx

创建 nginx.conf:

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

server {
    listen 443 ssl http2;
    server_name yourdomain.com;
    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    root /var/www/html;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_pass wordpress:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff2)$ {
        expires 365d;
        add_header Cache-Control "public, immutable";
    }
}

第五步:启动

mkdir ssl
docker compose up -d
docker compose ps
docker compose logs -f

日常运维命令速查

启动所有容器:docker compose up -d
停止所有容器:docker compose down
重启某个服务:docker compose restart nginx
查看容器日志:docker compose logs -f wordpress
进入容器内部:docker exec -it wp_app bash
拉取最新镜像并重启:docker compose pull && docker compose up -d

Docker 部署的注意事项

数据持久化

容器本身是无状态的——删除容器后里面的数据也会丢失。一定要用 volumes 或 bind mounts 把数据存到宿主机上,就像上面例子中的 db_data 和 wp_data。

资源限制

个人站长的服务器通常配置不高,建议对容器做资源限制,防止某个容器占满所有资源:

services:
  wordpress:
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 256M

安全更新

Docker 镜像需要定期更新。建议每个月执行一次 docker compose pull 拉取最新镜像,然后用 docker compose up -d 重启容器。同时可以用 docker system prune -f 清理不再使用的镜像和卷,释放磁盘空间。

进阶技巧

多站点部署

一台服务器部署多个 WordPress 站点的经典做法是:为每个站点创建一个独立的目录,每个目录里有自己的 docker-compose.yml,使用不同的端口映射。配合 Nginx Proxy Manager 容器做统一的反向代理和 SSL 管理,效率非常高。

CI/CD 自动化

对于自己开发的网站,可以和 GitHub 配合实现自动化部署。在 GitHub 仓库中配置 GitHub Actions,当推送代码到主分支时自动 SSH 到服务器、拉取最新代码、重建镜像并重启容器。这样就实现了"提交即部署"的理想工作流。

总结

Docker 容器化不是大公司才用得上的技术。对于个人站长来说,它解决的是最实际的问题:环境管理、快速部署、轻松迁移。从最简单的 WordPress 部署开始,逐步把更多服务容器化,你会发现服务器管理工作变得前所未有的清爽和高效。

Last modification:July 19th, 2026 at 08:09 am

Leave a Comment