当前位置: 首页 > 知识库问答 >
问题:

ssh X11的替代方案--用于Docker容器的转发

沈实
2023-03-14

我主要将Docker容器作为R语言的独立开发环境来运行。(这里R的用法与文章的其余部分是正交的,即您可以假设任何可以在repl-session中运行的通用程序。)很多时候,这将涉及到做一些事情,如绘图,制作图形等等;我得看看这些。因此,我更愿意选择显示我在容器中创建的图形。到目前为止,我是这样做的。首先,创建DockerFile。除去琐碎的步骤,最相关的步骤是:

# Set root passwd 
RUN echo "root:test" | chpasswd

# Add user so that container does not run as root 
RUN useradd -m docker 
RUN echo "docker:test" | chpasswd 
RUN usermod -s /bin/bash docker 
RUN usermod -aG sudo docker 
ENV HOME /home/docker

RUN mkdir /var/run/sshd 
RUN mkdir -p /var/log/supervisor

# copy servisord.conf which lists the processes to be spawned once this 
# container is started (currently only one: sshd) 
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf

EXPOSE 22 
CMD ["/usr/bin/supervisord"]
docker run -d -p 127.0.0.1:5000:22 -h ubuntu-r -v /home/chb/files/Data:/home/docker/Data -P --name="rdev" ubuntu-r
ssh -X docker@localhost -p 5000.

共有1个答案

颜欣怡
2023-03-14

有一种很好的半简单的方法可以从Docker容器获得图形输出,而不必在容器内运行sshd守护进程。当运行单个进程时,Docker可以提供裸露的性能,在本例中,该进程应该是R。运行一个sshd守护进程将会引入额外的开销,尽管它可能是边缘的。通过将sshd守护进程作为supervisor守护进程的子进程来运行,并不能使这一点变得更好。当一个人很好地利用绑定坐骑时,这两者都可以被免除。构建了容器运行的映像之后,我们启动一个交互式容器,并将/tmp/.x11-unix文件夹绑定到其中。我将陈述完整的命令,并详细解释它的作用:

docker run-i-t--rm\

  • -i设置交互式会话;-t分配一个伪TTY;--RM使此容器短暂
    null

-U docker\

  • -u指定进程应该由用户(这里是docker)运行,而不是由root运行。这一步很重要(v.i.)!

-v/tmp/.x11-unix://tmp/.x11-unix:ro\

    null
    null
xhost +si:localuser:username

它可用于指定单个本地用户(请参见man xhost)。这意味着username应该是在本地计算机上运行X11服务器和运行docker容器的用户的名称。这也是为什么在运行容器时指定用户很重要的原因。最后但并非最不重要的是,还有更复杂的解决方案,即使用xauth.xauthority文件授予对x11套接字的访问权限(请参见man xauth)。但是,这还涉及到更多关于x如何工作的知识。

这可能产生的积极影响可以从需要运行的进程数量中看到,以实现所需的内容。

(1)容器中运行supervisorsshd:

UID                 PID                 PPID                C                STIME               TTY                 TIME                CMD
root                4564                718                 1                18:16               ?                   00:00:00            /usr/bin/python /usr/bin/supervisord
root                4576                4564                0                18:16               ?                   00:00:00            /usr/sbin/sshd

当通过ssh登录并运行r时:

UID                 PID                 PPID                C                 STIME               TTY                 TIME                CMD
root                4564                718                 0                 18:16               ?                   00:00:00            /usr/bin/python /usr/bin/supervisord
root                4576                4564                0                 18:16               ?                   00:00:00            /usr/sbin/sshd
root                4674                4576                0                 18:17               ?                   00:00:00            sshd: docker [priv]   
chb                 4725                4674                0                 18:18               ?                   00:00:00            sshd: docker@pts/0
chb                 4728                4725                1                 18:18               pts/0               00:00:00            -bash

(2)采用绑定挂载法:

UID                 PID                 PPID                C                 STIME               TTY                 TIME                CMD
chb                 4356                718                 0                 18:12               pts/4               00:00:00            /usr/local/lib/R/bin/exec/R --no-save --no-restore
 类似资料:
  • 问题内容: 我正在运行Docker容器,主要是作为该语言的隔离开发环境。(这里的用法与文章的其余部分是正交的,即,您可以假定可以在-session中运行的任何通用程序。)很多时候,这涉及到诸如绘图,制作图形等工作;我需要看看这些。因此,我希望可以选择显示在容器中创建的图形。到目前为止,这是我的操作方式。首先,我创建一个。忽略最简单的步骤是: 我构建图像,然后使用以下命令启动容器: 然后可以SSH到

  • 在为另一种语言构建解释器时,通常建议创建一个基于堆栈的虚拟机,该虚拟机可以解释实际解释器生成的字节码。然后,解释器将由两部分组成:翻译器,它将高级语言的指令转换为虚拟机的字节码,以及虚拟机本身。 我的问题是:口译语言有哪些替代方案?例如,跳过虚拟机并使用C中的函数实现所有指令是否可能(而且切实可行)?在某种程度上,在我看来这应该是可能的,但也许您最终会实现某种类型的最小VM,以实现更复杂的功能。还

  • 本文向大家介绍基于Python中random.sample()的替代方案,包括了基于Python中random.sample()的替代方案的使用技巧和注意事项,需要的朋友参考一下 python中random.sample()方法可以随机地从指定列表中提取出N个不同的元素,但在实践中发现,当N的值比较大的时候,该方法执行速度很慢,如: numpy random模块中的choice方法可以有效提升随机

  • 本文向大家介绍关于win32 gettimeofday替代方案,包括了关于win32 gettimeofday替代方案的使用技巧和注意事项,需要的朋友参考一下 来自nginx代码: 以上就是小编为大家带来的关于win32 gettimeofday替代方案全部内容了,希望大家多多支持呐喊教程~

  • 我最近开始阅读和玩AWS。我对使用该平台可以实现的不同高可用性架构特别感兴趣。具体来说,我正在寻找一个可靠的穷人的解决方案,可以实现使用最少的服务器。 到目前为止,我对主要的HA问题的解决方案感到满意:负载平衡、冗余、自动恢复、可伸缩性... 我唯一的症结是故障转移解决方案。 这是因为ELB是一个两层负载平衡方案。第一层包括基本的基于DNS的循环负载平衡。这将使客户机到达云中的一个ELBendpo

  • 问题内容: 出于各种原因,在编写 Java应用程序时 ,调用会被皱眉,所以如何通知调用过程并非一切都按计划进行? 编辑: 1是任何非零退出代码的。 问题答案: 当“应用程序”实际上是较大的Java应用程序(服务器)的子应用程序(例如servlet,applet)时,对的使用会被拒绝:在这种情况下,它可能会停止JVM并因此停止所有其他子应用程序。在这种情况下,抛出适当的异常(最好由应用程序框架/服务