Proxmox VE 创建 Ubuntu 25.04 虚拟机并安装 Docker、Dockge、Portainer

使用 community-scripts 在 Proxmox VE 中创建 Ubuntu 25.04 VM,并完成 Cloud-Init、磁盘扩容、SSH、qemu-guest-agent、Docker Compose、Dockge 和 Portainer 配置。

本文整理 Proxmox VE 中 Ubuntu 虚拟机的常用初始化命令,并补充 community-scripts 的 Ubuntu 25.04 VM 安装入口。原始 discussion 标题为 “Useful Ubuntu 22.04/24.04 VM Commands”,这里按中文教程重写说明部分,代码块保持原样,便于直接复制执行。

适用场景:

  • 使用 Proxmox VE 创建 Ubuntu 25.04 虚拟机。
  • 需要配置 Cloud-Init、SSH、qemu-guest-agent。
  • 需要把 Ubuntu VM 作为 Docker 宿主机,部署 Dockge 或 Portainer。

提醒:文中的 SSH 配置示例会允许 root 密码登录,只适合受控内网或临时初始化。生产环境建议改为普通用户 + SSH Key,并关闭 root 密码登录。

一、使用 community-scripts 创建 Ubuntu 25.04 VM

项目页面:

在 Proxmox VE 节点 Shell 中执行:

bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/vm/ubuntu2504-vm.sh)"

脚本会交互式创建 Ubuntu 25.04 虚拟机。创建完成后,不要急着启动,先进入虚拟机的 Cloud-Init 页面完成初始化配置。

二、设置 Cloud-Init

进入 Proxmox VE Web UI,选择刚创建的 Ubuntu VM,然后打开 Cloud-Init 页面。

Proxmox VE Cloud-Init 配置示例

建议按下面顺序设置:

  1. 用户设置为 root,或者设置一个计划使用的普通用户名。
  2. 给该用户设置密码。
  3. 暂时不要启用磁盘自动扩容相关选项,后面手动扩容更容易确认。
  4. 设置网络参数,例如静态 IP、网关和 DNS。
  5. 点击 Regenerate Image,重新生成 Cloud-Init 镜像。

如果网络使用 DHCP,可以在 IP Config (net0) 中设置为:

ip=dhcp

配置完成后再启动虚拟机。

三、使用 xterm.js 控制台

在 Proxmox VE 的 VM 控制台页面,建议从 Console 下拉菜单选择 xterm.js。这个控制台对复制和粘贴更友好,适合执行后续初始化命令。

Proxmox VE 控制台选择 xterm.js

四、调整启动磁盘容量

如果 community-scripts 创建的系统盘偏小,可以先在 Proxmox VE Web UI 中扩容虚拟磁盘:

Hardware > Hard Disk (scsi0) > Disk Action > Resize

Proxmox VE 硬盘扩容入口

填入需要增加的容量后确认。

五、在 Ubuntu 内扩展分区

进入 Ubuntu VM 后,使用 parted 扩展 /dev/sda1

parted /dev/sda
resizepart 1

交互过程中按下面方式回答:

Fix/Ignore? Fix
Partition number? 1
Yes/No? Yes
End? [2146MB]? -0
(parted) quit

然后重启虚拟机:

reboot

重启后可以检查磁盘空间:

df -h
lsblk

六、启用 SSH 登录

下面命令会允许 root 密码登录,并移除 cloud image 默认的 SSH 限制文件:

sed -i -e 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/g' -e 's/^PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config
rm /etc/ssh/sshd_config.d/60-cloudimg-settings.conf
systemctl restart sshd

如果系统提示 sshd.service 不存在,可以改用 Ubuntu 常见的服务名:

systemctl restart ssh

安全加固建议:

  • 初始化完成后创建普通用户。
  • 使用 SSH Key 登录。
  • 关闭 root 密码登录。
  • 确认防火墙只允许可信来源访问 SSH。

七、安装 qemu-guest-agent

qemu-guest-agent 是运行在虚拟机内部的 Guest Agent 服务,用来让 Proxmox VE 这类虚拟化平台和 VM 内部系统通信。启用后,宿主机可以更准确地读取虚拟机 IP、文件系统冻结状态、运行状态,也能更可靠地执行关机、重启等管理动作。

