IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    从已有Linux系统创建带桌面环境的Docker镜像

    泠泫凝发表于 2024-09-29 14:35:31
    love 0

    需求如下:需要在docker容器中起一套桌面环境,连接方式为VNC。本文将从头开始创建一个满足上述需求的原生docker镜像。

    版本对照表

    注意:目前本文中安装tigervnc的方法仅适用于ubuntu 20.04,18和22都存在问题,仅供参考。

    ubuntu虚拟机(docker镜像母盘)

    项目版本备注
    大版本Ubuntu 20.04.6 LTS Server下载地址
    内核版本5.4.0-196-generic—
    xfce4.14—

    docker客户端

    项目版本备注
    系统分支openEuler 20.03 (LTS-SP3)下载地址
    内核版本4.19.90-2401.1.0.0233.oe1.x86_64—
    docker27.3.1, build ce12230—

    母盘准备

    这一节主要是创建docker镜像的母盘,核心思想是创建一个体积较小的带桌面的操作系统。因为这一步较为简单因此大部分步骤都会被略过。

    准备操作系统

    1. 新建虚拟机,在虚拟机中挂载ubuntu 20的iso,然后正常安装Server版本即可
    2. 进入系统后首先执行sudo apt upgrade -y确保所有软件包都是最新版本,然后安装tasksel以安装桌面环境
      1
      sudo apt install dialog tasksel -y
    3. 在tasksel中选择“Xubuntu minimal installation”,确定后等待安装完成,随后重启。
    4. 安装tigervnc:
      1
      sudo apt install tigervnc-standalone-server -y
      随后在非root账户下执行vncpasswd设置VNC连接密码
    5. 建立~/.vnc/xstartup配置文件:
      1
      2
      3
      4
      #!/bin/sh
      unset SESSION_MANAGER
      unset DBUS_SESSION_BUS_ADDRESS
      exec startxfce4
      加执行权限:
      1
      chmod +x ~/.vnc/xstartup
    6. 测试VNC是否安装正确:
      1
      vncserver -localhost no -geometry 1280x720 -depth 24
      此时可以在其他客户端上连接本机5901端口查看是否能够连接以及图像是否正常。
      测试正常后执行如下命令干掉测试用的实例:
      1
      vncserver -kill :1
    7. 这一步正常是创建VNC Server的systemd服务,但是由于docker中并不使用systemd管理服务,因此创建了也没用,所以此步跳过,之后可能会写额外的文章专门介绍这一部分。
    8. 清理系统缩小镜像大小,逐条执行即可:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      apt purge snapd --auto-remove -y
      apt autoremove -y
      apt autoclean
      sync; echo 3 > /proc/sys/vm/drop_caches
      rm -rf /var/lib/apt/lists/*
      rm -rf /tmp/*
      rm -rf /var/tmp/*
      rm -rf /var/cache/*
      find /var/log -type f -delete
      rm -rf /var/log/*
      dpkg --list | awk '$1=="ii" {print $2}' | grep linux-image | grep -v $(uname -r) | xargs sudo apt-get remove --purge -y
    9. 禁用swap:
      1
      swapoff -a
      随后删除/etc/fstab中的swap挂载行即可。

    打包系统

    这一节就一条命令:

    1
    2
    3
    tar -cvpf /tmp/system.tar --directory=/ --exclude=proc --exclude=sys \
    --exclude=dev --exclude=run --exclude=boot --exclude=.history \
    --exclude=Templates --exclude=.bash_history --exclude=/var/log/journal/* .

    等待执行完成即可,最终打包好的文件在/tmp/system.tar。

    docker客户端

    这一节主要是最终生成镜像并运行测试。

    1. 导入系统包:
      1
      cat system.tar | docker import - ubuntu-vnc-20.04:1.2
      其中最后一部分是镜像名和标签名,可以自行更改。
    2. 创建dockerfile用的文件夹,然后创建dockerfile:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      # 指定初始镜像
      FROM ubuntu-vnc-20.04:1.2

      # 解决build过程中卡在选择区域
      ARG DEBIAN_FRONTEND=noninteractive
      ENV TZ=Asia/Shanghai

      # 添加执行脚本
      ADD run.sh /run.sh
      RUN chmod 755 /run.sh

      # 将22端口暴露出去,如果有其他需要还可以添加更多的端口
      EXPOSE 22 5901
      CMD ["/run.sh"]
    3. 创建执行脚本run.sh:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      #!/bin/bash

      # remove X11-lock
      rm -f /tmp/.X1-lock
      su lxnchan -c "/usr/bin/vncserver -localhost no -depth 24 -geometry 1920x1080 :1"

      # solve permission problem
      mkdir -p /run/sshd
      /usr/sbin/sshd -D
    4. 此时你应该具备如下的文件和镜像:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      [root@localhost ubuntu-desktop-vnc]# ls -la
      total 16
      drwxr-xr-x 2 root root 4096 Sep 29 21:20 .
      dr-xr-x---. 5 root root 4096 Sep 29 20:44 ..
      -rw-r--r-- 1 root root 298 Sep 29 21:25 dockerfile
      -rw-r--r-- 1 root root 154 Sep 29 21:27 run.sh
      [root@localhost ubuntu-desktop-vnc]# docker images
      REPOSITORY TAG IMAGE ID CREATED SIZE
      ubuntu-vnc-20.04 1.2 33df6c7db864 2 hours ago 2.74GB
    5. 创建最终镜像:
      1
      docker build -t ubuntu-desktop-vnc-20.04:1.4 .
      执行结果应该是:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      [root@localhost ubuntu-desktop-vnc]# docker build -t ubuntu-desktop-vnc-20.04:1.4 .
      [+] Building 0.2s (8/8) FINISHED docker:default
      => [internal] load build definition from dockerfile 0.0s
      => => transferring dockerfile: 337B 0.0s
      => [internal] load metadata for docker.io/library/ubuntu-vnc-20.04:1.2 0.0s
      => [internal] load .dockerignore 0.0s
      => => transferring context: 2B 0.0s
      => [internal] load build context 0.0s
      => => transferring context: 189B 0.0s
      => CACHED [1/3] FROM docker.io/library/ubuntu-vnc-20.04:1.2 0.0s
      => [2/3] ADD run.sh /run.sh 0.0s
      => [3/3] RUN chmod 755 /run.sh 0.1s
      => exporting to image 0.0s
      => => exporting layers 0.0s
      => => writing image sha256:7ec1df01655a2664891838d39d8528ba69e2b193aa8715182b47a274eabb2c2d 0.0s
      => => naming to docker.io/library/ubuntu-desktop-vnc-20.04:1.4 0.0s
    6. 最后运行查看效果:
      1
      docker run -d -p 17222:22 -p 5901:5901 ubuntu-desktop-vnc-20.04:1.4
      可以通过docker logs -f [container]查看日志:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      [root@localhost ubuntu-desktop-vnc]# docker run -d -p 17222:22 -p 5901:5901 ubuntu-desktop-vnc-20.04:1.4
      b0be8b6efab02b9545065c15d51ef9aa6ec115d8a4abd22313b898c4f0679fa5
      [root@localhost ubuntu-desktop-vnc]# docker logs -f b0

      New 'b0be8b6efab0:1 (lxnchan)' desktop at :1 on machine b0be8b6efab0

      Starting applications specified in /home/lxnchan/.vnc/xstartup
      Log file is /home/lxnchan/.vnc/b0be8b6efab0:1.log

      Use xtigervncviewer -SecurityTypes VncAuth,TLSVnc -passwd /home/lxnchan/.vnc/passwd b0be8b6efab0:1 to connect to the VNC server.

      ^Ccontext canceled
      并且最后使用VNC Viewer查看即可得到头图效果。


沪ICP备19023445号-2号
友情链接