【Docker】【2.docker 安装 ubuntu 桌面版】

一、目标

使用 docker 安装不同版本的 ubuntu .

可以通过 vnc 或者 直接在主机上显示。

二、使用 vnc 访问的方式

Dockerfile

shell 复制代码
FROM ubuntu:20.04

ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Shanghai

RUN apt-get update && \
    apt-get install -y tzdata sudo vim wget curl net-tools dbus-x11 x11-apps && \
    apt-get install -y xfce4 xfce4-terminal tightvncserver && \
    apt-get clean && rm -rf /var/lib/apt/lists/*

# 创建普通用户
RUN useradd -m -s /bin/bash dockeruser && \
    echo "dockeruser ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

USER dockeruser
WORKDIR /home/dockeruser

# 设置 VNC 密码
RUN mkdir -p /home/dockeruser/.vnc && \
    echo "1234" | vncpasswd -f > /home/dockeruser/.vnc/passwd && \
    chmod 600 /home/dockeruser/.vnc/passwd

# 创建 xstartup 启动 XFCE
RUN echo '#!/bin/bash\n\
xrdb $HOME/.Xresources\n\
startxfce4 &' > /home/dockeruser/.vnc/xstartup && \
    chmod +x /home/dockeruser/.vnc/xstartup

# 修正启动脚本(含 USER 环境变量 + 等待日志文件)
RUN echo '#!/bin/bash\n\
export USER=dockeruser\n\
export HOME=/home/dockeruser\n\
export DISPLAY=:1\n\
mkdir -p $HOME/.vnc\n\
vncserver :1 -geometry 1280x800 -depth 24\n\
echo "VNC server started on :1 (port 5901)"\n\
echo "To connect: vncviewer localhost:5901"\n\
# 等待日志文件创建\n\
for i in {1..10}; do\n\
    log_file=$(ls -1 $HOME/.vnc/*.log 2>/dev/null | head -n 1)\n\
    if [ -n "$log_file" ]; then\n\
        echo "Tailing log file: $log_file"\n\
        tail -f "$log_file"\n\
        exit 0\n\
    fi\n\
    sleep 1\n\
done\n\
echo "Warning: no VNC log file found."\n\
exec bash' > /home/dockeruser/start_vnc.sh && \
    chmod +x /home/dockeruser/start_vnc.sh

CMD ["/home/dockeruser/start_vnc.sh"]
#CMD ["startxfce4"]

编译

shell 复制代码
docker stop ubuntu20-xfce-vnc 2>/dev/null || true
docker rm ubuntu20-xfce-vnc 2>/dev/null || true

docker build -t ubuntu20-xfce-vnc .

启动docker

shell 复制代码
# 允许 X11 显示(可选)

xhost +local:root

docker run -it --rm \
    --name ubuntu20.4-vnc \
    -p 5901:5901 \
    ubuntu20-xfce-vnc

使用vnc连接

shell 复制代码
$ vncviewer localhost:5901
Connected to RFB server, using protocol version 3.8
Enabling TightVNC protocol extensions
Performing standard VNC authentication
Password: 

密码: 1234

三、使用 startxfce4 直接显示在 host 中

Dockerfile

shell 复制代码
FROM ubuntu:20.04

ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Shanghai

RUN apt-get update && \
    apt-get install -y tzdata sudo vim wget curl net-tools dbus-x11 x11-apps && \
    apt-get install -y xfce4 xfce4-terminal tightvncserver && \
    apt-get clean && rm -rf /var/lib/apt/lists/*

# 创建普通用户
RUN useradd -m -s /bin/bash dockeruser && \
    echo "dockeruser ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

USER dockeruser
WORKDIR /home/dockeruser

# 设置 VNC 密码
RUN mkdir -p /home/dockeruser/.vnc && \
    echo "1234" | vncpasswd -f > /home/dockeruser/.vnc/passwd && \
    chmod 600 /home/dockeruser/.vnc/passwd

# 创建 xstartup 启动 XFCE
RUN echo '#!/bin/bash\n\
xrdb $HOME/.Xresources\n\
startxfce4 &' > /home/dockeruser/.vnc/xstartup && \
    chmod +x /home/dockeruser/.vnc/xstartup

# 修正启动脚本(含 USER 环境变量 + 等待日志文件)
RUN echo '#!/bin/bash\n\
export USER=dockeruser\n\
export HOME=/home/dockeruser\n\
export DISPLAY=:1\n\
mkdir -p $HOME/.vnc\n\
vncserver :1 -geometry 1280x800 -depth 24\n\
echo "VNC server started on :1 (port 5901)"\n\
echo "To connect: vncviewer localhost:5901"\n\
# 等待日志文件创建\n\
for i in {1..10}; do\n\
    log_file=$(ls -1 $HOME/.vnc/*.log 2>/dev/null | head -n 1)\n\
    if [ -n "$log_file" ]; then\n\
        echo "Tailing log file: $log_file"\n\
        tail -f "$log_file"\n\
        exit 0\n\
    fi\n\
    sleep 1\n\
done\n\
echo "Warning: no VNC log file found."\n\
exec bash' > /home/dockeruser/start_vnc.sh && \
    chmod +x /home/dockeruser/start_vnc.sh

#CMD ["/home/dockeruser/start_vnc.sh"]
CMD ["startxfce4"]

编译

shell 复制代码
docker stop ubuntu20-xfce-vnc 2>/dev/null || true
docker rm ubuntu20-xfce-vnc 2>/dev/null || true

docker build -t ubuntu20-xfce-vnc .

启动 docker

shell 复制代码
#!/bin/bash
docker stop ubuntu-xfce-vnc 2>/dev/null || true
docker rm ubuntu-xfce-vnc 2>/dev/null || true
set -e

# 允许 X11 显示(可选)
xhost +local:root

# 启动容器
docker run -it --rm \
    --name ubuntu-xfce-vnc \
    --network host \
    -e DISPLAY=$DISPLAY \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -v $HOME:/home/dockeruser/host_home \
    ubuntu20-xfce-vnc startxfce4

此时在主机上会出现, 下面的内容,表示你已经 将 docker 的输出显示在自己的主机里面了。

强制杀死 startxfce4

shell 复制代码
pkill -f xfce; pkill xfce4-session; ps aux | grep xfce
相关推荐
数智工坊2 小时前
Zotero自建Ubuntu WebDAV附件同步方案(完美解决存储空间不足)
linux·运维·ubuntu
我是小灰灰吖5 小时前
QT在线安装器使用指南:从下载到配置完整教程
linux·qt·ubuntu
MIXLLRED7 小时前
解决——Ubuntu远程桌面指令更换网络
linux·网络·ubuntu
童槿顏丶7 小时前
docker自动化部署脚本
docker·eureka·自动化
我是小灰灰吖10 小时前
Ubuntu 22.04 + Qt 6.9.3 应用程序打包与部署完整指南
qt·ubuntu
爱莉希雅&&&10 小时前
K8s NFS+StorageClass+PV/PVC+Deployment 实战笔记
笔记·容器·kubernetes
GlueNa2SiO311 小时前
06-Docker存储与数据持久化
笔记·学习·docker
一位正在转型AI全栈的前端工程师12 小时前
前端转全栈:从 502 到 200,我的第一个 Docker+Nginx+Node.js 项目
docker·容器
自律懒人12 小时前
AI 沙箱逃逸 4 连发:GPT-5.6 黑进 Hugging Face、Kimi K3 抄答案,5 步给本地 Agent 装围栏
ubuntu
jason_renyu12 小时前
Linux Docker 服务管理与排查实战指南(新手速查版)
linux·docker·新手docker学习·docker日志查询·docker服务管理