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

版本对照表
注意:目前本文中安装tigervnc的方法仅适用于ubuntu 20.04,18和22都存在问题,仅供参考。
ubuntu虚拟机(docker镜像母盘)
项目 | 版本 | 备注 |
---|
大版本 | Ubuntu 20.04.6 LTS Server | 下载地址 |
内核版本 | 5.4.0-196-generic | — |
xfce | 4.14 | — |
docker客户端
项目 | 版本 | 备注 |
---|
系统分支 | openEuler 20.03 (LTS-SP3) | 下载地址 |
内核版本 | 4.19.90-2401.1.0.0233.oe1.x86_64 | — |
docker | 27.3.1, build ce12230 | — |
母盘准备
这一节主要是创建docker镜像的母盘,核心思想是创建一个体积较小的带桌面的操作系统。因为这一步较为简单因此大部分步骤都会被略过。
准备操作系统
- 新建虚拟机,在虚拟机中挂载ubuntu 20的iso,然后正常安装Server版本即可
- 进入系统后首先执行
sudo apt upgrade -y
确保所有软件包都是最新版本,然后安装tasksel以安装桌面环境1
| sudo apt install dialog tasksel -y
|
- 在tasksel中选择“Xubuntu minimal installation”,确定后等待安装完成,随后重启。
- 安装tigervnc:
1
| sudo apt install tigervnc-standalone-server -y
|
随后在非root账户下执行vncpasswd
设置VNC连接密码 - 建立
~/.vnc/xstartup
配置文件:1 2 3 4
| #!/bin/sh unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS exec startxfce4
|
加执行权限:1
| chmod +x ~/.vnc/xstartup
|
- 测试VNC是否安装正确:
1
| vncserver -localhost no -geometry 1280x720 -depth 24
|
此时可以在其他客户端上连接本机5901端口查看是否能够连接以及图像是否正常。
测试正常后执行如下命令干掉测试用的实例: - 这一步正常是创建VNC Server的systemd服务,但是由于docker中并不使用systemd管理服务,因此创建了也没用,所以此步跳过,之后可能会写额外的文章专门介绍这一部分。
- 清理系统缩小镜像大小,逐条执行即可:
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
|
- 禁用swap:随后删除
/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
| cat system.tar | docker import - ubuntu-vnc-20.04:1.2
|
其中最后一部分是镜像名和标签名,可以自行更改。 - 创建dockerfile用的文件夹,然后创建
dockerfile
:1 2 3 4 5 6 7 8 9 10 11 12 13 14
| FROM ubuntu-vnc-20.04:1.2
ARG DEBIAN_FRONTEND=noninteractive ENV TZ=Asia/Shanghai
ADD run.sh /run.sh RUN chmod 755 /run.sh
EXPOSE 22 5901 CMD ["/run.sh"]
|
- 创建执行脚本
run.sh
:1 2 3 4 5 6 7 8 9
| #!/bin/bash
rm -f /tmp/.X1-lock su lxnchan -c "/usr/bin/vncserver -localhost no -depth 24 -geometry 1920x1080 :1"
mkdir -p /run/sshd /usr/sbin/sshd -D
|
- 此时你应该具备如下的文件和镜像:
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
|
- 创建最终镜像:
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
|
- 最后运行查看效果:
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查看即可得到头图效果。