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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了让docker容器系统拥有图形化桌面相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

这里我选择安装GNOME Desktop

2.2配置默认启动图形界面

3.安装 vnc server

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

2.修改配置文件

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

开始编辑配置:

会看到如下配置内容:

[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链接密码

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

4.重启容器并且更新systemctl

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

6.查看进程是否启动了

如果看到

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 端口规则

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

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

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

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

内容大概如下:
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服务,使新添加的规则生效

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

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

Docker运行图形化程序

 原理

Docker支持图形化程序,是利用Linux的X11技术。

相关文章

引文详情

如何在Docker容器中启动D-Bus

翻译自 https://georgik.rocks/how-to-start-d-bus-in-docker-container/

很多Linux应用需要用到 D-Bus, 但它在Docker容器中默认并不存在

当你尝试启动这类应用时,你会收到一个错误信息:

D-Bus library appears to be incorrectly set up; failed to read machine uuid: Failed to open "/var/lib/dbus/machine-id": No such file or directory
See the manual page for dbus-uuidgen to correct this issue.
  D-Bus not built with -rdynamic so unable to print a backtrace
Aborted

首先你需要通过下面命令生成缺失的 machine-id(译者注:我一般是直接在容器启动时挂载host上的machine-id):

dbus-uuidgen > /var/lib/dbus/machine-id

这样以来,即使DBus守护进程没有启动,应用也能启动

要在容器中启动D-Bus守护进程,你需要运行下面命令

mkdir -p /var/run/dbus
dbus-daemon --config-file=/usr/share/dbus-1/system.conf --print-address

在 Centos 上则改为:

dbus-daemon --config-file=/etc/dbus-1/system.conf --print-address

现在守护进程运行起来了,你的应用也能用了. 输出的结果类似于下面这样:

unix:path=/var/run/dbus/system_bus_socket,guid=9cfabcc6f66027251e092e955d09e707

以上是关于让docker容器系统拥有图形化桌面的主要内容,如果未能解决你的问题,请参考以下文章

Docker容器化技术实战操作汇总(附开发环境搭建)

docker容器——介绍安装使用流程解读制作镜像与图形化工具

Docker运行图形化程序

Docker图形化管理工具--Portainer简介及部署

在docker搭建centos7远程桌面环境

docker图形化管理界面portainer安装