很多站长把网站部署在 VPS 上,最怕的就是"环境串台":换台机器要重装一遍环境,想跑第二个站点又怕污染第一个,某天手滑删了个依赖,整个网站直接挂掉。Docker 把应用和它依赖的运行环境打包成一个个"集装箱",互相隔离、随拿随用、搬家秒迁。本文按真实操作顺序,把 Docker 从安装、核心概念到用 Compose 编排 LNMP 环境一次讲清楚,所有命令都在 Ubuntu 22.04 上验证过,照着敲就能用。
一、先搞明白:Docker 到底解决了什么?
传统部署是把软件直接装进系统里,和系统环境紧紧耦合:A 网站要 PHP 7.4,B 网站要 PHP 8.2,一装就冲突。Docker 的思路是"容器化"——把每个应用连同运行环境、配置文件、依赖库一起打包成镜像,运行时隔离成独立容器,互不干扰。带来的好处主要有三点:
1. 环境隔离:多个站点、多种语言版本共存不打架;
2. 一键复现:一条 docker run 就能在任何机器上还原同样的环境;
3. 迁移方便:镜像打包带走,换服务器不用重装环境。
二、安装 Docker:两分钟搞定
Ubuntu / Debian 用官方源一条命令装好:
apt update apt install -y docker.io systemctl enable --now docker docker --version
CentOS / Rocky 用 Docker 官方仓库安装:
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 systemctl enable --now docker
装完先确认服务在跑,docker info 能正常输出即可。国内服务器拉镜像慢的,可以配置国内镜像加速器,阿里云容器镜像服务控制台会提供专属加速地址。
三、核心概念:镜像、容器、仓库
先把三个词分清,后面就不会晕:
镜像(Image):只读模板,相当于"安装包",里面包含完整的运行环境;
容器(Container):镜像跑起来的实例,相当于"装好的系统",可读写、可启停;
仓库(Registry):存放镜像的地方,默认是 Docker Hub。
几个最常用的命令:
docker search nginx # 搜索镜像 docker pull nginx # 拉取镜像 docker images # 查看本地镜像 docker ps # 查看运行中的容器 docker ps -a # 查看所有容器(含已停止)
四、跑第一个容器:一个 Nginx 站点
docker run -d --name web -p 8080:80 -v /www/html:/usr/share/nginx/html nginx
参数拆开看:-d 后台运行;--name web 给容器起名;-p 8080:80 把宿主机的 8080 端口映射到容器内的 80 端口;-v 把宿主机的 /www/html 目录挂载进容器,网站文件放在宿主机,改文件不用进容器。启动后浏览器访问 http://服务器IP:8080 就能看到默认页面,把网站文件丢进 /www/html 就完成部署了。
常用容器操作:
docker start web / docker stop web # 启停 docker restart web # 重启 docker logs -f web # 查看日志 docker exec -it web bash # 进入容器 docker rm -f web # 删除容器
五、用 Docker Compose 编排 LNMP 环境
一个站点往往要 Nginx + PHP + MySQL 三个服务一起跑,逐个 docker run 太繁琐,用 Compose 写一个配置文件,一键启动整套环境。新建 docker-compose.yml:
version: '3'
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- php
php:
image: php:8.2-fpm
volumes:
- ./html:/var/www/html
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: 换成强密码
MYSQL_DATABASE: myblog
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
然后一条命令启动整套环境:
docker compose up -d # 后台启动整套环境 docker compose ps # 查看服务状态 docker compose logs -f # 查看日志 docker compose down # 停止并移除
以后换机器,把这个目录连同 docker-compose.yml 一起拷走,docker compose up -d 就直接还原整套环境,再也不用记一堆安装步骤。
六、数据持久化:别把数据留在容器里
容器删除后,里面写的数据会一起消失。所以数据库、网站文件这类重要数据必须用卷(Volume)持久化:-v mysql_data:/var/lib/mysql 这种命名卷,或者 -v /www/html:/usr/share/nginx/html 这种目录挂载。原则就一条:容器可以随时重建,但数据必须落在宿主机上。备份时直接备份宿主机挂载目录,和普通文件备份完全一样。
七、资源限制与安全
容器虽然是隔离的,但不设上限时可能抢占整台机器资源,给容器加上资源限制:
docker run -d --memory="512m" --cpus="1" --name web nginx
再配合几点安全习惯:一是非必要不给容器 --privileged 权限;二是容器内别用 root 跑业务进程,镜像里用 USER 指令降权;三是 MySQL、Redis 这类服务的端口不要直接映射到公网,必须通过防火墙或安全组限定来源 IP。
八、日常运维命令速查
docker stats # 实时查看容器资源占用 docker logs --tail 100 web # 查看最近 100 行日志 docker exec -it web bash # 进入容器排障 docker inspect web # 查看容器详细信息 docker system prune -f # 清理停止的容器和悬空镜像
网站出问题时,第一反应就是 docker logs 和 docker stats:日志能看到应用报错,stats 能看到是不是容器把 CPU 或内存吃满了。
九、结语
Docker 的学习曲线并不陡,掌握安装、镜像与容器、端口映射、数据卷、Compose 这五件事,就足够把绝大多数网站和应用容器化跑起来。它带来的环境隔离和迁移便利,长期看能帮你省下大量重复配置的时间。遇到问题优先看官方文档和 docker logs,多数坑都能自己排查出来。