天道酬勤,学无止境

当我在 docker 容器中启动 X 服务器时主机屏幕关闭(Host screen turns off when I start X server in docker container)

问题

我创建了带有 X 服务器的 docker 容器。 我将它用于一些屏幕外的 OpenGL 渲染。 这个容器应该在任何系统上工作(有或没有 X 服务器运行),并且它应该使用硬件 GPU(如果它存在)(所以我不能使用 xvfb)。

当我在没有 GUI 的类似服务器的系统上使用这个容器时,一切正常。 但是当我在 Ubuntu 14.04 桌面上运行容器时,每次在容器中启动 X 服务器时屏幕都会关闭。

我使用 --priviliged 启动容器,因此 /dev 文件夹与容器共享。 我相信它涉及某种冲突。

有没有办法在容器内启动 X,例如主机 X 服务器仍在工作?

更新:

我在 Xorg.0.log 中看到以下内容:

AIGLX: Suspending AIGLX clients for VT switch
(II) NOUVEAU(0): NVLeaveVT is called.

更新:

我可以使用 xvfb 代替真正的 Xorg 服务器吗? 它是否支持实际的硬件 GPU 渲染?

回答1

我认为这行不通——你实际上是在尝试使用两个 X 服务器——主机和容器——我怀疑他们都希望独占使用显卡。

您可以做的是通过绑定安装 X 服务器套接字来从容器使用主机上的 X 服务器。 这个 SO 答案解释了如何:https://stackoverflow.com/a/25334301/4332

我不确定这对您的特定情况会有帮助,但我完全不明白为什么您需要在容器中运行 XServer。 我认为您仍然可以使用 --privileged 访问 GPU。

回答2

如果您不介意将 CPU 用于 OpenGL,您可以使用带有 GLX 扩展的 Xdummy 视频驱动程序在容器内设置一个 X 服务器。 但是当然您将看不到任何东西,因为视频驱动程序是虚拟的。

