Docker 把应用和环境打包成容器,你在自己电脑上跑通的东西搬到VPS上也不会有”我电脑上能跑、服务器上报错”的问题。本文从零开始在VPS上装Docker,然后用三个容器跑起Nginx、MySQL和Redis——覆盖建站最常用的三个服务。
第一步:安装Docker和Docker Compose
以下命令适用于Ubuntu/Debian系统:
# 卸载旧版本(如果有的话)
apt remove docker docker-engine docker.io containerd runc -y
# 安装依赖和Docker官方源
apt update && apt install ca-certificates curl -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list
# 安装
apt update && apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y
# 验证
docker --version
docker run hello-worldhello-world 跑成功就说明Docker装好了。不需要在VPS上装Nginx、MySQL、PHP——都用容器跑,卸载时删容器就行,不会在系统里留一堆散落的配置文件和依赖。
雨云KVM构架的VPS跑Docker兼容性很好,优惠码 admin01 首月五折,入门配置1核1G就能跑两三个轻量容器。如果跑MySQL这类吃内存的服务,建议2G内存起步。
第二步:Docker Compose 编排三个服务
Docker Compose 用一个YAML文件定义多个容器、网络和数据卷。创建一个 docker-compose.yml:
version: '3.8'
services:
nginx:
image: nginx:alpine # alpine版体积小,只有几MB
ports:
- "80:80" # 宿主机80端口映射到容器80
- "443:443"
volumes:
- ./nginx/html:/usr/share/nginx/html # 网站文件
- ./nginx/conf:/etc/nginx/conf.d # Nginx配置
depends_on:
- php # 等PHP启动了再启动Nginx
restart: unless-stopped
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: 换个强密码
MYSQL_DATABASE: mydb
ports:
- "3306:3306"
volumes:
- ./mysql/data:/var/lib/mysql # 数据持久化
restart: unless-stopped
redis:
image: redis:alpine
ports:
- "6379:6379"
volumes:
- ./redis/data:/data
restart: unless-stopped关键理解volumes的作用:容器的文件系统是临时的——容器删了里面的数据就没了。volumes把容器里的目录映射到宿主机上的真实目录,数据不会丢。
启动全部服务:
docker compose up -d
# -d 表示后台运行
# 查看运行状态
docker compose ps第三步:常用管理命令
# 查看所有运行中的容器
docker ps
# 查看某个容器的日志(实时)
docker logs -f 容器名
# 进入容器内部调试
docker exec -it 容器名 sh
# 重启单个容器
docker restart 容器名
# 更新镜像并重建容器
docker compose pull # 拉最新镜像
docker compose up -d # 重建日常运维就这几个命令够用:ps看状态、logs查问题、restart重启、exec进去调试。
第四步:Nginx 反向代理到 PHP 容器
如果要跑PHP网站(WordPress等),加一个PHP容器:
# 在docker-compose.yml的services里加
php:
image: php:8.2-fpm-alpine
volumes:
- ./nginx/html:/var/www/html
restart: unless-stoppedNginx 的配置文件里把PHP请求转发给PHP容器:
# nginx/conf/default.conf
server {
listen 80;
server_name _;
root /usr/share/nginx/html;
index index.php index.html;
location ~ .php$ {
fastcgi_pass php:9000; # php是docker-compose里定义的服务名
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
include fastcgi_params;
}
}Docker Compose 的网络里,每个服务名自动就是一个可解析的主机名——Nginx 容器里写 fastcgi_pass php:9000,Docker 内部的DNS会自动解析到PHP容器的IP。不用记IP地址。
Docker和宝塔面板的区别
宝塔面板适合不想碰命令行的场景,一键装环境、可视化操作。Docker 适合想把环境配置写成文件、可复现的场景——换一台服务器,docker compose up -d 一条命令恢复整个环境。
推荐搭配:用宝塔管理服务器基础设置(防火墙、文件管理、定时任务),用Docker跑具体的服务(Nginx/MySQL/Redis/应用),两者不冲突。
常见问题
容器里的MySQL数据怎么备份?
两种方式:直接用宿主机的mysqldump连容器里的MySQL(docker exec mysql mysqldump -u root -p 数据库名 > backup.sql);或者定时把volumes目录(./mysql/data)打包。前者生成的SQL文件更通用。
Docker会不会很吃内存?
Docker本身开销很小(几十MB)。吃内存的是你跑的容器——MySQL默认会吃掉宿主机一半内存作为缓冲池,需要限制:在docker-compose.yml的MySQL服务下加 deploy.resources.limits.memory: 512M。
容器自动重启失败怎么办?
docker logs 查容器启动日志,99%的情况是配置错误(端口冲突、挂载路径不存在、环境变量没设)。修好配置后 docker compose down && docker compose up -d 重建。






