资源栈 - www.zyz88.com

Docker入门到实战:2026年用容器化部署Web应用的完整指南

admin
2026-09-08 3 阅读 0 评论 0 点赞

一、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开始,先将自己的网站容器化部署,再逐步探索更高级的用法。

文章标题 Docker入门到实战:2026年用容器化部署Web应用的完整指南
本文由 资源栈 原创发布,转载请注明出处并保留原文链接。