Lxn-Chan!

(~ ̄▽ ̄)→))* ̄▽ ̄*)o

需求如下:需要在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备19013963号

萌ICP备 20219421 号

中国互联网违法和不良信息举报中心

架构版本号:8.1.6 | 本站已全面支持IPv6

正在载入运行数据(1/2)请稍后...
正在载入运行数据(2/2)请稍后...

Copyright 2024 LingXuanNing, All rights reserved.