
📋 目录
Docker 是什么?为什么在 VPS 上使用?
Docker 是一种容器化平台,将应用程序及其所有依赖项打包到轻量级、可移植的容器中。每个容器在隔离环境中运行,彻底解决了"在我机器上能运行"的问题。
Docker 容器与虚拟机对比:
| 特性 | Docker 容器 | 虚拟机 |
|---|---|---|
| 体积 | 轻量(MB) | 较重(GB) |
| 启动时间 | 秒级 | 分钟级 |
| 资源共享 | 共享内核 | 独立内核 |
| 隔离级别 | 进程级别 | 硬件级别 |
| 资源开销 | 极低 | 较高 |
| 可移植性 | 非常高 | 中等 |
Docker 非常适合 VPS,因为它资源占用少,让您在单台 VPS 上高效运行多个应用程序。
系统要求
- 操作系统:Ubuntu 20.04、22.04 或 24.04 LTS(64位)
- 内存:最低 1GB(推荐 2GB 以上)
- CPU:1 vCPU 以上
- 磁盘:至少 10GB 空闲空间(SSD)
- 权限:root 或 sudo 访问权限
- 网络:可访问互联网
💡 提示:AsiaGB 2GB 内存以上的 VPS 套餐完全支持 Docker,可同时运行多个容器,配合高速 SSD 存储,性能出色。
在 Ubuntu 22.04/24.04 上安装 Docker
第一步:更新软件包列表
sudo apt update && sudo apt upgrade -y
第二步:安装依赖项
sudo apt install -y ca-certificates curl gnupg lsb-release
第三步:添加 Docker GPG 密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo 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/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
第五步:安装 Docker Engine
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
第六步:验证安装
sudo docker run hello-world
第七步:免 sudo 使用 Docker
sudo usermod -aG docker $USER
newgrp docker
Docker 基本命令
镜像管理
docker pull nginx # 拉取镜像
docker images # 查看所有镜像
docker rmi nginx # 删除镜像
容器管理
docker run -d -p 80:80 --name my-nginx nginx
docker ps # 运行中的容器
docker ps -a # 所有容器
docker stop my-nginx
docker start my-nginx
docker rm my-nginx
日志与 Shell 访问
docker logs my-nginx
docker logs -f my-nginx # 实时日志
docker exec -it my-nginx bash
Docker Compose
Docker Compose 通过单个 YAML 文件管理多容器应用。现代 Docker CE 已内置 Compose 插件:
docker compose version
WordPress 的 docker-compose.yml 示例:
version: '3.8'
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: wordpress
volumes:
- db_data:/var/lib/mysql
wordpress:
image: wordpress:latest
ports:
- "8080:80"
depends_on:
- db
volumes:
- wp_data:/var/www/html
volumes:
db_data:
wp_data:
docker compose up -d
运行第一个容器
docker run -d --name my-web -p 8080:80 --restart unless-stopped -v /var/www/html:/usr/share/nginx/html:ro nginx
curl http://localhost:8080
🔥 提示:生产环境容器建议加上
--restart unless-stopped,这样 VPS 重启后容器会自动恢复运行。
端口、数据卷和网络
端口映射
docker run -d -p 3000:3000 my-app
docker run -d -p 127.0.0.1:5432:5432 postgres
数据卷
docker volume create my-data
docker run -d -v my-data:/data my-app
docker volume ls
docker volume prune
网络
docker network create my-network
docker run -d --network my-network --name app1 my-app
docker run -d --network my-network --name app2 my-app
Docker 安全配置
- 避免以 root 运行:在 Dockerfile 中使用
USER指令 - 限制资源:
docker run --memory=512m --cpus=0.5 - 定期更新镜像:拉取最新基础镜像修复漏洞
- 绑定到本地:使用
-p 127.0.0.1:PORT:PORT配合 Nginx 反向代理 - 漏洞扫描:使用 Docker Scout 或 Trivy
⚠️ UFW + Docker 注意:Docker 直接修改 iptables,绕过 UFW 规则。建议将容器绑定到 localhost,使用 Nginx 反向代理处理外部访问。
常见问题排查
Docker 守护进程未启动
sudo systemctl status docker
sudo systemctl start docker
sudo systemctl enable docker
权限被拒绝
sudo usermod -aG docker $USER
# 重新登录后生效
端口已被占用
sudo lsof -i :80
docker stop CONTAINER_NAME
磁盘空间不足
docker system prune -a
docker volume prune
总结
Docker 极大地简化了 VPS 上的应用部署。核心步骤:安装 Docker Engine → 将用户添加到 docker 组 → 使用 docker run 运行容器 → 使用 Docker Compose 管理多容器应用 → 实施安全加固。AsiaGB VPS 提供高速 SSD 存储和 99% 正常运行时间 SLA,为 Docker 工作负载提供可靠保障。
常见问题
Q:Docker 和 Docker Desktop 有什么区别?
Docker Desktop 是 macOS 和 Windows 的图形界面应用,内置 Docker Engine。Linux 服务器上的 Docker Engine(Docker CE)没有 GUI,专为 VPS 和服务器环境设计,通过命令行使用。
Q:1GB 内存的 VPS 能运行 Docker 吗?
可以,但有限制。可以运行 2-3 个轻量容器。运行 WordPress 或数据库建议使用 2GB 以上内存以获得良好性能。
Q:容器和虚拟机有什么区别?
容器与宿主机共享 OS 内核,体积小、启动快。虚拟机有独立完整的操作系统,隔离性更强但资源消耗更多。Docker 容器在可移植性和效率方面表现出色。
Q:删除容器后,容器内的数据会丢失吗?
是的,容器层数据删除后会丢失。使用 Docker 数据卷或绑定挂载来持久化数据:
-v /host/path:/container/path 或命名卷。Q:Docker Compose 是什么?需要单独安装吗?
Docker Compose 通过 YAML 文件管理多容器应用。现代 Docker CE 已内置 Compose 插件,直接使用
docker compose 命令即可,无需单独安装。Q:如何将 Docker 与 Nginx 反向代理配合使用?
将容器绑定到 localhost(
-p 127.0.0.1:PORT:PORT),然后配置 Nginx 将 80/443 端口的请求代理到该 localhost 端口。这样可以正确控制防火墙,并通过 Let's Encrypt 启用 SSL/TLS。