VPS上的Docker:它是什么以及如何开始使用

如果您刚获得新的VPS,或者正在寻求更清洁、更易管理的方式在单个服务器上运行多个应用程序,Docker是您需要了解的工具。本指南将您从理解Docker是什么,一直带到在Ubuntu上安装它并运行您第一个真实应用程序。

什么是Docker?

Docker是一个用于开发、交付和运行应用程序的平台,这些应用程序运行在容器内——自包含的单元,包含应用程序所需的一切:代码、运行时、库和配置。无论底层服务器环境如何,容器都能一致运行。

容器与虚拟机(VMs)

这两者经常被混淆,但它们的工作原理根本不同。

一个有用的比喻:如果虚拟机是一个独立的房子,有自己的水管和电线,那么容器就是公寓楼里的一套公寓——它有自己的私人空间,但共享建筑的基础设施(内核)。

关键要点:Docker容器使用的资源比虚拟机少5-10倍,启动速度更快,部署也更容易。它们非常适合RAM资源稀缺的VPS环境。

为什么Docker在VPS上受欢迎

Docker已成为VPS用户的首选工具,原因有多个。

安装Docker前的要求

在继续之前,请确保您的VPS满足这些要求。

首先通过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 image

docker 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 80

docker 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.yml

docker-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 status

Docker网络和卷:您必须理解的基础知识

一旦您开始在VPS上运行多个容器,两个概念变得至关重要:Docker网络(容器如何相互通信)和Docker卷(数据如何持久化)。默认情况下,容器是无状态的——容器内的所有数据在删除时会立即消失。

Docker网络

Docker提供三种主要网络类型。

当您使用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 mynetwork

Docker卷:数据持久化

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。这是一个诚实的比较。

裸机安装

使用Docker

建议:如果您计划在一个VPS上运行多个应用程序或频繁部署,Docker会快速收回成本。如果您只需要一个WordPress网站,传统LAMP堆栈仍然是一个完全有效的选择。

VPS上Docker的安全建议

准备好在VPS上运行Docker了吗?

AsiaGB Linux VPS起价500泰铢/月——1GB RAM及以上,完全root访问权限,开箱即用支持Docker。数据中心位于泰国和新加坡。

查看VPS计划