
如果您刚获得新的VPS,或者正在寻求更清洁、更易管理的方式在单个服务器上运行多个应用程序,Docker是您需要了解的工具。本指南将您从理解Docker是什么,一直带到在Ubuntu上安装它并运行您第一个真实应用程序。
什么是Docker?
Docker是一个用于开发、交付和运行应用程序的平台,这些应用程序运行在容器内——自包含的单元,包含应用程序所需的一切:代码、运行时、库和配置。无论底层服务器环境如何,容器都能一致运行。
容器与虚拟机(VMs)
这两者经常被混淆,但它们的工作原理根本不同。
- 虚拟机:模拟完整硬件,每个实例都需要完整的客户操作系统,消耗大量RAM和CPU,启动需要几分钟。
- 容器:共享主机操作系统内核,仅携带应用级依赖项,极其轻量级,可在几秒内启动。
一个有用的比喻:如果虚拟机是一个独立的房子,有自己的水管和电线,那么容器就是公寓楼里的一套公寓——它有自己的私人空间,但共享建筑的基础设施(内核)。
关键要点:Docker容器使用的资源比虚拟机少5-10倍,启动速度更快,部署也更容易。它们非常适合RAM资源稀缺的VPS环境。
为什么Docker在VPS上受欢迎
Docker已成为VPS用户的首选工具,原因有多个。
- 隔离性:每个应用程序在自己的容器中运行。您可以在同一服务器上同时运行PHP 7.4和PHP 8.2,而不会发生冲突。
- 可移植性:构建一次,随处运行。将容器从您的笔记本电脑移到VPS,无需重新配置。
- 精确版本控制:固定每个依赖项的确切版本。不再有"在我的机器上能运行"的意外。
- 轻松回滚:如果更新导致问题,切换回之前的镜像只需一个命令。
- 资源效率:在1GB RAM的VPS上运行多个服务,无需添加硬件。
- Docker Hub:数万个现成镜像——WordPress、MySQL、Nginx、Node.js、Redis等——只需一个pull命令即可获得。
安装Docker前的要求
在继续之前,请确保您的VPS满足这些要求。
- 操作系统:Ubuntu 20.04 LTS或Ubuntu 22.04 LTS(推荐),或Debian 11/12
- RAM:至少1GB(如果运行多个容器,建议2GB或更多)
- 磁盘:至少5GB可用空间
- 访问权限:root或具有sudo权限的用户
- 网络:VPS必须能够连接到互联网以下载Docker
首先通过SSH连接到您的VPS。如果需要帮助,请参阅SSH连接指南。
在Ubuntu上安装Docker
推荐的方法是从Docker的官方仓库安装,它总是提供最新的稳定版本。
步骤1:更新系统并安装依赖项
apt update && apt upgrade -y
apt install -y ca-certificates curl gnupg lsb-release步骤2:添加Docker的GPG密钥和仓库
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
-o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update步骤3:安装Docker引擎
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin步骤4:验证安装
docker --version
# 预期:Docker version 26.x.x, build xxxxxxx
docker run hello-world
# 预期:Hello from Docker!步骤5(可选):不使用sudo运行Docker
如果您以非root用户身份工作,将该用户添加到docker组。
usermod -aG docker $USER
# Log out and back in for the change to take effect基本Docker命令
安装Docker后,以下是您最常使用的命令。
docker pull —下载镜像
docker pull nginx # Latest Nginx image
docker pull nginx:1.25 # Specific version
docker pull ubuntu:22.04 # Ubuntu 22.04 base imagedocker run —启动容器
docker run nginx # Run Nginx (foreground)
docker run -d nginx # Run in background (detached)
docker run -d -p 80:80 --name web nginx # Map port 80, name the container "web"
docker run -d -p 8080:80 nginx # Map host port 8080 to container port 80docker ps —列出运行中的容器
docker ps # 显示运行中的容器
docker ps -a # 显示所有容器,包括已停止的容器docker stop和docker rm —停止和删除
docker stop web # Stop the container named "web"
docker stop abc123 # Stop by container ID
docker rm web # Remove a stopped container
docker rm -f web # Force-remove even if running其他有用的命令
docker images # List all local images
docker rmi nginx # Remove an image
docker logs web # View container logs
docker exec -it web bash # Open a shell inside a running container什么是Docker Compose以及如何安装它
Docker Compose允许您使用单个docker-compose.yml文件定义和运行多容器应用程序。不是为每个服务输入长的docker run命令,而是在一个文件中描述整个堆栈,并使用一个命令启动它。
如果您使用上述步骤安装了Docker(包括docker-compose-plugin),Compose已经可用。
docker compose version
# Docker Compose version v2.x.x注意:Docker Compose v2使用docker compose(带空格)。较旧的v1使用docker-compose(带连字符)。本指南使用v2。
示例:使用Docker Compose运行WordPress + MySQL
这是一个工作示例,它启动一个由MySQL支持的完整WordPress网站——无需手动安装Apache或PHP。
创建项目目录和compose文件
mkdir ~/wordpress && cd ~/wordpress
nano docker-compose.ymldocker-compose.yml文件的内容
services:
db:
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: your_root_password
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: your_wp_password
volumes:
- db_data:/var/lib/mysql
wordpress:
image: wordpress:latest
restart: always
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: your_wp_password
volumes:
- wp_data:/var/www/html
depends_on:
- db
volumes:
db_data:
wp_data:启动WordPress堆栈
docker compose up -d
# Docker拉取镜像并自动创建两个容器
docker compose ps
# 验证两个服务是否正在运行
# 在浏览器中打开 http://YOUR_VPS_IP:8080
# 您将看到WordPress设置向导常见的Docker Compose命令
docker compose up -d # Start all services in the background
docker compose down # Stop and remove all containers
docker compose down -v # Stop + delete volumes (data will be lost!)
docker compose logs -f # Tail logs in real time
docker compose restart # Restart all services
docker compose ps # Show service statusDocker网络和卷:您必须理解的基础知识
一旦您开始在VPS上运行多个容器,两个概念变得至关重要:Docker网络(容器如何相互通信)和Docker卷(数据如何持久化)。默认情况下,容器是无状态的——容器内的所有数据在删除时会立即消失。
Docker网络
Docker提供三种主要网络类型。
- bridge(默认):同组中的容器通过私有内部网络进行通信。最适合单个服务器上的多容器设置。
- host:容器直接共享主机的网络堆栈,无需NAT。适合需要最小延迟的性能关键应用。
- none:完全没有网络访问。用于隔离的批处理作业。
当您使用Docker Compose时,它会自动为您的项目创建一个自定义bridge网络。同一Compose文件中的容器可以通过服务名称相互连接——例如,WordPress容器可以简单地使用主机名db连接到MySQL。
# Create a custom network
docker network create mynetwork
# Run a container attached to that network
docker run -d --name app --network mynetwork nginx
# List all networks
docker network ls
# Inspect a network
docker network inspect mynetworkDocker卷:数据持久化
Docker卷是由Docker管理的存储区域,位于容器文件系统外部。卷中的数据可以在容器删除和重建后幸存——使卷对数据库、用户上传的文件和关键配置至关重要。
# Create a volume
docker volume create mydata
# List all volumes
docker volume ls
# Mount a volume when running a container
docker run -d -v mydata:/var/lib/mysql mysql:8.0
# Remove a volume (warning: data is permanently deleted)
docker volume rm mydata
# Remove all unused volumes
docker volume prune黄金法则:每一项重要数据——数据库、上传的文件、配置——都必须存储在Docker卷中。永远不要将其存储在容器内;容器是临时的,在更新或重新启动期间会被重新创建。
使用Docker Compose在VPS上管理多容器堆栈
在真实的VPS部署中,您几乎总是会一起运行多个容器——至少需要一个Web服务器、数据库、缓存和反向代理。下面是一个生产就绪的示例堆栈。
示例:Nginx + PHP-FPM + MySQL + Redis
此堆栈适合需要高性能和基于Redis缓存的现代PHP应用程序。
services:
nginx:
image: nginx:1.25-alpine
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./app:/var/www/html
- ./ssl:/etc/ssl/certs
depends_on:
- php
php:
image: php:8.3-fpm-alpine
restart: always
volumes:
- ./app:/var/www/html
depends_on:
- mysql
- redis
mysql:
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: strong_root_pw_here
MYSQL_DATABASE: appdb
MYSQL_USER: appuser
MYSQL_PASSWORD: strong_app_pw_here
volumes:
- db_data:/var/lib/mysql
ports:
- "127.0.0.1:3306:3306"
redis:
image: redis:7-alpine
restart: always
volumes:
- redis_data:/data
ports:
- "127.0.0.1:6379:6379"
volumes:
db_data:
redis_data:请注意,MySQL和Redis将其端口仅绑定到127.0.0.1——可从VPS本身访问,但不能从公共互联网访问。这是重要的安全最佳实践。
启动和检查堆栈
# Start all services
docker compose up -d
# Check the status of every service
docker compose ps
# Follow logs in real time
docker compose logs -f
# Restart a misbehaving service
docker compose restart php
# Pull the latest images and redeploy
docker compose pull && docker compose up -d在VPS上备份和恢复Docker数据
Docker卷远比在容器内存储数据更安全,但您仍然需要一个可靠的备份策略。卷数据存储在VPS磁盘上——如果VPS本身出现故障,数据也会丢失。
从运行中的容器备份数据库
# Back up a specific MySQL database
docker exec mysql_container mysqldump -u root -p'strong_root_pw_here' appdb > backup_$(date +%Y%m%d).sql
# Back up all databases
docker exec mysql_container mysqldump -u root -p'strong_root_pw_here' --all-databases > all_backup.sql
# Restore a database
docker exec -i mysql_container mysql -u root -p'strong_root_pw_here' appdb < backup_20260608.sql备份整个Docker卷
# Back up a volume using a temporary Alpine container
docker run --rm \
-v db_data:/source:ro \
-v $(pwd):/backup \
alpine tar czf /backup/db_data_backup.tar.gz -C /source .
# Restore a volume from a backup archive
docker run --rm \
-v db_data:/target \
-v $(pwd):/backup \
alpine tar xzf /backup/db_data_backup.tar.gz -C /target使用cron自动每日备份
向VPS添加cron作业以每天自动运行数据库备份。
# Run: crontab -e, then add this line
# Back up daily at 2 AM, keep 7 days of history
0 2 * * * docker exec mysql_container mysqldump -u root -p'PWD' appdb > /backups/db_$(date +\%Y\%m\%d).sql && find /backups -name "db_*.sql" -mtime +7 -delete最佳实践:良好的备份策略在多个位置存储副本——在VPS上、下载到云存储(如Google Drive)或在单独的服务器上。只存储在与其保护数据相同的机器上的备份不是真正的冗余。
Docker vs. VPS上的直接安装
许多人想知道是使用Docker还是直接安装Apache、PHP和MySQL。这是一个诚实的比较。
裸机安装
- 对初学者来说更容易初始设置
- 稍好的原始性能(无容器开销)
- 升级软件可能会在依赖项冲突时破坏系统
- 同时运行多个PHP版本很复杂
- 迁移到新服务器需要完全手动重新配置
使用Docker
- 应用程序之间完全隔离
- 通过拉取新镜像来升级或降级
- 仅使用
docker-compose.yml文件迁移到新服务器 - 通过Docker Volumes备份和恢复很简单
- 使用单个命令运行复杂堆栈(WordPress + Redis + Nginx)
- 需要预先投入学习Docker概念
建议:如果您计划在一个VPS上运行多个应用程序或频繁部署,Docker会快速收回成本。如果您只需要一个WordPress网站,传统LAMP堆栈仍然是一个完全有效的选择。
VPS上Docker的安全建议
- 避免不必要地暴露端口。对于数据库,绑定到本地主机:
127.0.0.1:3306:3306而不是3306:3306。 - 始终在启动服务前更改
docker-compose.yml中的默认密码。 - 使用
docker compose pull后跟docker compose up -d保持Docker镜像更新。 - 在Docker Volumes中存储持久数据,而不是在容器内——容器是临时的,删除时数据会丢失。
- 配置防火墙以阻止未使用的端口。有关详细信息,请参阅VPS安全加固指南。
准备好在VPS上运行Docker了吗?
AsiaGB Linux VPS起价500泰铢/月——1GB RAM及以上,完全root访问权限,开箱即用支持Docker。数据中心位于泰国和新加坡。
查看VPS计划