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 version

CentOS / AlmaLinux 差异

在 CentOS 系系统上建议执行 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:alpine

Watchtower 自动更新镜像

监听镜像更新并自动重启容器,适合追求最新版本的场景:

docker run -d --name watchtower \
  -v /var/run/docker.sock:/var/run/docker.sock \
  --restart unless-stopped \
  containrrr/watchtower --cleanup --interval 86400

生产环境慎用自动更新

Watchtower 自动拉取最新镜像可能带来版本不兼容风险。生产环境建议锁定具体镜像标签,手动测试后再升级。

开机自启

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 则一次性清理停止的容器、悬空镜像和未使用的网络。