介绍
我用一个 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 &