Ubuntu 22.04 + XFCE4 + 非 Snap 版 Firefox + VNC/noVNC 部署全步骤

解决 Chrome 容器崩溃问题,通过 apt 安装 Firefox(避开 Snap 权限坑),实现 VNC 桌面访问 code-server

一、环境准备

复制代码
# 1. 创建项目目录(确保路径干净)
mkdir -p /home/gaoyu/docker_novnc && cd /home/gaoyu/docker_novnc

# 2. 清理旧文件(避免残留)
rm -rf Dockerfile docker-compose.yml desktop-data
touch Dockerfile docker-compose.yml

二、编写配置文件

1. 完整 Dockerfile(复制粘贴到 /home/gaoyu/docker_novnc/Dockerfile)
复制代码
FROM ubuntu:22.04

# 核心环境变量(避免交互、设置时区/编码)
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Shanghai
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
ENV VNC_PASSWORD=123456
ENV DISPLAY=:1
ENV VNCPORT=5901
ENV NOVNCPORT=6080
ENV USER=root

# 步骤1:更换阿里云源 + 安装基础依赖
RUN echo "deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse" > /etc/apt/sources.list && \
    echo "deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse" >> /etc/apt/sources.list && \
    apt-get update && apt-get install -y --no-install-recommends \
    wget curl net-tools iproute2 sudo unzip openssl git \
    dbus-x11 xfonts-base xfonts-75dpi xfonts-100dpi fonts-dejavu-core \
    software-properties-common && \
    apt-get clean && rm -rf /var/lib/apt/lists/*

# 步骤2:安装完整 XFCE4 桌面
RUN apt-get update && apt-get install -y --no-install-recommends \
    xfce4 xfce4-goodies xfce4-session xfce4-panel xfce4-settings thunar xfce4-terminal && \
    apt-get clean && rm -rf /var/lib/apt/lists/*

# 步骤3:安装 VNC + noVNC
RUN apt-get update && apt-get install -y --no-install-recommends \
    tightvncserver novnc websockify && \
    apt-get clean && rm -rf /var/lib/apt/lists/*

# 步骤4:安装非 Snap 版 Firefox(核心解决 VNC 权限问题)
## 1. 移除默认 snap 版 Firefox(若存在)
RUN apt-get remove -y --purge snapd firefox || true && \
    rm -rf /var/lib/snapd

## 2. 添加 Mozilla 官方 PPA
RUN add-apt-repository ppa:mozillateam/ppa -y

## 3. 设置 PPA 包优先级(优先于 snap)
RUN echo '
Package: *
Pin: release o=LP-PPA-mozillateam
Pin-Priority: 1001
' > /etc/apt/preferences.d/mozilla-firefox

## 4. 配置无人值守升级
RUN echo 'Unattended-Upgrade::Allowed-Origins:: "LP-PPA-mozillateam:${distro_codename}";' > /etc/apt/apt.conf.d/51unattended-upgrades-firefox

## 5. 安装 apt 版 Firefox(允许降级,避开 snap 冲突)
RUN apt-get update && apt-get install -y --allow-downgrades firefox && \
    apt-get clean && rm -rf /var/lib/apt/lists/*

# 步骤5:配置 VNC 密码(123456)
RUN mkdir -p ~/.vnc && \
    echo $VNC_PASSWORD | vncpasswd -f > ~/.vnc/passwd && \
    chmod 600 ~/.vnc/passwd

# 步骤6:创建 xstartup 脚本(确保 XFCE4 正常启动)
RUN cat > ~/.vnc/xstartup << 'EOF'
#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
export DISPLAY=:1
dbus-launch --sh-syntax --exit-with-session startxfce4
EOF
RUN chmod +x ~/.vnc/xstartup

# 步骤7:生成 noVNC 自签名证书 + 简化访问地址
RUN cd /usr/share/novnc && \
    openssl req -new -x509 -days 365 -nodes -out self.pem -keyout self.pem -subj "/C=CN/ST=Default/L=Default/O=Default/CN=localhost" && \
    ln -sf /usr/share/novnc/vnc.html /usr/share/novnc/index.html

# 步骤8:创建 Firefox 桌面快捷方式(指向 code-server)
RUN mkdir -p /root/Desktop && \
    cat > /root/Desktop/Firefox.desktop << 'EOF'
[Desktop Entry]
Type=Application
Name=Firefox(访问code-server)
Exec=firefox http://my-dev-box:8080
Icon=firefox
Terminal=false
Categories=Network;WebBrowser;
EOF
RUN chmod +x /root/Desktop/Firefox.desktop

# 步骤9:创建启动脚本(含 dbus 启动 + 端口清理)
RUN cat > /start-all.sh << 'EOF'
#!/bin/bash
# 1. 启动 dbus 服务(解决 Firefox 依赖)
mkdir -p /run/dbus
dbus-uuidgen > /etc/machine-id
dbus-daemon --system --fork

# 2. 清理残留进程/锁文件(适配端口释放逻辑)
rm -rf /tmp/.X1-lock /tmp/.X11-unix/X1 > /dev/null 2>&1
killall Xtightvnc vncserver websockify novnc_proxy > /dev/null 2>&1 || true

# 3. 启动 VNC Server
vncserver :1 -geometry 1920x1080 -depth 24 -nolisten tcp -rfbport 5901

# 4. 等待 VNC 端口就绪
until ss -tulpn | grep -q ":5901"; do
    sleep 2
done

# 5. 启动 noVNC 代理
exec websockify --web /usr/share/novnc/ --cert /usr/share/novnc/self.pem 6080 localhost:5901
EOF
RUN chmod +x /start-all.sh

# 暴露端口(VNC:5901,noVNC:6080)
EXPOSE 5901 6080

# 启动容器
CMD ["/bin/bash", "/start-all.sh"]
2. 完整 docker-compose.yml(复制粘贴到 /home/gaoyu/docker_novnc/docker-compose.yml)
复制代码
version: '3.8'

# 与 code-server 互通的网络(需提前创建)
networks:
  dev-network:
    external: true

services:
  xfce4-novnc-firefox:
    build: .
    container_name: ubuntu-xfce-novnc
    privileged: true  # 解决 VNC/Firefox 权限问题
    restart: always   # 异常自动重启
    ports:
      - "5901:5901"   # VNC 原生端口
      - "6080:6080"   # noVNC 网页访问端口(浏览器访问)
    networks:
      - dev-network   # 接入 code-server 所在网络
    volumes:
      - ./desktop-data:/root/Desktop  # 持久化桌面文件
    tmpfs:
      - /run          # 解决容器运行时文件系统权限
      - /run/lock
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:ro  # 兼容 systemd 依赖

三、一键部署命令

复制代码
# 1. 进入项目目录
cd /home/gaoyu/docker_novnc

# 2. 彻底清理旧环境(避免缓存/残留影响)
docker-compose down --rmi all -v --remove-orphans
docker system prune -af

# 3. 确保网络就绪(接入 code-server 所在的 dev-network)
docker network create dev-network > /dev/null 2>&1 || true
docker network connect dev-network my-dev-box > /dev/null 2>&1 || true

# 4. 无缓存构建镜像(关键:确保安装最新 apt 版 Firefox)
docker-compose build --no-cache

# 5. 启动容器(后台运行)
docker-compose up -d

# 6. 验证容器状态(显示 Up 即为成功)
docker ps | grep ubuntu-xfce-novnc

四、访问验证步骤

  1. 网页访问 VNC 桌面 :打开本地浏览器,输入 http://你的虚拟机IP:6080(例如 http://192.168.1.100:6080)。
  2. 输入 VNC 密码 :密码为 123456,点击「Connect」连接桌面。
  3. 启动 Firefox 访问 code-server :双击桌面「Firefox(访问 code-server)」图标,浏览器会自动打开并访问 http://my-dev-box:8080

五、故障排查(可选)

1. 验证 Firefox 安装类型(容器内)
复制代码
docker exec -it ubuntu-xfce-novnc bash
# 检查是否为 apt 版(非 snap)
dpkg -l | grep firefox
# 验证启动(无报错)
firefox --version
2. 手动重启 VNC/noVNC(容器内)
复制代码
# 终止 VNC 服务
vncserver -kill :1

# 终止 noVNC 代理
pkill -f "novnc_proxy"

# 验证端口释放(无输出则成功)
netstat -tuln | grep -E '5901|6080'

# 重新启动
vncserver :1 -geometry 1920x1080 -depth 24 -nolisten tcp -rfbport 5901
websockify --web /usr/share/novnc/ --cert /usr/share/novnc/self.pem 6080 localhost:5901 &

总结

  1. 核心解决:通过 apt 安装 Firefox 避开 Snap 版在 VNC 中的权限问题,替代崩溃的 Chrome;
  2. 关键适配:配置 PPA 优先级、启动 dbus 服务、清理残留进程,确保桌面 / 浏览器稳定运行;
  3. 访问路径http://虚拟机IP:6080 → 密码 123456 → 双击 Firefox 图标 → 访问 code-server。
相关推荐
wq8973872 小时前
[AI问答]Ubuntu 24.04 上 PyTorch的环境搭建
人工智能·pytorch·ubuntu
顶点多余2 小时前
Linux中基础IO知识全解
linux·服务器·算法
等风来不如迎风去2 小时前
【linux】tar [选项] 归档文件名 要打包的文件/目录..
linux·运维·elasticsearch
yuuki2332332 小时前
【Linux】Linux基本指令 & 权限全解析
java·linux·服务器
邓草2 小时前
Ubuntu修改docker数据目录的方法
ubuntu·docker·eureka
沐伊~2 小时前
LINUX基础篇(Ubuntu):
linux·运维·服务器
艾莉丝努力练剑2 小时前
System V IPC底层原理详解
linux·运维·服务器·网络·c++·人工智能·学习
顶点多余2 小时前
使用C/C++实现简易版xshell命令行
linux·运维·windows
落羽的落羽2 小时前
【Linux系统】信号机制拆解,透过内核三张表深入本质
android·java·linux·服务器·c++·spring·机器学习