在 Ubuntu/Debian 虚拟机内安装:

apt-get update && apt-get -y upgrade
apt-get install -y qemu-guest-agent

安装后一般还要设置开机自启并立即启动:

systemctl enable qemu-guest-agent
systemctl start qemu-guest-agent

查看运行状态:

systemctl status qemu-guest-agent

如果希望简单处理,也可以安装后直接重启:

reboot

需要注意,qemu-guest-agent 真正生效需要同时满足两个条件:

  1. 虚拟化平台支持 QEMU Guest Agent。
  2. VM 设置中启用了 agent 通道。

在 Proxmox VE 中,还需要到虚拟机选项里启用:

Options -> QEMU Guest Agent -> Enabled

如果 Proxmox VE 页面仍看不到 Guest Agent 信息,先确认虚拟机内 qemu-guest-agent 服务正在运行,再确认 Proxmox VM 选项中已经启用 QEMU Guest Agent

八、安装 Docker

使用 Docker 官方安装脚本:

sh <(curl -sSL https://get.docker.com)

安装后检查:

docker version
docker ps

如果后续改用普通用户运行 Docker,需要把用户加入 docker 组:

sudo usermod -aG docker $USER

重新登录 SSH 会话后再测试 docker ps

九、安装 Docker Compose 插件

下面命令会从 GitHub 获取最新 Docker Compose 版本,并安装到 Docker CLI 插件目录:

LATEST=$(curl -sL https://api.github.com/repos/docker/compose/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
curl -sSL https://github.com/docker/compose/releases/download/$LATEST/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
docker compose version

如果 Ubuntu 软件源中已经提供满足需求的 Compose 插件,也可以改用:

apt-get install -y docker-compose-plugin
docker compose version

十、安装 Dockge

Dockge 是一个 Docker Compose Web 管理工具。安装前应先确认 Docker Compose 已可用。

mkdir -p /opt/{dockge,stacks}
wget -q -O /opt/dockge/compose.yaml https://raw.githubusercontent.com/louislam/dockge/master/compose.yaml
cd /opt/dockge
docker compose up -d

访问地址:

http://虚拟机IP:5001

如果浏览器提示 HTTPS 或反向代理需求,请根据实际部署方式调整。多数内网环境下先用 http://IP:5001 验证服务是否正常,再考虑通过 Nginx Proxy Manager、Caddy 或 Traefik 加 TLS。

十一、安装 Portainer

Portainer 是另一个常用 Docker Web 管理面板。使用 Docker run 部署:

docker volume create portainer_data
docker run -d \
  -p 8000:8000 \
  -p 9443:9443 \
  --name=portainer \
  --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest

访问地址:

https://虚拟机IP:9443

第一次访问会要求创建管理员账号。

十二、收尾检查

完成安装后建议检查:

hostnamectl
ip addr
df -h
lsblk
systemctl status ssh --no-pager
systemctl status qemu-guest-agent --no-pager
docker ps
docker compose version

Proxmox VE 页面中也应确认:

  • VM 的 IP 能被 Guest Agent 正确读取。
  • Cloud-Init 设置与预期一致。
  • 系统盘容量已经扩展到目标大小。
  • Dockge 或 Portainer 端口没有暴露到不可信网络。

常见问题

修改 Cloud-Init 后是否必须重建 VM?

不需要。可以关闭虚拟机,修改 Cloud-Init 页面中的用户、密码、网络等配置,然后点击 Regenerate Image,再启动虚拟机。

systemctl restart sshd 报错怎么办?

Ubuntu 上服务名通常是 ssh,可以执行:

systemctl restart ssh

静态 IP 不通怎么办?

先在 Cloud-Init 中把 IP Config (net0) 临时改为 DHCP:

ip=dhcp

点击 Regenerate Image 后重启 VM。确认网络正常后,再根据网关、掩码和 DNS 改回静态地址。

Dockge 和 Portainer 是否需要同时安装?

不一定。Dockge 更偏向管理 Compose 项目,Portainer 更偏向 Docker 资源和容器管理。二者可以同时存在,但端口、权限和反向代理规则需要分开规划。