如果您确实想使用 GUI,请尝试使用 TurboVNC + VirtualGL 并将 Xdummy 服务器用作 3D X 服务器。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 通过ADB连接到Docker容器中的USB Android设备(Connecting to a USB Android device in a Docker container via ADB)
    问题 我创建了一个包含Android SDK的Docker映像,并试图在运行该映像的容器中公开我的Android手机。 因此,我使用--privileged标志并按如下方式安装USB设备: $ docker run --privileged -v /dev/bus/usb:/dev/bus/usb -d -P my-android:0.0.1 但是,当我运行ADB设备时,它不会显示USB设备: ubuntu@d56b666be455:~/Android/Sdk/platform-tools$ ./adb devices * daemon not running. starting it now on port 5037 * * daemon started successfully * List of devices attached ubuntu@d56b666be455:~/Android/Sdk/platform-tools$ 容器内的lsusb列出了该设备: ubuntu@d56b666be455:~$ lsusb ... Bus 002 Device 017: ID 04e8:6866 Samsung Electronics Co., Ltd GT-I9300 Phone [Galaxy S III] (debugging mode) 但是,该设备在主机上可见: ⇒
  • 在 Docker Ubuntu 容器中启动 Xserver(Starting Xserver in Docker Ubuntu container)
    问题 我的容器中安装了最少的 Ubuntu,我想让 Xserver 运行。 我需要 XServer,因为我的应用程序需要 meshlabserver,它本身需要 Xserver。 我安装了 xserver-xorg 和所有其他软件包,但是当我尝试通过以下方式在容器中启动 X 时 /usr/bin/X :0 它说: Fatal server error: (EE) xf86OpenConsole: Cannot open /dev/tty0 (No such file or directory) 我究竟做错了什么? 如何启动 X 服务器? 更新: 相关问题:当​​我在 docker 容器中启动 X 服务器时主机屏幕关闭 回答1 就我而言,当我以特权模式启动容器时,它运行良好: docker run --privileged 因此 XServer 可以从主机(包括/dev/tty0 )访问某些设备。 在一般情况下,以特权模式运行容器是一个坏主意,但在我的情况下它没问题。 为避免使用--privileged您还可以尝试--privileged docker run命令的--device选项。
  • 如何从主机外部(同一网络)连接到Docker容器[Windows](How to connect to a docker container from outside the host (same network) [Windows])
    问题 我创建了我的第一个Docker容器,它使用Go运行服务器,但是无法从主机外部访问它。 我刚刚开始使用docker,所以在这里有点迷路了。 因此,我有一个非常简单的Go代码来启动服务器,我构建了Docker映像,该映像安装了Go并在Linux基本映像中构建了代码。 我在端口8080上运行服务器,因此我将该端口暴露给运行容器的主机,如下所示: docker run -p 8080:8080 dockertest 那行得通,我可以通过Docker的机器IP (启动时出现在Docker Quickstart Terminal上的机器IP)访问服务器,问题是我无法从主机外部访问我托管的网站,所以如果我尝试在手机上打开相同的IP地址,只会给我一个错误:该网页不可用(ERR_CONNECTION_TIMED_OUT)。 我也尝试过这样指定IP: docker run -p 192.168.0.157:8080:8080 dockertest 但是当我这样做时,我既不能通过docker机器的IP也不能通过上面的命令行中的指定IP来访问该网站。 我也不确定我应该使用我的计算机的IP在该命令中写入哪个IP,我也尝试了127.0.0.1(localhost),但这给了我相同的结果:无法通过任何方式访问该网站IP。 我已经搜索了这个问题,发现了很多StackOverflow问题
  • Docker容器会自动与主机同步时间吗?(Will docker container auto sync time with the host machine?)
    问题 鉴于我已经正确更改了Docker容器的时区。 我是否需要在docker容器内安装NTP服务器以定期同步时间,否则容器将从其主机同步时间? 回答1 如果您在运行boot2docker的OSX上,请参见以下问题:https://github.com/boot2docker/boot2docker/issues/290 时间同步成为一个问题,因为boot2docker主机在OS睡眠时会发生时间漂移。 通过-v /etc/localtime:/etc/localtime:ro运行容器无法解决与Docker容器的时间同步问题 相反,现在,您必须定期在OSX上运行此命令: /usr/local/bin/boot2docker ssh sudo ntpclient -s -h pool.ntp.org Kitematic用户的更新 如果您正在运行Kitematic(现在是在OSX中启动并在Docker上运行的建议机制),则必须定期运行以下命令: docker-machine ssh default 'sudo ntpclient -s -h pool.ntp.org' 或者,对于较旧版本的Docker docker-machine ssh dev 'sudo ntpclient -s -h pool.ntp.org' 适用于OSX的新本机Docker用户的更新 新的Docker
  • 泊坞窗容器中是否可以更改日期?(Is it possible change date in docker container?)
    问题 我在tomcat中有一个带有正在运行的程序的容器。 我只需要在此容器中更改日期并测试我的程序行为。 我有时间敏感的逻辑,有时需要查看几天或几个月后会发生什么。 码头工人有可能吗? 我读到如果更改容器中的日期,则日期将在主机系统上更改。 但这对我来说不是一个好主意。 我需要在一台服务器上有此应用程序的几个实例,并有可能为每个实例设置不同的时间。 但是,当我尝试更改容器内的日期时,出现错误: sudo date 04101812 date: cannot set date: Operation not permitted Fri Apr 10 18:12:00 UTC 2015 回答1 在不影响主机操作系统的情况下,很有可能动态地更改Docker容器中的时间。 解决的办法是伪造它。 该库拦截所有用于检索当前时间和日期的系统调用程序。 实施很容易。 适当地向Dockerfile添加功能: WORKDIR / RUN git clone https://github.com/wolfcw/libfaketime.git WORKDIR /libfaketime/src RUN make install 请记住在运行要应用伪造时间的应用程序之前,先设置环境变量LD_PRELOAD 。 例子: CMD ["/bin/sh", "-c", "LD_PRELOAD=/usr/local
  • 不同环境下Jenkins调用shell脚本管理docker容器脚本两则
    防伪码:桃李春风一杯酒,江湖夜雨十年灯。一、生产环境Jenkins使用ssh-copy-id实现SSH无密码登录,实现方式如下:ssh-keygen 产生公钥与私钥对.ssh-copy-id 将本机的公钥复制到远程机器的authorized_keys文件中,ssh-copy-id也能让你有到远程机器的home, ~./ssh , 和 ~/.ssh/authorized_keys的权利第一步:在本地机器上使用ssh-keygen产生公钥私钥对$ ssh-keygen第二步:用ssh-copy-id将公钥复制到远程机器中$ ssh-copy-id -i .ssh/id_rsa.pub 用户名字@192.168.x.xxx注意: ssh-copy-id 将key写到远程机器的 ~/ .ssh/authorized_key.文件中第三步: 登录到远程机器不用输入密码$ ssh 用户名字@192.168.x.xxx Last login: Sun Nov 16 17:22:33 2008 from 192.168.1.2常见问题:ssh-copy-id -u eucalyptus -i ~eucalyptus/.ssh/id_rsa.pub ssh 用户名字@192.168.x.xxx第一次需要密码登录上述是给eucalyptus用户赋予无密码登陆的权利/usr/bin/ssh-copy
  • VBoxManage:错误:无法创建仅主机的适配器(VBoxManage: error: Failed to create the host-only adapter)
    问题 我在fedora 17机器上运行流浪汉1.4和虚拟框4.3。 当我“无所事事”时,出现以下错误: Bringing machine 'default' up with 'virtualbox' provider... [default] Clearing any previously set forwarded ports... [default] Clearing any previously set network interfaces... There was an error while executing `VBoxManage`, a CLI used by Vagrant for controlling VirtualBox. The command and stderr is shown below. Command: ["hostonlyif", "create"] Stderr: 0%... Progress state: NS_ERROR_FAILURE VBoxManage: error: Failed to create the host-only adapter VBoxManage: error: VBoxNetAdpCtl: Error while adding new interface: VBoxNetAdpCtl: ioctl
  • 在Mac / OS X上/ var / lib / docker在哪里(Where is /var/lib/docker on Mac/OS X)
    问题 在为Mac安装docker之后,我正在Mac上寻找文件夹/var/lib/docker 。 随着docker info我得到 Containers: 5 ... Server Version: 1.12.0-rc4 Storage Driver: aufs Root Dir: /var/lib/docker/aufs Backing Filesystem: extfs Dirs: 339 Dirperm1 Supported: true ... Name: moby ID: LUOU:5UHI:JFNI:OQFT:BLKR:YJIC:HHE5:W4LP:YHVP:TT3V:4CB2:6TUS Docker Root Dir: /var/lib/docker Debug Mode (client): false .... 但是我的主机上没有目录/var/lib/docker 。 我已经检查了/Users/myuser/Library/Containers/com.docker.docker/但在那里找不到任何东西。 知道它在哪里吗? 回答1 看到这个答案 当使用Docker for Mac应用程序时,容器似乎存储在位于以下位置的VM中: 〜/ Library / Containers / com.docker.docker / Data / com.docker.driver
  • Can you run GUI applications in a Docker container?(Can you run GUI applications in a Docker container?)
    问题 How can you run GUI applications in a Docker container? Are there any images that set up vncserver or something so that you can - for example - add an extra speedbump sandbox around say Firefox? 回答1 You can simply install a vncserver along with Firefox :) I pushed an image, vnc/firefox, here: docker pull creack/firefox-vnc The image has been made with this Dockerfile: # Firefox over VNC # # VERSION 0.1 # DOCKER-VERSION 0.2 FROM ubuntu:12.04 # Make sure the package repository is up to date RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list RUN apt
  • 我的Docker容器没有互联网(My docker container has no internet)
    问题 我的工作正常,但现在停止了。 我尝试了以下命令,但无济于事: docker run -dns 8.8.8.8 base ping google.com docker run base ping google.com sysctl -w net.ipv4.ip_forward=1在主机和容器上 我所得到的只是unknown host google.com 。 Docker 0.7.0版 有任何想法吗? PS ufw禁用 回答1 首先要检查的是在docker容器中运行cat /etc/resolv.conf 。 如果其具有无效的DNS服务器(例如nameserver 127.0.xx ,则该容器将无法将域名解析为IP地址,因此ping google.com将失败。 要检查的第二件事是在主机上运行cat /etc/resolv.conf 。 基本上,每次启动容器时,Docker都会将主机的/etc/resolv.conf复制到容器中。 因此,如果主机的/etc/resolv.conf错误,则Docker容器也会错误。 如果发现主机的/etc/resolv.conf错误,则有两个选项: 在daemon.json中对DNS服务器进行硬编码。 这很容易,但是如果您希望更改DNS服务器,则不理想。 修复主机的/etc/resolv.conf 。 这有点棘手,但是它是动态生成的
  • Docker Networking-nginx:在上游找不到[emerg]主机(Docker Networking - nginx: [emerg] host not found in upstream)
    问题 我最近开始迁移到Docker 1.9和Docker-Compose 1.5的网络功能,以使用链接进行替换。 到目前为止,链接没有任何问题,nginx可以通过docker-compose连接到我的php5-fpm fastcgi服务器,该服务器位于一组中的另一台服务器中。 新近地,尽管当我运行docker-compose --x-networking up我的php-fpm时,mongo和nginx容器启动了,但是nginx随[emerg] 1#1: host not found in upstream "waapi_php_1" in /etc/nginx/conf.d/default.conf:16退出[emerg] 1#1: host not found in upstream "waapi_php_1" in /etc/nginx/conf.d/default.conf:16 但是,如果我在运行php和mongo容器(退出nginx)时再次运行docker-compose命令,则nginx将启动并自此正常运行。 这是我docker-compose.yml文件: nginx: image: nginx ports: - "42080:80" volumes: - ./config/docker/nginx/default.conf:/etc/nginx/conf.d
  • 在 Docker 容器中使用 VNCserver + GUI 应用程序 + 虚拟显示(Using VNCserver + GUI application + Virtual Display in Docker container)
    问题 我想在 docker 容器中运行 Firefox(或任何图形应用程序)。 我的要求:当我启动容器时,我应该创建一个虚拟显示,启动 VNC 服务器,然后启动 GUI 应用程序。 这意味着在容器成功启动后,我可以通过 VNC 客户端连接到容器内运行的 GUI 应用程序。 当我关闭应用程序时,容器应该自动停止。 尝试 1:我从这里的示例开始 https://hub.docker.com/r/devopsil/vnc-firefox/~/dockerfile/ 在此示例中,开发人员通过 CMD 启动 vnc 服务器并使其永远运行。 他将 Firefox 作为 .rc 文件的一部分,以便在容器启动时启动。 如果您通过 VNC 客户端连接,您可以看到 firefox,并且按预期关闭 Firefox 或断开 VNC 会话不会停止容器。 尝试 2:我按如下方式调整了 Dockerfile。 只更改了最后一行(用 ENTRYPOINT 替换了 CMD 并删除了“永远”标志) ENTRYPOINT ["/usr/bin/x11vnc", "-usepw", "-create"] 重建和运行容器“docker run --rm -p 5900”现在有不同的行为:容器启动,通过VNC客户端的连接工作,几秒钟后打开firefox(等待消息“显示中缺少扩展RANDR:20” ) 并且容器在关闭 vnc
  • 服务器是否在主机“ localhost”(:: 1)上运行并在端口5432上接受TCP / IP连接?(Is the server running on host “localhost” (::1) and accepting TCP/IP connections on port 5432?)
    问题 在开始之前,请注意,我在网络上的Stack Overflow和文章中发现了几个类似的问题,但是这些都没有帮助我解决问题: PG错误无法连接到服务器:连接被拒绝服务器是否在端口5432上运行? PG :: ConnectionBad-无法连接到服务器:连接被拒绝 psql:无法连接到服务器:连接被拒绝 现在,这是问题所在: 我有一个像魅力一样工作的Rails应用程序。 与我的合作伙伴一起,我们使用GitHub进行协作。 我们有一个master和一个mvp分支机构。 我最近用Homebrew(Mac)更新了我的git版本。 我们使用Foreman在本地启动我们的应用程序。 现在,当我尝试在本地启动应用程序时,出现以下错误: PG::ConnectionBad at / could not connect to server: Connection refused Is the server running on host "localhost" (::1) and accepting TCP/IP connections on port 5432? could not connect to server: Connection refused Is the server running on host "localhost" (127.0.0.1) and accepting
  • 从主机连接到Docker容器中的mysql(Connect to mysql in a docker container from the host)
    问题 (由于我对Docker或mysql管理的了解有限,这可能是一个愚蠢的问题,但是由于我整夜都在这个问题上度过,所以我敢问这个问题。) 简而言之 我想在docker容器中运行mysql并从主机连接到它。 到目前为止,我取得的最好成绩是: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) 更多细节 我正在使用以下Dockerfile : FROM ubuntu:14.04.3 RUN apt-get update && apt-get install -y mysql-server # Ensure we won't bind to localhost only RUN grep -v bind-address /etc/mysql/my.cnf > temp.txt \ && mv temp.txt /etc/mysql/my.cnf # It doesn't seem needed since I'll use -p, but it can't hurt EXPOSE 3306 CMD /etc/init.d/mysql start && tail -F /var/log/mysql.log 在该文件所在的目录中
  • 如何将node.js应用程序作为后台服务运行?(How do I run a node.js app as a background service?)
    问题 多年来,由于这篇文章受到了广泛的关注,因此我在文章的底部列出了每个平台的最佳解决方案。 原始帖子: 我希望我的node.js服务器在后台运行,即:当我关闭终端时,我希望我的服务器继续运行。 我已经用谷歌搜索并提出了本教程,但是它没有按预期工作。 因此,我没有使用该守护程序脚本,而是以为我只使用了输出重定向( 2>&1 >> file部分),但是这也不会退出-我在终端中出现空白行,就像它在等待输出/错误一样。 。 我也尝试过将进程置于后台,但是一旦关闭终端,进程也会被终止。 那么,当我关闭本地计算机时,如何使其保持运行状态? 最佳解决方案: Systemd(Linux) 推出(Mac) 节点窗口(Windows) PM2(Node.js) 回答1 从如何将Node.js应用程序作为自己的进程运行来复制我自己的答案? 2015年的答案:几乎每个Linux发行版都随附systemd,这意味着永远不再需要monit,PM2等-您的OS已经可以处理这些任务。 制作一个myapp.service文件(用您的应用名称替换'myapp'): [Unit] Description=My app [Service] ExecStart=/var/www/myapp/app.js Restart=always User=nobody # Note Debian/Ubuntu uses
  • 运行 tomcat 的 Docker 容器 - 无法使用主机 IP 地址访问服务器(Docker container running tomcat - could not access the server using the host IP address)
    问题 我正在尝试从 docker 文件构建一个运行 tomcat 的 docker 容器。 请在下面的 Dockerfile 内容中找到: FROM ubuntu:trusty MAINTAINER karthik.jayaraman VOLUME ["/tomcat/files"] ADD /files/tar/apache-tomcat-7.0.47.tar.gz /usr/local/tomcat ADD /files/scripts/. /tmp/tomcat_temp RUN ls /tmp/tomcat_temp RUN cp -a /tmp/tomcat_temp/. /etc/init.d RUN chmod 755 /etc/init.d/tomcat RUN chkconfig --add tomcat && chkconfig --level 234 tomcat on ADD /files/config /usr/local/tomcat/apache-tomcat-7.0.47/conf/ ADD /files/lib /usr/local/tomcat/apache-tomcat-7.0.47/lib/ ENV CATALINA_HOME /usr/local/tomcat/apache-tomcat-7.0.47 ENV PATH $PATH
  • 如何从Docker容器将数据写入主机文件系统(How to write data to host file system from Docker container)
    问题 我有一个Docker容器,它正在运行一些代码并创建一些HTML报告。 我希望将这些报告发布到主机上的特定目录中,即/usr/share/nginx/reports 我这样做的方法是将该主机目录作为数据卷挂载,即docker run -v /usr/share/nginx/reports --name my-container com.containers/my-container 但是,当我SSH进入主机并检查目录/usr/share/nginx/reports ,那里没有任何报告数据。 难道我做错了什么? 主机是Ubuntu服务器,Docker容器也是Ubuntu,这里没有boot2docker怪异现象。 回答1 在“管理容器中的数据”中,将主机文件夹安装到容器将是: docker run -v /Users/<path>:/<container path> (请参阅“使用音量”) 仅使用-v /usr/share/nginx/reports会将内部容器路径/usr/share/nginx/reports为卷,但与主机文件夹无关。 这是可用的安装类型之一: 回答2 这个问题的答案是有问题的,因为它取决于您的操作系统和您的全部要求。 VonC的答案提出了一些应该解决的假设,因此仅在某些情况下才是正确的。 关于该主题的其他答案通常会忽略以下事实:有人在运行linux
  • 如何从Docker容器访问主机端口(How to access host port from docker container)
    问题 我有一个运行jenkins的docker容器。 作为构建过程的一部分,我需要访问在主机上本地运行的Web服务器。 是否可以将主机Web服务器(可以配置为在端口上运行)暴露给jenkins容器? 编辑:我正在Linux机器上本地运行docker。 更新: 除了下面的@larsks答案之外,要从主机获取主机IP的IP地址,我还需要执行以下操作: ip addr show docker0 | grep -Po 'inet \K[\d.]+' 回答1 在Linux上本地运行Docker时,您可以使用docker0接口的IP地址访问主机服务。 从容器内部,这将是您的默认路由。 例如,在我的系统上: $ ip addr show docker0 7: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::f4d2:49ff:fedd
  • nginx docker容器:502错误的网关响应(nginx docker container: 502 bad gateway response)
    问题 我有一个监听8080端口的服务。 这不是一个容器。 然后,我使用正式图片创建了一个nginx容器: docker run --name nginx -d -v /root/nginx/conf:/etc/nginx/conf.d -p 443:443 -p 80:80 nginx 毕竟: # netstat -tupln | grep 443 tcp6 0 0 :::443 :::* LISTEN 3482/docker-proxy # netstat -tupln | grep 80 tcp6 0 0 :::80 :::* LISTEN 3489/docker-proxy tcp6 0 0 :::8080 :::* LISTEN 1009/java Nginx的配置是: upstream eighty { server 127.0.0.1:8080; } server { listen 80; server_name eighty.domain.com; location / { proxy_pass http://eighty; } } 我已经检查过我是否可以使用# curl http://127.0.0.1:8080与该服务器连接 <html><head><meta http-equiv='refresh' content='1;url=/login?from=%2F'
  • Docker 命令失败(在 Windows 中)(Docker commands fails (in Windows))
    问题 我正在尝试在 Windows 机器上使用 Docker,但似乎遇到了所有可能的问题。 我最新的一个是这样的:我的机器正在运行,但我似乎无法使用 docker 命令与它交互。 如果我运行一个非常标准的命令,如: docker ps 我收到这样的错误消息: An error occurred trying to connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v 1.23/containers/json: open //./pipe/docker_engine: The system cannot find the file specified. 所以显然有些路径都搞砸了。 有谁知道这是哪条路以及如何解决这个问题? 回答1 运行docker ps并接收时: 尝试连接时发生错误:Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/containers/json: open //./pipe/docker_engine: 系统找不到指定的文件。 需要设置以下环境属性: set DOCKER_CERT_PATH=%USERPROFILE%\.docker\machine\machines\default set DOCKER_HOST=tcp://192.168.99.100:2376