介绍

我用一个 Dockerfile 来保证步骤的完整性同时自动创建 docker 镜像。这个 Dockerfile 创建一个 docker 镜像,一旦执行就产生一个运行 X11 和 SSH 服务的容器。

ssh 是用来转发 X11 并提供 docker 容器和你的本地机器间的加密数据通讯。

Xpra + Xephyr 允许显示容器中运行的应用,比如: Firefox, LibreOffice, xterm 等等。具有恢复会话的能力。所以,你可以在任何地方,甚至在连接断掉的时候打开你的桌面而不丢失应用的状态。

Xpra 还使用一个自定义协议,它是自谐调且相当延迟不敏感的,因此是比标准的 X 更有用的链接。

这个应用可以是无根的,所以客户端机器管理它所显示的应用。

Flubox 和 ROX-Filer 建立一个非常小的方法来管理窗口和文件。

建立一个非常小的方法来管理桌面上的文件和图标。

 

客户端机器必须安装一个 X11 server。

 

安装

构建 docker 镜像

$ docker build -t [username]/docker-desktop git://github.com/rogaha/docker-desktop.git

参数 [-t] 给你命名镜像的能力,它将从 GitHub 仓库中的Dockerfile中创建。在本案中,镜像将被称为 rogaha/docker-desktop。这个镜像有 docker-desktop(Xephyr+Fluxbox+ROX-filer),Firefox 带有 Flash Player 插件, LibreOffice 和 xterm。 你可以使用 xterm 或者 ssh

终端来安装/卸载 其他 GUI 应用并远程使用它们。

 

确认存在的镜像

$ docker images

REPOSITORY                                     TAG                 ID                  CREATED             SIZE
base                                           latest              b750fe79269d        3 months ago        24.65 kB (virtual 180.1 MB)
rogaha/docker-dektop                           latest              5b07bd6027bd        5 days ago          12.29 kB (virtual  1.39 GB)
ubuntu                                         12.10               b750fe79269d        3 months ago        24.65 kB (virtual 180.1 MB)

如我们看到的,镜像 rogaha/docker-desktop 已经创建并准备运行。

 

运行创建的 docker 镜像

-d: 后台模式 -p:对主机暴露所有端口

$ CONTAINER_ID=$(docker run -d -P [username]/docker-desktop)

$CONTAINER_ID 环境变量包含从 rogaha/docker-desktop 镜像构建新运行的容器的ID。-P

自 docker 0.6.6 版本引入。

 

运行时获得产生的密码

$ echo $(docker logs $CONTAINER_ID | sed -n 1p)
User: docker Password: xxxxxxxxxxxx

每次容器构建的时候就会通过 PWGen 产生一个新密码。这个密码包含12个字符至少有一个大写字母和数字。

 

使用

 

获得容器外部

$ docker port $CONTAINER_ID 22
49153 # This is the external port that forwards to the ssh service
      # running inside of the container as port 2

我们将使用这个端口来连接 docker 守护程序运行的机器。

 

连接到容器

 

开始一个新会话

首先,我们需要获得 docker 运行机器的 IP。

$ ifconfig | grep "inet addr:"
inet addr:192.168.56.102 Bcast:192.168.56.255 Mask:255.255.255.0
# This is the LAN's IP for this machine

然后,我们使用我们之前获得的外部端口(49153)连接到这个 IP 以便开始一个容器内的新会话。

 

的 ssh 端口

$ ssh docker@192.168.56.102 -p 49153 ./docker-desktop -s 800x600 -d 10
docker@192.168.56.102's password: xxxxxxxxxxxx

$ ./docker-desktop -h

-----------------------------------------------------------
Usage: docker-desktop [-s screen_size] [-d session_number]
-s : screen resolution (Default = 800x600
-d : session number (Default = 10)
-h : help
-----------------------------------------------------------

 

附加到已开始的会话

$ xpra --ssh="ssh -p 49153" attach ssh:docker@192.168.56.102:10 # user@ip_address:session_number
docker@192.168.56.102's password: xxxxxxxxxxxx

如果你要执行无根应用,你只需要通过 ssh 连接到容器并键入: DISPLAY=: [session_number][program_name] &

例如: DISPLAY=:10 firefox &