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

相关推荐
阿虎儿2 小时前
Ubuntu 如何开启 Root 用户 SSH 登录
运维
the sun342 小时前
Linux驱动开发:环境准备与报错处理
linux·运维·服务器
姓王名礼2 小时前
这是一个完整的全栈交付包,包含Vue3 前端交互界面(集成数字人视频流、ECharts 图表、语音对话)和Docker Compose 一键部署脚本。
前端·docker·echarts
彭泽布衣2 小时前
Linux如何指定源端口打流
linux·运维·网络
Ciel_75212 小时前
OpenClaw 深度进阶:记忆系统、多智能体架构与自动化调度全解析
运维·自动化
晨晖22 小时前
Linux命令3
linux·运维·服务器
eggwyw3 小时前
Redis 设置密码(配置文件、docker容器、命令行3种场景)
数据库·redis·docker
素雨迁喜3 小时前
Linux平台下git工具的使用
linux·运维·git
bing_feilong3 小时前
Ubuntu Tips
linux·运维