Rocky9+ Docker + 容器内Linux桌面环境 + Web远程

一、整体架构设计

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️⃣ 内网(浏览器)

http://宿主机IP:6081

http://宿主机IP:6082

http://宿主机IP:6083

👉 输入 VNC 密码:123456

注意是使用http不是https

相关推荐
中云DDoS CC防护蔡蔡9 分钟前
DDOS和CC攻击谁更可怕
运维·服务器·经验分享·网络安全·ddos
Ruiery16 分钟前
Linux 6.6内核内存管理深度解析(十六):mmap — 用户态“申请内存“的真相
linux·运维·服务器
ClickHouseDB21 分钟前
ClickHouse Cloud 与 Snowflake 实时性价比对比:CostBench 测试中的 412 倍差距来
运维·数据库·系统架构
欧米欧36 分钟前
Linux系统篇(七),环境变量的底层溯源,核心获取机制与安全应用
linux·运维·服务器
Ruiery1 小时前
Linux 6.6内核内存管理深度解析(十八):KASLR 内核地址空间随机化
linux·运维·服务器·安全
todoitbo1 小时前
群晖NAS部署JmalCloud:Docker安装、文件管理、博客与公网访问完整教程
运维·docker·容器
时间售卖铺1 小时前
触发器与函数实战:MySQL高效编程秘诀
运维·数据库·mysql·云原生
前端精髓2 小时前
调用大模型API
运维·服务器·microsoft
跨境小彭2 小时前
Temu 全托管模式下,SKU 利润核算的实践复盘
大数据·运维·人工智能·自动化·temu
李纲明2 小时前
WordPress 定时发布不跑、备份邮件延误:先核 WP-Cron 触发与回环,再改系统 Cron
运维·wordpress·定时任务·devdiy·wp-cron