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

相关推荐
你住过的屋檐16 小时前
【Nginx】linux上安装nginx
linux·运维·nginx
AKCJDJ18 小时前
k8s的管理及控制器管理
云原生·容器·kubernetes
灰阳阳18 小时前
Docker-数据卷命令解析
java·docker·eureka
晓晓_za89866818 小时前
开源 GEO 优化源码二次开发:贴牌改造与业务模块扩展实践
java·运维·服务器·开发语言·性能优化·开源
SCandL15218 小时前
k8s service
linux·容器·kubernetes
云计算DevOps-韩老师19 小时前
【MySQL运维DBA】【SQL基础系列002篇】
运维·mysql·dba
DBA大董19 小时前
TDengine3.0 DBA常用的运维命令和SQL2
运维·数据库·时序数据库·dba·tdengine
会飞的土拨鼠呀19 小时前
Linux的存储使用率应该如何计算
linux·运维·服务器
zhangfeng113319 小时前
AMD Instinct MI50(gfx906)上为 Qwen 系列模型优化并可用的 vLLM 相关仓库、Docker 镜像与实践指南。
人工智能·docker·ai编程·qwen·算子开发·vllm·mi50
Elastic 中国社区官方博客20 小时前
OpenTelemetry Java 扩展:无需分叉 agent 即可自定义追踪
java·大数据·运维·开发语言·数据库·人工智能·elasticsearch