对话笔记直发:5.21 腾讯云服务器 Docker Nginx 部署与 SSH 加固。分类:网络基建。

腾讯云服务器 Docker Nginx 部署与 SSH 加固

时间

  • 日期:2026-05-21
  • 本地文件日期前缀:5.21

用户目标

  • 连接新购买的腾讯云服务器 你的服务器IP(已脱敏)
  • 将当前目录下的 index.html 使用 Docker + Nginx 部署到服务器默认 80 端口
  • 在当前工作目录生成一个 AGENT.md,记录服务器连接信息和部署简介
  • 后续继续加固 SSH:禁止 root 用户密码登录,只允许 root 通过公钥登录
  • 最后把本次对话整理保存到 Obsidian

背景与上下文

  • 工作目录:D:\Program\0\home\vps\tencent
  • 当前目录中已有待部署文件:index.html
  • 服务器是新机器,环境较干净,最初未安装 Docker
  • 该目录起初没有服务级 AGENTS.md,只有上级工作区规则和 VPS 规则可参考
  • 部署目标是一个静态页面,不涉及应用后端,仅需提供简单的 Nginx 静态文件服务

过程摘要

  • 先读取了工作区规则、VPS 规则和当前目录内容,确认目录下有 index.html
  • 读取 index.html 内容,确认这是一个 ICP 备案临时公示页
  • 首次 SSH 到服务器检查环境,确认服务器是 Ubuntu 22.04 系列内核,且尚未安装 Docker
  • 安装 Docker 过程中,第一次写入 Docker apt 源时,因为本地 PowerShell 对远端命令里的 $(...) 和 . /etc/os-release 发生了误展开,导致 /etc/apt/sources.list.d/docker.list 内容异常,apt-get update 报错 Malformed entry
  • 修复 Docker 源后成功安装 Docker Engine、buildx、compose plugin,并启用 Docker 服务
  • 同时启用了 UFW 且放行了 80/tcp,但第一次没有先放行 22/tcp,造成 SSH 一度被防火墙拦截,后续再次检查时发现 22/tcp 已允许,SSH 恢复可用
  • 之后尝试直接运行 nginx:alpine 容器时,Docker Hub 拉取镜像超时,错误为访问 registry-1.docker.io 的 443 超时
  • 为解决镜像拉取问题,在服务器上创建 /etc/docker/daemon.json,配置腾讯云镜像加速:https://mirror.ccs.tencentyun.com
  • 重启 Docker 后成功拉取 nginx:alpine
  • 将本地 index.html 上传到服务器 /opt/docker-nginx-site/html/index.html
  • 启动 Nginx 容器 static-site,映射 80:80,设置重启策略 unless-stopped
  • 通过服务器本机 curl -I http://127.0.0.1 和本地 curl -I http://你的服务器IP(已脱敏)“ 验证页面访问,均返回 HTTP/1.1 200 OK
  • 在当前目录创建 AGENT.md,记录服务器连接信息、Docker 配置、站点目录和常用运维命令
  • 随后用户要求禁止 root 密码登录,仅允许公钥方式连接 root
  • 先检查 /root/.ssh/authorized_keys,确认 root 已有公钥且为 ssh-ed25519
  • 检查当前 SSH 生效配置,发现原来是 PermitRootLogin yes 与 PasswordAuthentication yes
  • 备份 /etc/ssh/sshd_config 后,修改配置为 PermitRootLogin prohibit-password 和 PasswordAuthentication no
  • 进行 sshd -t 语法校验后,重载 SSH 服务
  • 验证方面,先用 ssh -o BatchMode=yes 确认 root 公钥登录仍然成功,再强制仅使用密码认证测试,确认得到 Permission denied (publickey).,说明密码登录已被禁用
  • 最后更新本地 AGENT.md,补充 SSH 安全策略与验证结果

关键结论

  • index.html 已成功使用 Docker Nginx 部署到服务器 你的服务器IP(已脱敏) 的默认 80 端口
  • 对外访问地址为:http://你的服务器IP(已脱敏)“
  • 运行中的容器信息:
  • 容器名:static-site
  • 镜像:nginx:alpine
  • 端口映射:80:80
  • 重启策略:unless-stopped
  • 站点目录:/opt/docker-nginx-site/html
  • 服务器已安装 Docker,且已配置腾讯云镜像加速
  • root 当前只允许公钥 SSH 登录,密码登录已关闭
  • SSH 最终生效配置:
  • PermitRootLogin prohibit-password
  • PasswordAuthentication no

