沙盒游戏爱好者应该对『Minecraft』(我的世界)这款游戏都不陌生,每个玩家都可以在三维空间中自由地创造和破坏不同种类的方块,以创造精妙绝伦的建筑物和艺术,或者收集物品探索地图以完成游戏的主线。没有规则约束,甚至没有输赢之分。
该游戏由瑞典的一名温文尔雅的业余程序员辞职后在卧室创造出来的。自由创造和想象力是这个游戏最大的特点,曾有人用它还原过唯美桃花源、和风宫殿、WOW艾泽拉斯大陆等等的壮观美景,还有人用它教小孩子学编程,更有技术宅拿它打造了一款可运行的8位CPU计算机!
在DockerCon欧洲大会的最后一天,Docker又我们带来了新的惊喜——Dockercraft,Dockercraft运行在Minecraft之内,是一个Docker的可视化和监控工具。不但可以监控Docker容器的状态,CPU和内存使用等。还能实现真正的控制,比如启动和停止容器。简言之,Dockercraft可以帮助你玩的Minecraft的同时管理Docker容器。
开启Dockercraft
1.首先,安装Minecraft
2.然后,pull下Dockercraft的镜像:
docker pull index.alauda.cn/featured/dockercraft
3运行Dockercraft容器
docker run -t -i-d -p25565:25565\-v /var/run/docker.sock:/var/run/docker.sock\--name dockercraft \gaetan/dockercraft
将/var/run/docker.sockmount到容器,是为了向Docker远程API发送请求。这里的默认接口是25565,需要的话可以修改。
4.打开Minecraft,选择Multiplayer模式,添加Server
Server的地址是Docker容器的地址,如果你使用了默认接口,不需要配置接口。
5.连接成功后就可以开始玩啦!
在『你的世界』中至少要有一个容器,也就是你的Dockercraft server容器。
你可以在游戏里通过对这些方形建筑的操作,start,stop和remove容器,Minecraft的聊天窗口也支持一些Docker命令行的操作,按『T』或『/』键可以弹出这个窗口。
注:每个命令行前要加一个『/』。
原理
Minecraft的客户端并没有改变,所有的修改都在Minecraft要连接的server端。
这里用的Minecraft server是http://cuberite.org,一个C++写的兼容于Minecraft的game server,GitHub地址:https://github.com/cuberite/cuberite
这个server支持Lua写的插件和脚本,所以我们在里面添加了一个Docker的(world/Plugins/Docker目录下可以看到)。
不幸的是,没有和这些插件通信的API,只有一个『webadmin』,所以通过『webtabs』的方式实现。
也意味着这个插件可以接收到发送给http://127.0.0.1:8080/webadmin/Docker/Docker的post请求。
Goproxy
触发Docker远程API的事件,会通过一个daemon(Go语言写的,go/src/goproxy)发送给Lua插件:
funcMCServerRequest(dataurl.Values,client*http.Client) {req,_:=http.NewRequest("POST","http://127.0.0.1:8080/webadmin/Docker/Docker", strings.NewReader(data.Encode())) req.Header.Set("Content-Type","application/x-www-form-urlencoded") req.SetBasicAuth("admin","admin") client.Do(req)}
Lua插件也可以执行带参数的goproxy程序,向daemon发送请求:
functionPlayerJoined(Player)-- refresh containersr=os.execute("goproxy containers")end
相信这么有想象力的游戏,未来应该还会支持更多的功能,以下的功能就正在开发中:
添加对Docker Machines的支持
支持更多的Docker命令行
实现点击一个按钮,就能显示日志
展示容器间的关联
Docker networking
Docker volumes
…
游戏圈 · Docker交流群
欢迎对Docker和游戏感兴趣的小伙伴扫码入群,交流讨论。
网友评论