美文网首页日常软件使用
让docker容器系统拥有图形化桌面

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

作者: LinGeeHuy | 来源:发表于2018-05-20 19:19 被阅读0次

    目前让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了

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

    相关文章

      网友评论

        本文标题:让docker容器系统拥有图形化桌面

        本文链接:https://www.haomeiwen.com/subject/jwrtjftx.html