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

相关推荐
qwy71522925816336 分钟前
1-Docker Engine 安装前置环境配置
运维·docker·容器
菜菜艾2 小时前
基于llama.cpp部署私有大模型
linux·运维·服务器·人工智能·ai·云计算·ai编程
重生的黑客2 小时前
Linux开发工具:条件编译、动静态库与 make/makefile 入门
linux·运维·服务器
minji...2 小时前
Linux 线程同步与互斥(三) 生产者消费者模型,基于阻塞队列的生产者消费者模型的代码实现
linux·运维·服务器·开发语言·网络·c++·算法
.柒宇.2 小时前
nginx入门教程
运维·nginx
航Hang*3 小时前
VMware vSphere 云平台运维与管理基础——第2章(扩展):VMware ESXi 5.5 安装、配置与运维
运维·服务器·github·系统安全·虚拟化
SPC的存折3 小时前
MySQL 8组复制完全指南
linux·运维·服务器·数据库·mysql
运维行者_3 小时前
OpManager MSP NetFlow Analyzer集成解决方案,应对多客户端网络流量监控挑战
大数据·运维·服务器·网络·数据库·自动化·运维开发
sszdzq4 小时前
docker 安装 doris
运维·docker·容器
dashizhi20154 小时前
共享文件禁止拖动本地磁盘、共享文件禁止另存为、禁止打印共享文件、禁止复制共享文件的方法
运维·服务器·网络·安全·电脑