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

相关推荐
subin9935 分钟前
圣阳蓄电池企业口碑优势与核心运营策略FAQ解析
大数据·运维·人工智能·电源·ups
天狼啸月19901 小时前
RagSEDE复现: Docker and Ragflow 关系
docker·容器·ragflow·ragsede
AC赳赳老秦1 小时前
GTD 工作法落地:用 OpenClaw 搭建收集-整理-执行-复盘全流程自动化工作流
大数据·运维·人工智能·信息可视化·自动化·deepseek·openclaw
DataX_ruby822 小时前
DCMM 2.0 贯标评估全解读:数据中台如何支撑九大能力域(2026版)
大数据·运维·人工智能·数据治理·数据中台
java_logo2 小时前
Docker 部署 SamWaf 完整教程:开源 Web 应用防火墙实测
docker·开源·防火墙·waf·samwaf·轩辕镜像·docker部署waf
小手智联老徐2 小时前
Ubuntu 下 CuteCom 串口调试工具指南:安装、权限配置与数据记录
linux·运维·ubuntu
C137的本贾尼2 小时前
第十篇:Docker & K8s——标准化应用的“集装箱“和“码头调度中心“
docker·容器·kubernetes
Felven2 小时前
麒麟信安操作系统掉电保护方案
linux·运维·麒麟信安·硬盘保护
增量星球2 小时前
《持续交付2.0系列一》从技术交付到业务引领
java·docker·容器·devops
泰和英杰2 小时前
2026 华为数字能源实操考点迭代:数据中心与光伏储能标准化故障排查方法论
运维·服务器·网络