docker中的linux容器实现窗口运行
## 一、使用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 条回复
- 需要登录 后方可回复, 如果你还没有账号请点击这里注册。
wiseAI
✨ 梦初醒 茅塞开
- 不经他人苦,莫劝他人善。
- 能量足,心态稳,温和坚定可以忍。
- 辛苦决定不了收入,真正决定收入的只有一个,就是不可替代性。
- 要么忙于生存,要么赶紧去死!
- 内心强大到混蛋,比什么都好!
- 规范流程比制定制度更重要!
-
立志需要高远,但不能急功近利;
行动需要迅速,却不可贪图速成。 - 不要强求人品,要设计高效的机制。
-
你弱的时候,身边都是鸡零狗碎;
你强的时候,身边都是风和日丽。 - 机制比人品更可靠,契约比感情更可靠。
- 合作不意味着没有冲突,却是控制冲突的最好方法。
- 误解是人生常态,理解本是稀缺的例外。
- 成功和不成功之间,只差一次坚持!
- 祁连卧北雪,大漠壮雄关。
- 利益顺序,过程公开,机会均等,付出回报。
