一、Docker为什么重要
2026年,Docker已经成为软件开发和部署的行业标准。根据Stack Overflow开发者调查,超过75%的开发者在使用Docker,容器化部署已经从”进阶技能”变成了”基础技能”。对于站长来说,掌握Docker意味着更简单的环境部署、更可靠的服务运行、更轻松的迁移和扩展。
Docker的核心优势在于”一次构建,到处运行”——将应用及其依赖打包成一个镜像,在任何安装了Docker的环境中都能一致运行,彻底解决了”在我电脑上能跑”的问题。
二、Docker基础概念
2.1 核心概念
- 镜像(Image):应用的只读模板,包含运行应用所需的一切(代码、运行时、库、配置)
- 容器(Container):镜像的运行实例,是一个隔离的轻量级运行环境
- Dockerfile:构建镜像的脚本文件,定义了镜像的构建步骤
- 仓库(Registry):存储和分发镜像的地方,如Docker Hub、阿里云镜像仓库
- Compose:定义和运行多容器应用的工具,使用YAML文件配置
2.2 Docker vs 虚拟机
| 特性 | Docker容器 | 虚拟机 |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 资源占用 | MB级 | GB级 |
| 隔离级别 | 进程级 | 操作系统级 |
| 性能损耗 | 接近原生 | 5-15% |
| 适用场景 | 应用部署、微服务 | 完整操作系统、强隔离 |
三、Docker安装(Debian 12)
# 卸载旧版本
apt remove docker docker-engine docker.io containerd runc -y
# 安装依赖
apt update
apt install ca-certificates curl gnupg -y
# 添加Docker官方GPG密钥
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
# 添加Docker仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(. /etc/os-release && echo ) stable" > /etc/apt/sources.list.d/docker.list
# 安装Docker
apt update
apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
# 验证安装
docker --version
docker compose version
# 将当前用户加入docker组(免sudo)
usermod -aG docker
国内镜像加速:由于网络原因,国内访问Docker Hub较慢,建议配置镜像加速器:
mkdir -p /etc/docker
cat > /etc/docker/daemon.json << 'EOF'
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
EOF
systemctl daemon-reload
systemctl restart docker
四、Docker常用命令
4.1 镜像管理
# 搜索镜像
docker search nginx
# 拉取镜像
docker pull nginx:latest
docker pull mysql:8.0
docker pull php:8.3-fpm
# 查看本地镜像
docker images
# 删除镜像
docker rmi nginx:latest
# 导出/导入镜像
docker save nginx:latest -o nginx.tar
docker load -i nginx.tar
4.2 容器管理
# 运行容器
docker run -d --name my-nginx -p 80:80 nginx:latest
# 查看运行中的容器
docker ps
# 查看所有容器(包括停止的)
docker ps -a
# 停止/启动/重启容器
docker stop my-nginx
docker start my-nginx
docker restart my-nginx
# 进入容器
docker exec -it my-nginx /bin/bash
# 查看容器日志
docker logs my-nginx
docker logs -f my-nginx # 实时跟踪
# 删除容器
docker rm my-nginx
docker rm -f my-nginx # 强制删除运行中的容器
# 查看容器资源使用
docker stats
五、Dockerfile实战:构建自定义镜像
以构建一个PHP+Nginx的WordPress运行环境为例:
# Dockerfile
FROM php:8.3-fpm
# 安装PHP扩展
RUN docker-php-ext-install mysqli pdo_mysql gd opcache
RUN apt update && apt install -y libpng-dev libjpeg-dev libfreetype6-dev
&& docker-php-ext-configure gd --with-freetype --with-jpeg
&& docker-php-ext-install gd
# 安装Redis扩展
RUN pecl install redis && docker-php-ext-enable redis
# 配置PHP
RUN echo "upload_max_filesize = 64M" > /usr/local/etc/php/conf.d/uploads.ini
&& echo "post_max_size = 64M" >> /usr/local/etc/php/conf.d/uploads.ini
&& echo "memory_limit = 256M" >> /usr/local/etc/php/conf.d/uploads.ini
# 设置工作目录
WORKDIR /var/www/html
# 复制代码
COPY . /var/www/html/
# 设置权限
RUN chown -R www-data:www-data /var/www/html
EXPOSE 9000
CMD ["php-fpm"]
构建镜像:
docker build -t my-php:8.3 .
六、Docker Compose:多容器编排
实际项目中,一个Web应用通常需要多个容器协同工作(Nginx + PHP + MySQL + Redis)。Docker Compose可以一键编排这些容器。
6.1 WordPress完整部署示例
创建docker-compose.yml:
version: '3.8'
services:
nginx:
image: nginx:latest
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/ssl:/etc/nginx/ssl
- ./wordpress:/var/www/html
depends_on:
- php
restart: always
php:
build: ./php
volumes:
- ./wordpress:/var/www/html
- ./php/php.ini:/usr/local/etc/php/php.ini
depends_on:
- mysql
- redis
restart: always
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: your_root_password
MYSQL_DATABASE: wordpress
MYSQL_USER: wp_user
MYSQL_PASSWORD: your_db_password
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/conf:/etc/mysql/conf.d
restart: always
redis:
image: redis:7-alpine
command: redis-server --requirepass your_redis_password
volumes:
- ./redis/data:/data
restart: always
phpmyadmin:
image: phpmyadmin:latest
ports:
- "8080:80"
environment:
PMA_HOST: mysql
PMA_USER: root
PMA_PASSWORD: your_root_password
depends_on:
- mysql
restart: always
6.2 启动与管理
# 启动所有服务(后台运行)
docker compose up -d
# 查看服务状态
docker compose ps
# 查看日志
docker compose logs -f nginx
docker compose logs -f --tail=100
# 停止所有服务
docker compose down
# 重新构建并启动
docker compose up -d --build
# 进入某个服务
docker compose exec php /bin/bash
七、数据持久化与备份
7.1 Volume挂载
容器是临时的,数据必须通过Volume挂载到宿主机:
# 命名Volume
docker volume create mysql-data
docker run -d -v mysql-data:/var/lib/mysql mysql:8.0
# 绑定挂载(推荐,便于管理)
docker run -d -v /data/mysql:/var/lib/mysql mysql:8.0
7.2 容器数据备份
# 备份MySQL数据库
docker exec mysql-container mysqldump -u root -p password database_name > backup.sql
# 备份Volume
docker run --rm -v mysql-data:/data -v $(pwd):/backup alpine tar czf /backup/mysql-backup.tar.gz -C /data .
八、Docker安全最佳实践
- 使用非root用户运行容器:在Dockerfile中创建普通用户并切换
- 镜像最小化:使用alpine基础镜像,只安装必要的依赖
- 不要在镜像中存储敏感信息:使用环境变量或Secret管理密码
- 限制容器资源:使用–memory和–cpus限制容器资源使用
- 定期更新基础镜像:及时修复安全漏洞
- 使用只读文件系统:对于不需要写入的容器,使用–read-only
- 不要使用–privileged:除非绝对必要,否则不要开启特权模式
九、Docker监控与日志
9.1 资源监控
# 查看容器资源使用
docker stats
# 使用cAdvisor(Google开源的容器监控工具)
docker run -d --name=cadvisor -p 8080:8080
-v /:/rootfs:ro -v /var/run:/var/run:ro
-v /sys:/sys:ro -v /var/lib/docker/:/var/lib/docker:ro
gcr.io/cadvisor/cadvisor:latest
9.2 日志管理
# 配置Docker日志驱动(限制日志大小)
cat > /etc/docker/daemon.json << 'EOF'
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
EOF
systemctl restart docker
十、常见问题排查
- 容器启动后立即退出:查看日志docker logs,通常是配置错误或进程前台运行问题
- 容器间无法通信:确保在同一个docker-compose.yml中,或使用同一个自定义网络
- 端口被占用:使用docker ps查看端口映射,或修改宿主机映射端口
- 镜像拉取失败:检查网络、配置镜像加速器、使用代理
- 权限问题:检查Volume挂载的目录权限,确保容器内用户有读写权限
十一、总结
Docker在2026年已经是Web开发和部署的基础设施。对于站长来说,掌握Docker可以大幅简化环境部署、提升服务可靠性、降低运维成本。本文从基础概念到实战部署覆盖了Docker的核心内容,但Docker的生态还在不断发展——Kubernetes编排、Serverless容器、Docker Swarm等都是值得深入学习的方向。建议从Docker Compose开始,先将自己的网站容器化部署,再逐步探索更高级的用法。