有一种从Docker容器获取图形输出的好方法,并且无需
sshd在容器内运行守护程序。当运行单个进程(本来应该是这样)时,Docker可以提供裸机性能
R。运行sshd守护程序可能会带来一些额外的开销,尽管可能很小。通过将sshd守护程序作为supervisor守护程序的子进程运行,这并没有得到改善。当一个人充分利用绑定安装时,两者都可以省去。在构建了应该从中运行容器的映像之后,我们启动一个交互式容器并将该
/tmp/.X11-unix文件夹绑定安装
到其中。我将陈述完整的命令并详细解释它的作用:
泊坞窗运行-i -t –rm
-i
建立一个交互式会话;-t
分配一个伪tty;--rm
使这个容器短暂
-e DISPLAY = $ DISPLAY
- 将主机显示设置为本地计算机显示(通常为
:0
)
-u泊坞窗
-u
指定该进程应由用户(在此处docker
)而不是root运行。此步骤很重要(vi)!
-v /tmp/.X11-unix:/tmp/.X11-unix:ro
-v
bind 将本地计算机上的X11
套接字安装/tmp/.X11-unix
到/tmp/.X11-unix
容器中,:ro
并使该套接字为只读。
--name =“ rdev” ubuntu-r R
--name=""
specify the name of the container (hererdev
); the image you want to run the container from (hereubuntu-r
); the process you want to run in the container (hereR
). (The last step of specifying a process is only necessary if you have not set a defaultCMD
orENTRYPOINT
for your image.)
发出此命令后,您应该查看漂亮的
R
启动输出。如果要尝试
demo(graphics)查看图形输出是否已经在工作,您会注意到它不是。那是因为
Xsecurity扩展名阻止您访问套接字。现在,您可以
xhost+在本地计算机上键入内容,然后
demo(graphics)再次尝试使用您的容器。您现在应该具有图形输出。但是,强烈建议不要使用此方法,因为您允许访问当前连接到的任何远程主机的xsocket。只要您仅与单用户系统进行交互,这在某种程度上是合理的,但是一旦涉及多个用户,这绝对是不安全的!因此,您应该使用一种不太危险的方法。一个好的方法是使用服务器解释
xhost +si:localuser:username
可以用来指定一个本地用户(请参阅参考资料
man xhost)。这意味着
username应该是在
X11本地计算机上运行服务器并运行docker容器的用户的名称。这也是为什么在运行容器时指定用户很重要的原因。最后但并非最不重要的一点是,总是存在使用
xauth和
.Xauthority文件授予对
X11套接字的访问权限的更复杂的解决方案(请参阅参考资料
manxauth)。但是,这还将涉及更多的知识
X。
这可以产生积极的影响,这是为了实现所需的过程而需要运行的过程数量。
(1)
supervisor和
sshd在所述容器中运行:
UID PID PPID C STIME TTY TIME CMDroot 4564 718 1 18:16 ? 00:00:00 /usr/bin/python /usr/bin/supervisordroot 4576 4564 0 18:16 ? 00:00:00 /usr/sbin/sshd
通过
ssh运行登录时
R:
UID PID PPID C STIME TTY TIME CMDroot 4564 718 0 18:16 ? 00:00:00 /usr/bin/python /usr/bin/supervisordroot 4576 4564 0 18:16 ? 00:00:00 /usr/sbin/sshdroot 4674 4576 0 18:17 ? 00:00:00 sshd: docker [priv] chb 4725 4674 0 18:18 ? 00:00:00 sshd: docker@pts/0chb 4728 4725 1 18:18 pts/0 00:00:00 -bash
(2)使用bind mount方法:
UID PID PPID C STIME TTY TIME CMDchb 4356 718 0 18:12 pts/4 00:00:00 /usr/local/lib/R/bin/exec/R --no-save --no-restore



