我主要将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.
有一种很好的半简单的方法可以从Docker容器获得图形输出,而不必在容器内运行sshd
守护进程。当运行单个进程时,Docker可以提供裸露的性能,在本例中,该进程应该是R
。运行一个sshd守护进程将会引入额外的开销,尽管它可能是边缘的。通过将sshd守护进程作为supervisor守护进程的子进程来运行,并不能使这一点变得更好。当一个人很好地利用绑定坐骑时,这两者都可以被免除。构建了容器运行的映像之后,我们启动一个交互式容器,并将/tmp/.x11-unix
文件夹绑定到其中。我将陈述完整的命令,并详细解释它的作用:
docker run-i-t--rm\
-i
设置交互式会话;-t
分配一个伪TTY;--RM
使此容器短暂-U docker\
-u
指定进程应该由用户(这里是docker
)运行,而不是由root运行。这一步很重要(v.i.)!-v/tmp/.x11-unix://tmp/.x11-unix:ro\
xhost +si:localuser:username
它可用于指定单个本地用户(请参见man xhost
)。这意味着username
应该是在本地计算机上运行X11
服务器和运行docker容器的用户的名称。这也是为什么在运行容器时指定用户很重要的原因。最后但并非最不重要的是,还有更复杂的解决方案,即使用xauth
和.xauthority
文件授予对x11
套接字的访问权限(请参见man xauth
)。但是,这还涉及到更多关于x
如何工作的知识。
这可能产生的积极影响可以从需要运行的进程数量中看到,以实现所需的内容。
(1)容器中运行supervisor
和sshd
:
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并因此停止所有其他子应用程序。在这种情况下,抛出适当的异常(最好由应用程序框架/服务