需求如下:需要在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:随后在非root账户下执行
1
sudo apt install tigervnc-standalone-server -y
vncpasswd
设置VNC连接密码 - 建立
~/.vnc/xstartup
配置文件:加执行权限:1
2
3
4
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
exec startxfce41
chmod +x ~/.vnc/xstartup
- 测试VNC是否安装正确:此时可以在其他客户端上连接本机5901端口查看是否能够连接以及图像是否正常。
1
vncserver -localhost no -geometry 1280x720 -depth 24
测试正常后执行如下命令干掉测试用的实例:1
vncserver -kill :1
- 这一步正常是创建VNC Server的systemd服务,但是由于docker中并不使用systemd管理服务,因此创建了也没用,所以此步跳过,之后可能会写额外的文章专门介绍这一部分。
- 清理系统缩小镜像大小,逐条执行即可:
1
2
3
4
5
6
7
8
9
10
11apt 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:随后删除
1
swapoff -a
/etc/fstab
中的swap挂载行即可。
打包系统
这一节就一条命令:
1 | tar -cvpf /tmp/system.tar --directory=/ --exclude=proc --exclude=sys \ |
等待执行完成即可,最终打包好的文件在/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
# 解决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"] - 创建执行脚本
run.sh
:1
2
3
4
5
6
7
8
9
# 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 - 此时你应该具备如下的文件和镜像:
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]
查看日志:并且最后使用VNC Viewer查看即可得到头图效果。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