wuee
Linux 运维 / Docker 部署 / 2026.08

Ubuntu 24.04 服务器初始化与 Docker 部署实战

Ubuntu 24.04.4 LTS · Docker v29.6.1 · 安全加固清单

一台新 VPS 到手,先别急着跑业务。系统更新、SSH 加固、防火墙、Docker 环境这几步没做好,后面所有服务都裸奔在公网上。本文是本服务器实际执行过的初始化清单,按顺序做一遍,大约二十分钟。

一、系统基础配置

先以 root 登录,把系统更新到最新,装上后面会用到的工具,再设置时区——服务器时区错了,日志时间戳、定时任务全跟着乱。

apt update && apt upgrade -y
apt install -y curl wget git ca-certificates ufw
timedatectl set-timezone Asia/Shanghai
timedatectl status

容器内的时间靠环境变量控制,之后每个 compose 服务记得加 TZ=Asia/Shanghai,否则容器默认 UTC,和宿主机差八小时。

二、SSH 安全加固

默认的 root + 密码登录是暴力破解的重灾区。先把自己的公钥放上去,确认密钥能登录后,再关掉密码登录。顺序反了会把自己锁在门外。

# 1. 把本地公钥写到服务器
mkdir -p ~/.ssh
echo "ssh-ed25519 AAAA... your-key" >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys

# 2. 新开一个终端,用密钥登录验证通过
ssh user@server-ip

# 3. 确认无误后,禁用密码登录
cat > /etc/ssh/sshd_config.d/hardening.conf <<'EOF'
PermitRootLogin prohibit-password
PasswordAuthentication no
PubkeyAuthentication yes
EOF
systemctl restart sshd
注意:sshd_config.d 目录下的 .conf 文件会被自动 include,比直接改 /etc/ssh/sshd_config 更清晰,升级系统时也不容易丢。改完务必开新会话测试,保持现有连接不要断。

三、防火墙:UFW

公网服务只需要开三个口:SSH(22)、HTTP(80)、HTTPS(443)。其他全部拒绝。443 是为后面的 Caddy 自动 HTTPS 准备的。

ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
ufw status verbose

UFW 与 Docker 的经典坑

这里有个所有人都踩过的坑:UFW 挡不住 Docker 发布的端口。Docker 用 iptables 的 DOCKER 链做端口转发,规则加在 UFW 之前,所以即使 UFW 默认 deny,docker run -p 8080:8080 映射出来的端口照样能从外网访问。

# 验证:UFW 明明没放行 8765,但外网能通
ufw status    # 8765 不在 allow 列表里
curl http://服务器IP:8765   # 居然通了 ⚠️

解决思路不是去硬刚 UFW,而是别把业务端口发布到公网。正确的部署形态是:

四、安装 Docker

推荐用官方 apt 源安装,版本受控、方便升级,别用一键脚本装完就忘。Ubuntu 24.04 的代号是 noble:

# 添加 Docker 官方源
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
  https://download.docker.com/linux/ubuntu noble stable" \
  > /etc/apt/sources.list.d/docker.list

apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

systemctl enable --now docker
docker --version    # Docker version 29.6.1
docker compose version

如果服务器在国外,官方源速度没问题;国内服务器可以换成清华或阿里镜像源,把 download.docker.com 替换成 mirrors 地址即可。

五、镜像加速与日志限额

国内服务器拉 Docker Hub 镜像经常超时,配置 registry mirror 能大幅提速。顺手把容器日志限制加上,写在 /etc/docker/daemon.json

{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://dockerproxy.com"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}
顺手做日志限额:默认 json-file 驱动不限制大小,日志量大的容器能把磁盘撑爆。上面的 max-size/max-file 把每个容器日志限制在 30MB 以内,这是本服务器最值得的一条配置。
systemctl restart docker
docker info | grep -A3 "Registry Mirrors"

六、部署布局:systemd + Docker Compose 混合

不是所有东西都得装进容器。本服务器的分工很明确:

验证部署结果的命令:

# 容器状态
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Ports}}"

# systemd 服务
systemctl list-units --type=service --state=running | grep -E "valkey|caddy"

# 磁盘与内存水位
df -h / && free -h

七、初始化检查清单

✅ 系统更新 + 时区
✅ SSH 密钥登录,密码登录已禁用
✅ UFW:只放行 22/80/443
✅ Docker 官方源安装,镜像加速生效
✅ 容器日志限额(max-size 10m)
✅ 业务端口不直接暴露公网,统一走反向代理
延伸阅读:用 Caddy 让所有服务自动接入 HTTPS · 六服务 Docker Compose 编排实战 · 用 Valkey 替代 Redis
← 返回首页