解决 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
四、访问验证步骤
- 网页访问 VNC 桌面 :打开本地浏览器,输入
http://你的虚拟机IP:6080(例如http://192.168.1.100:6080)。 - 输入 VNC 密码 :密码为
123456,点击「Connect」连接桌面。 - 启动 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 &
总结
- 核心解决:通过 apt 安装 Firefox 避开 Snap 版在 VNC 中的权限问题,替代崩溃的 Chrome;
- 关键适配:配置 PPA 优先级、启动 dbus 服务、清理残留进程,确保桌面 / 浏览器稳定运行;
- 访问路径 :
http://虚拟机IP:6080→ 密码 123456 → 双击 Firefox 图标 → 访问 code-server。