本文章同时发布于:
MediumiT邦帮忙大家好,继上次Week23 - 用Minecraft来说明Docker为什么这么香 - 概念篇的文章后,接下来要来实作用Docker
启动Minecraft Server
。
关于安装Docker
安装的部分在Docker
的官网都写得很清楚了,由于本篇主要讨论实作而不是安装,我这边就把三种系统的安装介绍都贴上来,不说明此部分了~
在Docker
内启动Minecraft Server
首先,我们运行:
docker run -p 25565:25565 superj80820/minecraft-server
然后...就没有然后了,因为Minecraft Server
起好了!
你可能会说:等等!我都不用设置些什么吗?比如说Minecraft Server
的参数,我连的Server
的主程式jar
都没下载耶!?
是的,这就是Docker
的好处,如上篇所述,Docker
可以把需要隔离的的档案放入里头,就像放到资料夹里,而这资料夹实际上就是一个Docker Image
。
Docker
又提供了Dockerhub供大家放置Docker Image
,我们可以直接下载执行。
所以猜到了吗?我只是把Minecraft Server
这些必备条件打包成Docker Image
并上传至Dockerhub
而已:
既然已经起好Minecraft Server
了,那本文章就到此结束...喂!才没有XD
我们接下来好好介绍要怎么打包Dokcer Image
透过Dockerfile
来打包Docker Image
首先可以透过Git
来Clone
完整範例
再用Terminal
进入week24
资料夹
$ cd week24
会看到此资料夹有以下几个档案
Docker Image
eula.txt与server.properties: 这些都是Minecraft Server
的参数配置档server.jar: Minecraft Server
的主程式,可以至官网下载让我们来看看Dockerfile
里头是怎么表示Minecraft Server
的运作条件:
# Server执行的环境,我们选用JDK 8FROM openjdk:8# Server所需的程式档与配置,此指令是把week24资料夹所有的档案都複製到Docker Image里的/usr/src/myapp资料夹COPY . /usr/src/myapp# 说明Minecraft Server在Docker里运行时的目录WORKDIR /usr/src/myapp# Server执行的方式,我这边就是把官网的执行指令複製下来而已CMD ["java", "-Xmx1024M", "-Xms1024M", "-jar", "server.jar", "nogui"]
了解Dockerfile
后,我们来打包Docker Image
,
.
的意思就是指「透过此目录底下的Dockerfile
」来打包-t
的意思就是指此Image
的名字要取什么$ docker build . -t=minecraft-server
最后运行打包好的Docker Image
,我们需要用-p
这个参数把Docker
内部的Minecraft Server
的25565 port
与本机电脑的25565 port
做连接,这样我们才能在Minecraft
里透过localhost:25565
连入Docker
内部的Minecraft Server
$ docker run -p 25565:25565 minecraft-server
这样就可以啦~赶快连入Minecraft Server
开玩吧!
如果想要把Docker Image
放到Dockerhub上,你必须先在Dockerhub上注册帐号,并在Terminal
登入:
$ docker login
输入完帐号密码登入完毕后,我们要特别在Docker Image
的名子里里标示自己的帐号,在Push
上Dockerhub:
$ docker build . -t={帐号}/minecraft-server$ docker push {帐号}/minecraft-server
以我的帐号来说就要这样下指令:
$ docker build . -t=superj80820/minecraft-server$ docker push superj80820/minecraft-server
有了Docker
以后的有趣世界
在实作了Docker
版的Minecraft Server
之后,我来整理一下刚刚我们在Docker
上获得的好处。
Make it work, make it right, make it fast!
白话来讲就是:
先让程式可以动,如果有需求在客製化逻辑,如果有需求再优化程式运行速度
就是先求有再求好啦XD,在现在很多很多的Open source
之中,我们会很常碰到要「跨语言」的问题。
当语言变换,我们甚至连「让程式可以动」都变成了一件很难的事,因为我们要去了解这个语言的许多配置与安装。
比如说小弟我主要是学习Javascript
与Golang
的,但这时候要架设用Java
语言设计的Jenkins CI
,以往我就要先安装Java
,并且学习Java
架设Server
的方式。
但现在我只要下此指令Docker
就起好了:
$ docker run jenkins/jenkins
就可以去泡咖啡了吃零食了~
你会发现很多的Open source
都会提供Docker
,比如go-micor, nginx等。
你可以用很低的成本去转换不同语言,毕竟「先让程式可以动,再去了解细节」是更加直观的。
微服务的新起
由于有了Docker
将Server
的运作条件都打包起来,所以快速启动Server
在电脑上变成了很简单的事情,
这导致后端从「Server常驻在电脑上」变为「依照不同的流量需求启动不同数量的Server」
由于有了Docker
将Server
的隔离变得简单:
这导致后端从「单一个Server众多逻辑」变为「多个职责单一的Server分享逻辑」
这次实作了Minecraft Server
的Docker Image
容器化,下回将会介绍如何透过Docker Compose
来管理多个Docker
以达到此系列一开始「单个电脑,多个Minecraft Server
」的需求~
谢谢你的阅读,也欢迎分享讨论指正~