让docker容器系统拥有图形化桌面

目前让docker 运行的系统拥有gui的大概有两个,一个是X11server 、一个是novnc,搭建成本来说vnc配置还是比低的。但是novnc是vnc的web客户端,虽然方便,但是个人感觉web性能可能会低一些,所以本教程去掉web这部分,直接用vnc客户端链接。开始吧。


一、docker拉取镜像,并创建容器

1.这里我选用官方的centos7镜像(注意镜像是不含desktop的)

# docker pull centos

2.启动镜像创建并创建容器(关于各启动参数的意思 --name 是给容器起名字,方便调用 -p 是映射内外端口,这里映射了5901端口,也就是等下要运行的vncserver所需要的端口)

# docker run --name centos-desktop-vnc --privileged -p 5901:5901 --ulimit memlock=-1 -td centos /usr/sbin/init

二、进入系统容器操作安装需要的组件

1.进入容器(由于我们给容器起了名字,所以我们可以直接定位进入容器,不需要再查看容器id)

# docker  exec -it centos-desktop-vnc bash     ### “centos-desktop-vnc” 是我们之前创建时给容器的名字

2.安装desktop
2.1先看一下有什么desktop可以装

# yum grouplist    ##会出现一个列表,根据自己的需求选择带desktop的安装

这里我选择安装GNOME Desktop

# yum groupinstall GNOME Desktop

2.2配置默认启动图形界面

#断开默认启动方式
# unlink  /etc/systemd/system/default.target  
/#创建图形启动方式为默认启动方式
# ln -sf  /lib/systemd/system/graphical.target   /etc/systemd/system/default.target   

3.安装 vnc server

 yum -y install tigervnc-server tigervnc-server-module 

三、配置软件

1.复制配置模板文件为vncserver@:1.service

 cp /lib/systemd/system/vncserver@.service /lib/systemd/system/vncserver@:1.service

2.修改配置文件

nano这个软件可能需要安装一下

yum install nano

开始编辑配置:

nano  /lib/systemd/system/vncserver@:1.service

会看到如下配置内容:

[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target

[Service]
Type=forking

ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/sbin/runuser -l <USER> -c "/usr/bin/vncserver %i"
PIDFile=/home/<USER>/.vnc/%H%i.pid
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'

[Install]
WantedBy=multi-user.target

我们只要把< USER >替换成我们的用户名就可以了,由于docker是以root登入的,我们把< USER >改成root
改好如下:
[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target

[Service]
Type=forking

ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/sbin/runuser -l root -c "/usr/bin/vncserver %i"
PIDFile=/home/root/.vnc/%H%i.pid
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'

[Install]
WantedBy=multi-user.target

3.设置vnc链接密码

 vncserver     #输入两次密码,完成密码设置

如果有view-only选项的话选n

4.重启容器并且更新systemctl

4.1.   exit  # 退出容器
4.2.   docker restart centos-desktop-vnc # 重启容器
4.3.   docker  exec -it centos-desktop-vnc bash  #重新进入容器
4.4.   systemctl daemon-reload #更新systemctl

如果 systemctl daemon-reload 和 systemctl start vncserver@:1.service 发生错误,可以尝试重启容器,并把
/lib/systemd/system/vncserver@:1.service 配置里的Type=forking改为Type=simple
5.启动vncserver@:1.service服务,并设置开机自启

systemctl start vncserver@:1.service && systemctl enable vncserver@:1.service

6.查看进程是否启动了

netstat -anp|grep 590   # 如果没有netstat这个命令,输入 yum install net-tools -y 进行安装 

如果看到

tcp 0 0 0.0.0.0:5901 0.0.0.0:* LISTEN 233/Xvnc
tcp 0 0 172.17.0.2:5901 172.17.0.1:55824 ESTABLISHED 233/Xvnc
tcp6 0 0 :::5901 :::* LISTEN 233/Xvnc

就说明vnc服务起来了

7.配置防火墙
CentOS7默认的防火墙不是iptables,而是firewalle,
所以 根据个人喜好选择以下两种方案
方案一(firewalle)
1.添加firewalle 端口规则

#添加5901端口
firewall-cmd --zone=public --add-port=5901/tcp
#重载 firewalle
 firewall-cmd --reload

方案二(iptables)
1.先检查是否安装了iptables

#查看iptables服务状态
 service iptables status    
# 如果报错没有iptables服务 先安装 
 yum install -y iptables iptables-services

2.禁用/停止自带的firewalld服务

#停止firewalld服务
systemctl stop firewalld
#禁用firewalld服务
systemctl mask firewalld

3.启动iptables服务并设置自启动

#开启服务
systemctl start iptables.service
#注册iptables服务
systemctl enable iptables.service

4.添加vnc服务端口iptables规则

#编辑iptables
nano /etc/sysconfig/iptables
#在合适位置加上
-A INPUT -m state --state NEW -m tcp -p tcp --dport 5900:5903 -j ACCEPT

内容大概如下:
please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 5901 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
5.重启iptables服务,使新添加的规则生效

service iptables restart

6.完结:
现在你可以使用vncwiewer等工具来链接你的docker了

后续:建议保存你的容器为自定义镜像以供使用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容