前言
"Docker container is not VMware".
但是我发现相比于虚拟机,容器技术用于开发环境管理也是非常地nice【其实不然,详情看文章末尾】。唯一痛点就是不能使用IDE写代码,因为容器通常是以命令行形式给我们操作的。经过研究,找到了一种方法来解决这个问题,过程曲折而艰辛而长久。本文描述了一种基于X11的命令行系统显示图形化界面,并在docker容器中应用的方法,并且体验十分native。
原理
跳过。
操作
容器环境:ubuntu18.04.
- 启动容器之前在宿主机终端执行命令
xhost +
; - 启动容器参数需要加上
-v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY
; - 容器中安装xclock:
apt update && apt install -y x11-apps
- 验证前置工作是否完成:容器终端执行
xclock
,顺利的话你应该能看到一个时钟应用,如果没有,请尝试解决。此时,你就能使用任何带GUI的程序了,包括IDE,我用的是Goland 2022.2.5,高版本没有试过。但现在还有个问题是你不能在Goland中输入或者显示中文。 - 中文显示乱码是因为没有安装中文字体,关闭Goland,容器中安装一个即可:
apt install fonts-wqy-microhei
,现在,你能够显示中文了。 - 输入中文只需要在宿主机安装中文输入法即可,容器内不需要安装中文输入法,我的宿主机是ubuntu22.04和搜狗拼音输入法,请先保证宿主机的中文输入法正常使用。
- 容器中执行
apt install fcitx -y
- 容器中执行
service dbus restart
; - 容器中执行
apt install gnome-control-center -y
; - 容器中执行
gnome-language-selector
,并通过它安装chinese(simplify),即简体中文支持,输入法框架选择fcitx,Apply system wide后关闭对话框。 - 设置环境变量,建议把下列东西加在~/.bashrc里面:
export LANG="zh_CN.UTF-8" export LANGUAGE="zh_CN.UTF-8" export LC_CTYPE="zh_CN.UTF-8" export LC_NUMERIC="zh_CN.UTF-8" export LC_TIME="zh_CN.UTF-8" export LC_COLLATE="zh_CN.UTF-8" export LC_MONETARY="zh_CN.UTF-8" export LC_MESSAGES="zh_CN.UTF-8" export LC_PAPER="zh_CN.UTF-8" export LC_NAME="zh_CN.UTF-8" export LC_ADDRESS="zh_CN.UTF-8" export LC_TELEPHONE="zh_CN.UTF-8" export LC_MEASUREMENT="zh_CN.UTF-8" export LC_IDENTIFICATION="zh_CN.UTF-8" export LC_ALL="zh_CN.UTF-8" export GTK_IM_MODULE=fcitx export QT_IM_MODULE=fcitx export XMODIFIERS=@im=fcitx
- 重启容器或者重新进入容器终端; 如果能在终端中输入中文就行了。奇怪的是:在其他应用中,比如火狐浏览器依然没法输入中文,GoLand可以。
后记
2023-12-02
文章开头我说的用来做开发环境合适,本身没什么问题。但是要注意要使用Volums将存储和环境本身隔离,还有尽量不要在容器内部做出太多修改,因为一旦做了修改(对环境内容产生增删的操作,如apt install),本身的体积就会增大,最后导致容器占用磁盘空间超出想象。docker是被设计来用于部署的,将它用于别的目的当然会产生其他后果。当然,本文的主题是用于显示UI界面,那部署UI应用也没问题就是了。
2024-02-01
使用最新版Goland(2023.3.3)打开项目可能闪退
本来以为和插件有关,但是仅用了所有插件打开某个项目还是还是闪退,不知道为什么,旧版2022版本的不会。但是有一个骚操作可以用,就是直接打开项目目录的上级目录。