对话笔记直发: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-passwordPasswordAuthentication 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