Docker 已经成为在 VPS 上部署应用的首选方式。容器化让你无需手动处理复杂的系统依赖,一条命令即可拉起服务,迁移与恢复也更便捷。本文从 Docker 的安装和基础概念出发,介绍数据卷、端口映射等核心知识,并以几个常用的自建应用作为示例,帮助你快速建立"用 Docker 管理 VPS 服务"的完整思路。
本文要点
- 在 Debian/Ubuntu 上安装 Docker 与 Docker Compose
- 理解镜像、容器、数据卷与端口映射
- 用 docker run 与 docker-compose.yml 拉起常用应用
- 容器开机自启与日志查看
安装 Docker 与 Docker Compose
推荐使用 Docker 官方脚本一键安装,适用于 Debian 和 Ubuntu:
# 更新源并安装依赖
apt update && apt install -y curl
# 使用官方安装脚本
curl -fsSL https://get.docker.com | bash
# 将当前用户加入 docker 组(可选,免 sudo)
usermod -aG docker $USER
# 验证安装
docker --version
docker compose versionCentOS / AlmaLinux 差异
dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin,并启用 systemctl enable --now docker。核心概念速览
| 概念 | 说明 | 类比 |
|---|---|---|
| 镜像(Image) | 只读模板,包含应用和依赖 | 光盘/安装包 |
| 容器(Container) | 镜像运行的实例 | 运行中的程序 |
| 数据卷(Volume) | 持久化存储,独立于容器生命周期 | 外置硬盘 |
| 端口映射(-p) | 将宿主机端口与容器端口关联 | 路由器端口转发 |
| 网络(Network) | 容器间通信的虚拟网络 | 内网 |
数据卷:让数据活过容器重建
容器删除后内部文件随之消失,数据卷解决这个问题。常用两种形式:
- 命名卷(
-v mydata:/data):由 Docker 管理,适合数据库等 - 绑定挂载(
-v /host/path:/container/path):直接映射宿主目录,适合配置文件与网站目录
# 查看所有数据卷
docker volume ls
# 删除未使用的卷(谨慎操作)
docker volume prune端口映射
格式为 -p 宿主机端口:容器端口,可以让容器内的服务通过宿主机 IP 对外提供访问。建议对外服务统一使用反向代理,只暴露 80/443,不直接暴露应用端口。
常用操作命令
docker ps # 查看运行中的容器
docker ps -a # 包含已停止的容器
docker logs -f 容器名 # 实时查看日志
docker exec -it 容器名 bash # 进入容器 shell
docker stop 容器名 # 停止容器
docker rm 容器名 # 删除容器
docker pull nginx:alpine # 拉取镜像docker-compose.yml 基础示例
对于包含多个服务的应用,推荐用 Compose 文件统一管理。以下是一个最简单的 Nginx + 静态页面示例:
# docker-compose.yml
services:
web:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html:ro
restart: unless-stopped# 启动
docker compose up -d
# 停止并删除容器
docker compose down
# 查看日志
docker compose logs -f几个常用自建应用示例
Nginx 反向代理
将多个容器服务统一在 80/443 端口对外提供,是自建应用的标配前置。
docker run -d --name nginx \
-p 80:80 -p 443:443 \
-v /etc/nginx/conf.d:/etc/nginx/conf.d \
-v /etc/letsencrypt:/etc/letsencrypt:ro \
--restart unless-stopped \
nginx:alpineWatchtower 自动更新镜像
监听镜像更新并自动重启容器,适合追求最新版本的场景:
docker run -d --name watchtower \
-v /var/run/docker.sock:/var/run/docker.sock \
--restart unless-stopped \
containrrr/watchtower --cleanup --interval 86400生产环境慎用自动更新
开机自启
在 docker run 或 Compose 文件中设置 restart: unless-stopped,容器会在 Docker 服务启动时自动重启。还需确保 Docker 服务本身开机自启:
systemctl enable docker小结
- 用 Docker 官方脚本安装,版本最新且兼容性好
- 数据一定要用卷或绑定挂载持久化,否则删容器即丢数据
- 对外服务统一走反向代理,不直接暴露应用端口
- restart: unless-stopped 配合 systemctl enable docker 实现开机自启
- docker compose 让多服务管理变得简洁清晰
常见问题
docker run 和 docker compose 有什么区别?
docker run 适合运行单个容器,docker compose 用 YAML 文件管理多个关联容器,更适合生产部署;后者方便统一启停和配置。
容器重启后数据还在吗?
取决于是否使用了数据卷或绑定挂载。不挂载任何卷时,容器内写入的文件在容器删除后会丢失;挂载卷后数据独立于容器生命周期。
如何查看某个容器占用的端口?
执行 docker ps 可以在 PORTS 列看到端口映射关系;也可以用 docker port 容器名 查看指定容器的端口。
镜像太多占磁盘怎么清理?
执行 docker image prune 删除未被任何容器引用的悬空镜像;docker system prune 则一次性清理停止的容器、悬空镜像和未使用的网络。