执行动作

  • 检查本地目录和部署文件
  • SSH 登录服务器,检查系统、Docker 和端口状态
  • 安装 Docker 与相关组件
  • 修复 Docker apt 源配置错误
  • 为 Docker 配置腾讯云镜像加速
  • 上传 index.html 并部署 Nginx 容器
  • 创建本地 AGENT.md
  • 检查 root 公钥和 SSH 生效配置
  • 修改并重载 SSH 服务配置
  • 完成公钥登录和密码拒绝验证
  • 更新 AGENT.md 记录 SSH 安全策略

执行命令记录

  • ssh -o StrictHostKeyChecking=accept-new root@你的服务器IP(已脱敏) "uname -a && command -v docker || echo NO_DOCKER && docker --version 2>/dev/null || true && ss -ltnp | findstr :80 || true && docker ps -a --format '{{.Names}}\t{{.Status}}\t{{.Ports}}' 2>/dev/null || true" 原因:首次检查服务器基础环境、Docker 是否安装、80 端口和容器状态。 结果:确认是 Ubuntu 服务器,NO_DOCKER,且命令中 findstr 因远端是 Linux 不可用。

  • ssh root@你的服务器IP(已脱敏) "apt-get update && apt-get install -y ca-certificates curl gnupg lsb-release ufw && install -m 0755 -d /etc/apt/keyrings && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg && chmod a+r /etc/apt/keyrings/docker.gpg && 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\" > /etc/apt/sources.list.d/docker.list && apt-get update && apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin && systemctl enable --now docker && ufw allow 80/tcp && ufw --force enable && docker --version && ss -ltnp | grep ':80 ' || true" 原因:一条命令完成 Docker 安装和 80 端口放行。 结果:本地 PowerShell 错误展开远端命令中的 shell 表达式,导致 docker.list 生成异常,apt-get update 报 Malformed entry。这是后续修复 Docker 源的直接原因。

  • ssh root@你的服务器IP(已脱敏) 'rm -f /etc/apt/sources.list.d/docker.list && arch=$(dpkg --print-architecture) && codename=$(. /etc/os-release && echo $VERSION_CODENAME) && echo "deb [arch=$arch signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $codename stable" > /etc/apt/sources.list.d/docker.list && apt-get update && apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin && systemctl enable --now docker && ufw allow 80/tcp && ufw --force enable && docker --version && ss -ltnp | grep ":80 " || true' 原因:修复 Docker apt 源并重新安装 Docker。 结果:Docker 安装成功,版本为 29.5.2。

  • scp "D:\Program\0\home\vps\tencent\index.html" root@你的服务器IP(已脱敏):/tmp/index.html && ssh root@你的服务器IP(已脱敏) 'mkdir -p /opt/docker-nginx-site/html && mv /tmp/index.html /opt/docker-nginx-site/html/index.html && docker rm -f static-site >/dev/null 2>&1 || true && docker run -d --name static-site --restart unless-stopped -p 80:80 -v /opt/docker-nginx-site/html:/usr/share/nginx/html:ro nginx:alpine && docker ps --filter name=static-site --format "{{.Names}} {{.Status}} {{.Ports}}" && ss -ltnp | grep ":80 " || true && curl -I http://127.0.0.1' 原因:上传页面并启动 Nginx 容器。 结果:最初因 SSH 超时失败,暴露出 UFW 曾挡住过 22 端口;在 SSH 恢复后重试时,又因 Docker Hub 拉取 nginx:alpine 超时失败。

  • ssh root@你的服务器IP(已脱敏) 'mkdir -p /etc/docker && cat >/etc/docker/daemon.json <<"EOF" { "registry-mirrors": [ "https://mirror.ccs.tencentyun.com" ] } EOF systemctl restart docker && docker pull nginx:alpine && docker rm -f static-site >/dev/null 2>&1 || true && docker run -d --name static-site --restart unless-stopped -p 80:80 -v /opt/docker-nginx-site/html:/usr/share/nginx/html:ro nginx:alpine && docker ps --filter name=static-site --format "{{.Names}} {{.Status}} {{.Ports}}" && curl -I http://127.0.0.1' 原因:配置镜像加速,解决 Docker Hub 拉取超时,并重新启动容器。 结果:成功拉取 nginx:alpine,容器 static-site 运行成功,服务器本机访问返回 HTTP/1.1 200 OK。

  • curl -I --max-time 15 http://你的服务器IP(已脱敏)“ 原因:验证公网 80 端口访问。 结果:返回 HTTP/1.1 200 OK,说明对外部署成功。

  • ssh root@你的服务器IP(已脱敏)` ‘test -f /root/.ssh/authorized_keys && echo AU



相关: 00-索引-网络基建索引 5.4 VPS 安全加固与 SSH-Fail2ban 配置