什么是 Docker?为什么要在 VPS 上使用它?
Docker 是一个容器化平台,它将应用程序与其依赖(库、环境变量、配置文件)一起打包到称为容器的隔离单元中。与虚拟机不同,容器共享主机操作系统内核,因此非常轻量,启动速度极快——通常只需几秒。
在 VPS 上使用 Docker 有几大核心优势:
- 环境一致性——"在我机器上能跑"的问题不复存在;容器在开发、预发布和生产环境中表现完全一致
- 便捷部署——用一条命令启动复杂软件(数据库、消息队列、搜索引擎)
- 隔离性——应用在各自独立的容器中运行,避免依赖冲突
- 版本回滚——按版本为镜像打标签,更新出问题时可即时回滚
本指南假设你已有一台全新的 Ubuntu 22.04 VPS,并具有 root 或 sudo 访问权限。
为什么要从 Docker 官方软件仓库安装?Ubuntu 内置的 apt 将 Docker 打包为 docker.io,通常落后好几个版本。从 Docker 官方软件仓库安装,可确保获得最新稳定版 Docker Engine 和 docker-compose-plugin(v2 语法:docker compose 而非 docker-compose)。
第一步:准备系统
更新软件包列表,并安装通过 HTTPS 添加 Docker 软件仓库所需的前置软件包:
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release
添加 Docker 官方 GPG 密钥
Docker 使用 GPG 密钥对软件包签名。将其添加到 Ubuntu 的受信密钥环,以便 apt 验证软件包完整性:
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 软件仓库
将 Docker 官方 apt 软件仓库添加到软件源列表:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
第二步:安装 Docker Engine 和 Compose 插件
更新软件包索引(现已包含 Docker 软件仓库),并安装所有必需软件包:
sudo apt-get update
sudo apt-get install -y \
docker-ce \
docker-ce-cli \
containerd.io \
docker-buildx-plugin \
docker-compose-plugin
此步骤将安装 Docker Engine(docker-ce)、CLI 客户端(docker-ce-cli)、容器运行时(containerd.io)以及现代 Compose 插件。
验证安装
运行经典的 hello-world 容器,确认 Docker 正常工作:
sudo docker run hello-world
你应该看到如下消息:"Hello from Docker! This message shows that your installation appears to be working correctly."
第三步:无需 sudo 运行 Docker
默认情况下,只有 root 用户才能运行 Docker 命令。将你的用户添加到 docker 组,即可无需 sudo 运行容器:
sudo usermod -aG docker $USER
退出并重新登录使组变更生效。然后不加 sudo 验证:
docker run hello-world
安全提示:docker 组拥有与主机 root 等效的访问权限,因为 Docker 可以挂载主机文件系统。请只将受信任的用户添加到该组,切勿添加 www-data 或其他服务账户。
第四步:运行你的第一个真实容器——Nginx
我们来运行一个真实的 Web 服务器,直观体验 Docker。以下命令运行一个 Nginx 容器,将主机的 8080 端口映射到容器内的 80 端口:
docker run -d -p 8080:80 --name my-nginx nginx:alpine
各参数说明:
-d——分离模式(在后台运行)-p 8080:80——将主机 8080 端口映射到容器 80 端口--name my-nginx——为容器指定一个易读的名称nginx:alpine——使用基于轻量 Alpine Linux 的 Nginx 镜像
在浏览器中打开 http://你的VPS_IP:8080,即可看到 Nginx 欢迎页面。
理解 Docker 工作流
在深入学习之前,先了解你每天都会用到的三个核心概念。镜像(Image)是只读模板,包含应用所需的一切——代码、运行时、库和配置。容器(Container)是由镜像创建的运行实例;你可以启动、停止和删除容器,而不会影响其所依赖的镜像。注册表(Registry)(如 Docker Hub)是镜像存储和共享的地方,类似于 GitHub 存储代码的方式。
典型的生命周期如下:从注册表 pull 镜像,run 它以创建容器,查看 logs,最终 stop 并 rm 容器。当你需要自定义应用时,编写 Dockerfile,然后将其 build 为自己的镜像。在 VPS 上,这意味着你可以通过拉取新镜像并重建容器来部署新版本应用——整个过程只需几秒,回滚也极其简单。
| 术语 | 含义 |
|---|---|
Image(镜像) | 只读模板——应用的构建蓝图 |
Container(容器) | 镜像的可写运行实例 |
Volume(数据卷) | 容器删除后仍保留的持久化存储 |
Network(网络) | 允许容器之间通信的私有虚拟网络 |
Registry(注册表) | 镜像存储(Docker Hub、GitHub Container Registry) |
常用 Docker 命令
以下命令涵盖了日常 90% 的 Docker 使用场景:
# 列出正在运行的容器
docker ps
# 列出所有容器(包括已停止的)
docker ps -a
# 停止容器
docker stop my-nginx
# 删除容器
docker rm my-nginx
# 列出已下载的镜像
docker images
# 拉取镜像(不运行)
docker pull redis:7-alpine
# 查看容器日志(跟踪模式)
docker logs -f my-nginx
# 在运行中的容器内执行命令
docker exec -it my-nginx sh
第五步:使用 Docker Compose 部署多容器应用
实际应用很少只用单个容器。Docker Compose 允许你通过单个 YAML 文件定义和运行多容器应用。这里是一个经典示例——WordPress 搭配 MySQL 数据库:
mkdir ~/wordpress && cd ~/wordpress
创建 docker-compose.yml:
version: "3.9"
services:
db:
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: wppassword
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: wppassword
volumes:
- wp_data:/var/www/html
depends_on:
- db
volumes:
db_data:
wp_data:
用一条命令启动整个服务栈:
docker compose up -d
Docker Compose 会自动在两个容器之间创建私有网络。WordPress 可以通过主机名 db(即 YAML 文件中的服务名)访问 MySQL。停止并移除所有资源:
docker compose down
同时删除数据卷(警告:数据将丢失):
docker compose down -v
第六步:设置 Docker 开机自启
安装完成后,Docker 的 systemd 服务通常已自动启用。通过以下命令验证:
sudo systemctl is-enabled docker
# 应输出:enabled
sudo systemctl status docker
若未启用,运行:
sudo systemctl enable docker --now
在 Compose 文件中设置了 --restart always 或 restart: always 的容器,将在守护进程启动后自动重启。
第七步:清理 Docker 资源
随着时间推移,已停止的容器、未使用的镜像和悬空数据卷会不断积累并占用磁盘空间。使用以下命令回收磁盘空间:
# 删除所有已停止的容器
docker container prune
# 删除未使用的镜像
docker image prune
# 一次性删除所有未使用资源(容器、镜像、网络、构建缓存)
docker system prune
# 查看 Docker 磁盘占用情况
docker system df
总结与后续步骤
你已成功在 Ubuntu 22.04 上安装 Docker Engine 和 Docker Compose,运行了第一个容器,并使用 Docker Compose 部署了多容器 WordPress+MySQL 服务栈。
接下来可以探索:
- Portainer——通过 Web 界面可视化管理 Docker 容器,无需命令行
- Nginx 反向代理——将 80/443 端口流量路由到多个容器
- Docker 数据卷——为数据库和用户上传文件提供持久化存储
- 私有 Docker 注册表——无需依赖 Docker Hub,自行存储镜像
VPS 上 Docker 的基本安全加固
Docker 功能强大,但配置不当的主机一旦暴露在公网,很容易成为攻击目标。在运行生产工作负载之前,请执行以下基础安全加固步骤:
- 将 docker 组视同 root——docker 组中的任何人都可以将主机文件系统挂载到容器中,读取或修改任意文件。只添加受信任的管理员,切勿添加
www-data等服务账户。 - 不要公开暴露数据库端口——在 Compose 中运行 MySQL、Redis 或 PostgreSQL 时,让其他容器通过内部网络访问,而不要用
ports:发布端口。密码薄弱的已暴露数据库是最常见的入侵途径之一。 - 在前面部署防火墙——配置 UFW,只开放你真正需要的端口(80、443、SSH)。注意 Docker 会直接操作 iptables,可能绕过 UFW 规则;发布端口后需检查
iptables规则。 - 定期更新镜像——运行
docker pull image:tag获取已打补丁的版本,然后用新镜像重建容器。避免让镜像长期未更新。 - 以非 root 用户运行容器——许多镜像支持
--user参数或 Dockerfile 中的USER指令,在容器被攻破时可限制影响范围。 - 限制容器资源——使用
--memory和--cpus参数,防止单个失控容器耗尽整台 VPS 的资源,导致其他服务宕机。
常见问题解答
Docker 与虚拟机有何区别?
虚拟机模拟完整的硬件栈并启动完整的客户操作系统,因此资源消耗大、启动缓慢。Docker 容器共享主机内核,仅隔离进程、文件系统和网络,因此非常轻量,启动只需几秒,且可以在单台 VPS 上运行大量容器。唯一的限制是所有容器必须运行在同一内核类型(Linux)上。
运行 Docker 需要多少内存的 VPS?
对于测试和轻量容器(如 Nginx 或静态网站),1GB 内存已足够。若要同时运行 WordPress 和 MySQL 或多个服务,建议 2GB 或更多。AsiaGB VPS 方案起价仅 500 泰铢/月,提供 Ubuntu 系统和多档内存选择,可按实际工作负载灵活选择。
为什么要从 Docker 官方软件仓库安装,而不是用默认的 apt 软件包?
Ubuntu 自带的 docker.io 软件包通常落后几个版本,且缺少现代的 docker compose v2 插件。从 Docker 官方软件仓库安装,可获得最新的、经过安全修补的 Docker Engine 和 Compose 插件,完整支持当前所有功能。
如何让容器在重启后自动启动?
在运行 docker run 时添加 --restart always,或在 docker-compose.yml 中设置 restart: always。这样每次守护进程启动后,Docker 就会自动启动这些容器。另外还需确保 Docker 服务本身已在开机时启用:sudo systemctl enable docker。
准备好在 VPS 上运行 Docker 了吗?
AsiaGB VPS 起价仅 500 泰铢/月,提供完整 root 访问权限、Ubuntu 22.04 系统及 99% 正常运行时间 SLA——生产环境运行 Docker 容器所需的一切。
查看 VPS 方案 →