一、整体架构设计
bash
Rocky9(宿主机,无GUI)
│
├── Docker
│ ├── 容器1:Rocky9 + XFCE + noVNC + ToDesk
│ ├── 容器2:Rocky9 + XFCE + noVNC + ToDesk
│ └── 容器3:Rocky9 + XFCE + noVNC + ToDesk
│
├── 访问方式:
│ ├── 内网:浏览器访问 noVNC(http://IP:6081/6082/6083)
二、核心技术选型
1️⃣ Web访问桌面
- 使用:VNC + noVNC
- 浏览器直接访问桌面
👉 推荐组合:
- tigervnc-server
- noVNC + websockify
2️⃣ 桌面环境
- Rocky9 + XFCE
二、Docker镜像设计(核心)
你需要自定义镜像(重点)
1️⃣ Dockerfile
bash
FROM rockylinux:9
# 基础工具
RUN dnf -y update --allowerasing && \
dnf -y install epel-release && \
dnf -y install --allowerasing \
procps \
net-tools \
sudo \
wget \
curl \
which \
xauth \
dbus-x11 && \
dnf -y groupinstall "Xfce" && \
dnf -y install tigervnc-server novnc python3-websockify && \
dnf clean all
# 创建普通用户
RUN useradd -m user && echo "user:123456" | chpasswd
# 赋予 sudo 权限(关键)
RUN echo "user ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# 拷贝启动脚本
COPY start.sh /start.sh
RUN chmod +x /start.sh
RUN mkdir -p /home/user/.vnc && \
chown -R user:user /home/user/.vnc
# 暴露端口
EXPOSE 5901 6080
# 默认执行
CMD ["/start.sh"]
2️⃣ 启动脚本 start.sh
bash
#!/bin/bash
USER=user
HOME=/home/user
DISPLAY=:1
# 强制清理旧 VNC session(关键)
rm -rf /tmp/.X1-lock /tmp/.X11-unix/X1
rm -rf $HOME/.vnc/*.pid
# 设置 VNC 密码(每次启动都保证存在)
mkdir -p /home/user/.vnc
echo "123456" | vncpasswd -f > /home/user/.vnc/passwd
chown -R user:user /home/user/.vnc
chmod 600 /home/user/.vnc/passwd
# 写 xstartup(防止被覆盖)
cat > $HOME/.vnc/xstartup <<'EOF'
#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
export XDG_RUNTIME_DIR=/tmp/runtime-user
mkdir -p $XDG_RUNTIME_DIR
chmod 700 $XDG_RUNTIME_DIR
exec dbus-launch --exit-with-session startxfce4
EOF
chown user:user $HOME/.vnc/xstartup
chmod +x $HOME/.vnc/xstartup
# 启动 VNC(前台模式更稳定)
su - $USER -c "vncserver :1 -geometry 1280x800 -depth 24"
# 启动 noVNC(必须绑定 0.0.0.0)
su - $USER -c "websockify --web=/usr/share/novnc 0.0.0.0:6080 localhost:5901 &"
# 保持容器运行
tail -f $HOME/.vnc/*.log
三、完整实现步骤
1️⃣ 安装 Docker(Rocky9)
省略
2️⃣ 创建项目目录
bash
mkdir -p /opt/docker-desktop
cd /opt/docker-desktop
将Dockerfile, start.sh和todesk.rpm都移动到这里
3️⃣ 构建镜像
bash
构建镜像
docker build -t rocky9-xfce-vnc .
如果是重新构建镜像
docker build --no-cache -t rocky9-xfce-vnc .
四、使用Docker Compose批量管理docker容器
1️⃣ 创建 docker-compose.yml
在/opt/docker-desktop目录下创建docker-compose.yml
bash
version: "3.9"
services:
desktop1:
image: rocky9-xfce-vnc
container_name: desktop1
ports:
- "6081:6080"
- "5901:5901"
restart: always
desktop2:
image: rocky9-xfce-vnc
container_name: desktop2
ports:
- "6082:6080"
- "5902:5901"
restart: always
desktop3:
image: rocky9-xfce-vnc
container_name: desktop3
ports:
- "6083:6080"
- "5903:5901"
restart: always
2️⃣一键启动
bash
docker compose up -d
3️⃣ 一键关闭
bash
docker compose down
五、浏览器验证
关闭宿主机防火墙
systemctl stop firewalld
1️⃣ 内网(浏览器)
👉 输入 VNC 密码:123456
注意是使用http不是https
