docker中的linux容器实现窗口运行

130   /   0   /   0   /   0   /   发布于 241天前
## 一、使用docker-compose管理,创建docker-compose.yml文件 ``` services: debian-gui: build: context: . dockerfile: Dockerfile args: # 将宿主机的当前用户 UID/GID 传递给构建(确保文件权限一致) UID: ${UID:-1000} GID: ${GID:-1000} image: debian-gui-wiseai container_name: debian-gui environment: # 图形界面:传递宿主机的 DISPLAY 变量 - DISPLAY=${DISPLAY} # 音频:指定 PulseAudio 服务 socket 路径 - PULSE_SERVER=unix:/run/user/${UID:-1000}/pulse/native - LANG=zh_CN.UTF-8 - LC_ALL=zh_CN.UTF-8 volumes: # X11 通信 socket - /tmp/.X11-unix:/tmp/.X11-unix:rw # PulseAudio 音频 socket(需要与容器内用户 UID 匹配) - /run/user/${UID:-1000}/pulse:/run/user/${UID:-1000}/pulse:rw # 可选:挂载数据目录,便于交换文件 - ./data:/home/user/data # 某些 GUI 应用需要共享 IPC 命名空间(如 Qt、Java 应用) ipc: host # 保持标准输入打开并分配伪终端,以便交互式使用 stdin_open: true tty: true cap_add: - SYS_PTRACE devices: - /dev/dri:/dev/dri privileged: true # 默认启动 Bash 登录 shell # command: /bin/bash -l ``` ## 二、创建Dockerfile文件 ``` FROM debian:latest # 设置环境变量 ENV DEBIAN_FRONTEND=noninteractive ENV LANG=zh_CN.UTF-8 ENV LC_ALL=zh_CN.UTF-8 # 替换软件源为阿里云(关键步骤) RUN sed -i 's|http://deb.debian.org/debian|http://mirrors.aliyun.com/debian|g' /etc/apt/sources.list.d/debian.sources && \ sed -i 's|http://deb.debian.org/debian-security|http://mirrors.aliyun.com/debian-security|g' /etc/apt/sources.list.d/debian.sources # 安装基础工具和 XFCE 桌面环境 RUN apt-get update && apt-get install -y --no-install-recommends \ sudo \ pulseaudio-utils \ alsa-utils \ x11-apps \ xorg \ dbus \ dbus-x11 \ xfce4 \ xfce4-terminal \ xfce4-goodies \ firefox-esr \ firefox-esr-l10n-zh-cn \ # 输入法相关 fcitx5 \ fcitx5-chinese-addons \ fcitx5-frontend-gtk3 \ fcitx5-frontend-qt5 \ fcitx5-config-qt \ fcitx5-table-wubi98-pinyin \ # 中文字体 fonts-wqy-microhei \ fonts-noto-cjk \ # 语言支持 locales \ ca-certificates \ && rm -rf /var/lib/apt/lists/* # 配置中文 locale RUN sed -i 's/# zh_CN.UTF-8 UTF-8/zh_CN.UTF-8 UTF-8/' /etc/locale.gen && \ locale-gen zh_CN.UTF-8 && \ update-locale LANG=zh_CN.UTF-8 # 创建用户 user,使用构建参数 UID/GID(默认为宿主机当前用户) ARG UID=1000 ARG GID=1000 RUN groupadd -g ${GID} user && useradd -m -u ${UID} -g user -s /bin/bash user # 允许 user 无密码使用 sudo(可选,便于容器内安装软件) RUN echo "user ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers #更新证书 RUN update-ca-certificates # 复制启动脚本并设置执行权限 COPY start-desktop.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/start-desktop.sh # 设置工作目录 WORKDIR /home/user # 切换为普通用户 USER user # 默认启动脚本 CMD ["/usr/local/bin/start-desktop.sh"] ``` ### 三、启动脚本start.sh ``` #!/bin/bash # 设置输入法环境变量(对 GTK/Qt 应用生效) export GTK_IM_MODULE=fcitx5 export QT_IM_MODULE=fcitx5 export XMODIFIERS=@im=fcitx5 # 启动 fcitx5 输入法守护进程(后台运行) fcitx5 -d # 启动 XFCE 桌面环境(前台运行,作为容器主进程) exec xfce4-session ``` ## 四、运行 ``` xhost +local:root docker compose up -d ``` **注意:在下次启动的时候一定要先运行 `xhost +local:root`**
  • 共 0 条回复
  • 需要登录 后方可回复, 如果你还没有账号请点击这里注册
梦初醒 茅塞开
  • 不经他人苦,莫劝他人善。
  • 能量足,心态稳,温和坚定可以忍。
  • 辛苦决定不了收入,真正决定收入的只有一个,就是不可替代性。
  • 要么忙于生存,要么赶紧去死!
  • 内心强大到混蛋,比什么都好!
  • 规范流程比制定制度更重要!
  • 立志需要高远,但不能急功近利;
    行动需要迅速,却不可贪图速成。
  • 不要强求人品,要设计高效的机制。
  • 你弱的时候,身边都是鸡零狗碎;
    你强的时候,身边都是风和日丽。
  • 机制比人品更可靠,契约比感情更可靠。
  • 合作不意味着没有冲突,却是控制冲突的最好方法。
  • 误解是人生常态,理解本是稀缺的例外。
  • 成功和不成功之间,只差一次坚持!
  • 祁连卧北雪,大漠壮雄关。
  • 利益顺序,过程公开,机会均等,付出回报。