Docker 容器化部署实战指南:从入门到生产环境
前言
在 2026 年的今天,Docker 已经成为服务器部署的事实标准。无论你是管理一台个人博客服务器,还是搭建复杂的微服务架构,掌握 Docker 容器化技术都是必备技能。本文将从个人站长的实际需求出发,带你从零开始掌握 Docker 的核心概念和实战部署技巧。
一、Docker 是什么?为什么个人站长需要它?
Docker 是一种容器化技术,它将应用程序及其依赖环境打包到一个标准化的单元中。与传统的虚拟机不同,Docker 容器共享宿主机的操作系统内核,启动速度更快、资源占用更少。对于个人站长来说,Docker 带来的最大好处是环境一致性:你可以在本地开发环境中完美复现服务器上的运行环境,再也不会有「在我电脑上明明可以跑」的尴尬。
实际场景举例:你在一台服务器上同时运行了 WordPress 博客、Typecho 博客和一个自写的 Python 爬虫。这三个应用对 PHP 版本、MySQL 版本和扩展模块的要求各不相同。如果用传统方式部署,你需要在同一台服务器上安装多个 PHP 版本和扩展,配置复杂且容易冲突。而使用 Docker,每个应用都在独立的容器中运行,互不干扰。
二、Docker 核心概念速览
在使用 Docker 之前,你需要理解三个核心概念:
镜像(Image):镜像是一个只读模板,包含了运行应用程序所需的全部文件和环境配置。你可以把镜像理解为一个操作系统的快照,里面预装了操作系统、运行环境和应用程序代码。
容器(Container):容器是镜像的运行实例。当你启动一个镜像时,Docker 会在镜像之上创建一个可写层,形成独立的运行环境。容器可以启动、停止、删除,但不会影响镜像本身。
仓库(Registry):仓库用于存储和分发镜像。Docker Hub 是最常用的公共镜像仓库,你可以从上面拉取官方的 Nginx、MySQL、PHP 等镜像,也可以将自己的镜像推送到仓库中。
三、Docker 安装与基础配置
不同操作系统的安装方式略有不同,以下是主流 Linux 发行版的安装命令:
Ubuntu/Debian 系统:
# 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
# 更新包索引并安装依赖
sudo apt-get update
sudo apt-get install -y 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
# 添加稳定版仓库
echo "deb [arch=$(dpkg --print-architecture) 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-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 将当前用户加入 docker 组,避免每次使用 sudo
sudo usermod -aG docker $USER
# 设置 Docker 开机自启
sudo systemctl enable docker
sudo systemctl start docker
# 验证安装
docker --version
docker compose versionCentOS/Rocky Linux 系统:
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo systemctl enable docker
sudo systemctl start docker四、Docker Compose:一站式部署利器
Docker Compose 是 Docker 官方推出的编排工具,允许你通过一个 YAML 文件定义和运行多个容器。对于个人站长来说,Docker Compose 是最实用的工具,你可以用一个文件定义网站的全部组件。
以下是一个典型的 LNMP 架构 docker-compose.yml 配置:
version: '3.8'
services:
nginx:
image: nginx:1.25-alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./www:/var/www/html
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/ssl:/etc/nginx/ssl
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
networks:
- webnet
restart: always
php:
image: php:8.2-fpm-alpine
volumes:
- ./www:/var/www/html
- ./php/php.ini:/usr/local/etc/php/php.ini
- ./php/www.conf:/usr/local/etc/php-fpm.d/www.conf
networks:
- webnet
restart: always
depends_on:
- mysql
mysql:
image: mysql:8.0
ports:
- "127.0.0.1:3306:3306"
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/init:/docker-entrypoint-initdb.d
networks:
- webnet
restart: always
redis:
image: redis:7-alpine
volumes:
- ./redis/data:/data
- ./redis/redis.conf:/usr/local/etc/redis/redis.conf
command: redis-server /usr/local/etc/redis/redis.conf
networks:
- webnet
restart: always
networks:
webnet:
driver: bridge使用这个配置,你只需一条命令就能启动整套 LNMP 环境:
# 创建 .env 文件包含数据库密码等敏感信息
# 启动所有服务
docker compose up -d
# 查看运行状态
docker compose ps
# 查看日志
docker compose logs -f
# 停止所有服务
docker compose down五、Docker 日常运维命令
以下是个人站长最常用的 Docker 命令:
# 查看所有运行中的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
# 进入容器内部
docker exec -it 容器名称或ID /bin/bash
# 查看容器日志
docker logs -f 容器名称
# 查看容器资源占用
docker stats
# 重启容器
docker restart 容器名称
# 清理未使用的镜像、容器和网络
docker system prune -a
# 查看镜像列表
docker images
# 拉取镜像
docker pull nginx:alpine
# 构建镜像(从 Dockerfile)
docker build -t myapp:latest .六、数据持久化与备份策略
容器本身是无状态的,这意味着当容器被删除时,容器内部的数据也会丢失。因此,数据持久化是 Docker 部署中最关键的环节。
数据卷(Volume) 是 Docker 推荐的持久化方式:
# 创建数据卷
docker volume create myapp_data
# 挂载数据卷到容器
docker run -v myapp_data:/var/lib/mysql mysql:8.0
# 备份数据卷
docker run --rm -v myapp_data:/data -v $(pwd)/backup:/backup alpine tar czf /backup/mysql_backup_$(date +%Y%m%d).tar.gz -C /data .
# 恢复数据卷
docker run --rm -v myapp_data:/data -v $(pwd)/backup:/backup alpine tar xzf /backup/mysql_backup_20260728.tar.gz -C /data对于 MySQL 数据库,更推荐使用官方的备份工具:
# MySQL 数据库备份
docker exec mysql_container sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /backup/mysql_all_$(date +%Y%m%d).sql
# 恢复
cat /backup/mysql_all_20260728.sql | docker exec -i mysql_container sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"'七、安全配置要点
Docker 的安全性不容忽视,以下是几个关键配置:
- 不要以 root 用户运行容器中的应用:在 Dockerfile 中创建专用用户
FROM php:8.2-fpm-alpine
RUN addgroup -g 1000 -S appuser && adduser -u 1000 -S appuser -G appuser
USER appuser- 限制容器资源使用:在 docker-compose.yml 中配置资源限制
services:
nginx:
deploy:
resources:
limits:
cpus: '0.5'
memory: 256M
reservations:
cpus: '0.25'
memory: 128M- 使用只读文件系统:对于不需要写文件系统的容器,设置为只读
services:
nginx:
read_only: true
tmpfs:
- /tmp
- /var/run八、常见问题排查
问题一:容器启动后立即退出
排查步骤:
# 查看容器日志
docker logs 容器名称
# 检查退出码
docker inspect 容器名称 --format='{{.State.ExitCode}}'常见原因:启动命令错误、依赖的服务未就绪、配置文件错误。
问题二:端口冲突
# 检查端口占用
sudo netstat -tlnp | grep 80
# 或者
docker ps | grep 端口号问题三:磁盘空间不足
Docker 默认将镜像和容器数据存储在 /var/lib/docker 下,长时间运行会产生大量日志和镜像层数据:
# 查看磁盘占用
docker system df
# 清理所有未使用的数据
docker system prune -a --volumes
# 限制日志文件大小(在 docker-compose.yml 中配置)
services:
nginx:
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"九、从传统部署迁移到 Docker 的实战步骤
如果你现在使用传统的 LNMP 环境(直接在服务器上安装 Nginx、PHP、MySQL),可以按以下步骤迁移:
- 备份所有网站文件和数据
- 在服务器上安装 Docker 和 Docker Compose
- 创建项目目录结构,编写 docker-compose.yml
- 将网站文件放入映射卷中
- 逐个测试服务启动
- 将旧服务停止,新服务上线
- 配置自动启动和监控
总结
Docker 容器化部署虽然有一定的学习曲线,但一旦掌握,它将极大提升你的服务器管理效率。从环境一致性到快速部署,从资源隔离到弹性扩展,Docker 为个人站长带来的好处是实实在在的。建议从小项目开始练习,逐步将你的所有服务都迁移到容器化环境中,你会发现服务器运维变得前所未有的轻松。