Docker容器化技术已经深刻改变了软件的部署和运维方式。对于站长来说,Docker最大的价值在于环境隔离和一键部署——你不再需要为每个项目折腾PHP版本、数据库配置、扩展依赖,一条命令就能启动完整的运行环境,且多个项目之间互不干扰。
本文将深入讲解Docker在建站场景中的实战应用,从基础概念到Compose编排,从数据持久化到生产环境优化。

一、Docker核心概念速通
镜像(Image):只读的应用模板,包含运行所需的所有文件和配置。类似于ISO安装盘。
容器(Container):镜像的运行实例。轻量级隔离的进程,共享宿主机内核但拥有独立的文件系统和网络。启动速度秒级。
仓库(Registry):存储和分发镜像的服务。Docker Hub是最大的公共仓库,国内可以用阿里云镜像加速。
关键区别:容器≠虚拟机。虚拟机需要完整的Guest OS,启动慢、资源开销大。容器直接共享Host内核,只打包应用及其依赖,轻量高效。
二、Docker安装与镜像加速
CentOS安装:
yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin systemctl start docker && systemctl enable docker
配置国内镜像加速(/etc/docker/daemon.json):
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com",
"https://docker.mirrors.ustc.edu.cn"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"storage-driver": "overlay2"
}
日志限制非常重要——不限制的话,长时间运行的容器日志会撑爆磁盘。
三、Dockerfile编写最佳实践
以PHP应用为例,编写一个优化的Dockerfile:
FROM php:8.2-fpm-alpine
# 安装系统依赖(合并RUN减少层数)
RUN apk add --no-cache \
libpng-dev libjpeg-turbo-dev freetype-dev \
libzip-dev curl icu-dev oniguruma-dev
# 安装PHP扩展
RUN docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) \
gd pdo_mysql mysqli zip intl mbstring opcache bcmath
# 安装Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
# 配置OPcache
RUN { \
echo 'opcache.memory_consumption=256'; \
echo 'opcache.interned_strings_buffer=16'; \
echo 'opcache.max_accelerated_files=10000'; \
echo 'opcache.validate_timestamps=0'; \
echo 'opcache.save_comments=1'; \
} > /usr/local/etc/php/conf.d/opcache-recommended.ini
# 安全配置
RUN { \
echo 'expose_php=Off'; \
echo 'display_errors=Off'; \
echo 'log_errors=On'; \
} > /usr/local/etc/php/conf.d/security.ini
WORKDIR /var/www/html
COPY --chown=www-data:www-data . .
USER www-data
EXPOSE 9000
关键原则:
- 使用Alpine基础镜像,体积小(~50MB vs Debian ~150MB)
- 合并RUN命令减少镜像层数
- 利用构建缓存——不常变的层放前面,常变的放后面
- 使用非root用户运行应用
- 不把敏感信息写进Dockerfile,用环境变量传入
四、Docker Compose编排实战
单容器无法承载完整的Web应用。Docker Compose用一个YAML文件定义多容器应用栈:
# docker-compose.yml — WordPress完整方案
version: '3.8'
services:
nginx:
image: nginx:1.25-alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/ssl:/etc/nginx/ssl
- wordpress_data:/var/www/html
depends_on:
- php
restart: always
networks:
- wp-network
php:
build:
context: ./php
dockerfile: Dockerfile
volumes:
- wordpress_data:/var/www/html
environment:
DB_HOST: mysql
DB_NAME: wordpress
DB_USER: wp_user
DB_PASSWORD: ${DB_PASSWORD}
depends_on:
- mysql
- redis
restart: always
networks:
- wp-network
mysql:
image: mysql:8.0
volumes:
- mysql_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: wordpress
MYSQL_USER: wp_user
MYSQL_PASSWORD: ${DB_PASSWORD}
command: >
--default-authentication-plugin=mysql_native_password
--innodb-buffer-pool-size=512M
--innodb-flush-log-at-trx-commit=2
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
restart: always
networks:
- wp-network
redis:
image: redis:7-alpine
command: redis-server --requirepass ${REDIS_PASSWORD} --maxmemory 256mb --maxmemory-policy allkeys-lru
volumes:
- redis_data:/data
restart: always
networks:
- wp-network
volumes:
wordpress_data:
mysql_data:
redis_data:
networks:
wp-network:
driver: bridge
对应的环境变量文件(.env):
DB_PASSWORD=your_secure_db_password MYSQL_ROOT_PASSWORD=your_root_password REDIS_PASSWORD=your_redis_password
启动和管理:
docker compose up -d # 后台启动 docker compose ps # 查看状态 docker compose logs -f php # 查看PHP日志 docker compose restart php # 重启PHP容器 docker compose down # 停止并删除容器 docker compose down -v # 停止并删除容器+数据卷(危险!)
五、数据持久化与备份
容器是无状态的——删除容器数据就丢失。必须通过Volume挂载持久化关键数据:
# 挂载方式一:命名卷(推荐) volumes: - mysql_data:/var/lib/mysql # 挂载方式二:绑定挂载 volumes: - /data/mysql:/var/lib/mysql
自动备份方案:
#!/bin/bash # 备份MySQL docker compose exec -T mysql mysqldump -u root -p$MYSQL_ROOT_PASSWORD --all-databases | gzip > /backup/mysql_$(date +%Y%m%d).sql.gz # 备份WordPress文件 tar czf /backup/www_$(date +%Y%m%d).tar.gz -C /var/lib/docker/volumes/wp_wordpress_data/_data . # 保留30天 find /backup -name "*.gz" -mtime +30 -delete
六、Docker网络与安全
1. 网络隔离
不同项目的容器使用不同的网络,互不可见:
docker network create project_a docker network create project_b
2. 不暴露数据库端口
MySQL和Redis的端口不要映射到宿主机。只在Docker内部网络中通信:
mysql:
# 不要写 ports 映射
expose:
- "3306"
networks:
- wp-network
3. 只读文件系统
php:
read_only: true
tmpfs:
- /tmp
- /var/run
容器文件系统设为只读,即使被入侵也无法修改文件。
七、Docker性能优化
1. 多阶段构建
FROM composer:2 AS build WORKDIR /app COPY composer.json composer.lock ./ RUN composer install --no-dev --optimize-autoloader COPY . . FROM php:8.2-fpm-alpine COPY --from=build /app /var/www/html
构建阶段安装依赖,最终镜像只包含运行时文件,体积大幅缩减。
2. 资源限制
php:
deploy:
resources:
limits:
cpus: '2'
memory: 512M
reservations:
memory: 256M
防止单个容器耗尽宿主机资源。
3. 健康检查
mysql:
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 30s
timeout: 10s
retries: 3
Docker会定期执行健康检查,自动重启不健康的容器。
八、总结
Docker为建站带来的最大价值是标准化和可复现性。一个docker-compose.yml文件就是一个完整的部署文档——换一台服务器,一条命令就能恢复整个环境。对于同时管理多个网站的站长,Docker让你不再为不同项目之间的环境冲突头疼。核心建议:使用Alpine基础镜像减小体积、必须持久化数据到Volume、不要暴露数据库端口、设置资源限制防止单容器失控。
关注西数资源网,获取更多Docker实战、建站教程和站长资源技术干货!
相关文章
发表评论
评论列表