iT邦幫忙

2

Week24 - 用Minecraft來說明Docker為什麼這麼香 - 實作篇 [Server的終局之戰系列]

本文章同時發佈於:


大家好,繼上次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而已:

  • Server執行的環境
  • Server所需的程式檔與配置
  • Server執行的方式

既然已經起好Minecraft Server了,那本文章就到此結束...喂!才沒有XD

我們接下來好好介紹要怎麼打包Dokcer Image

透過Dockerfile來打包Docker Image

首先可以透過GitClone完整範例

再用Terminal進入week24資料夾

$ cd week24

會看到此資料夾有以下幾個檔案

  • Dockerfile: 用來說明要如何打包Docker Image
  • eula.txt與server.properties: 這些都是Minecraft Server的參數配置檔
  • server.jar: Minecraft Server的主程式,可以至官網下載

讓我們來看看Dockerfile裡頭是怎麼表示Minecraft Server的運作條件:

# Server執行的環境,我們選用JDK 8
FROM 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 Server25565 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的名子裡裡標示自己的帳號,在PushDockerhub:

$ 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之中,我們會很常碰到要「跨語言」的問題。

當語言變換,我們甚至連「讓程式可以動」都變成了一件很難的事,因為我們要去了解這個語言的許多配置與安裝。

比如說小弟我主要是學習JavascriptGolang的,但這時候要架設用Java語言設計的Jenkins CI,以往我就要先安裝Java,並且學習Java架設Server的方式。

但現在我只要下此指令Docker就起好了:

$ docker run jenkins/jenkins

就可以去泡咖啡了吃零食了~


你會發現很多的Open source都會提供Docker,比如go-micor, nginx等。

你可以用很低的成本去轉換不同語言,畢竟「先讓程式可以動,再去了解細節」是更加直觀的。

微服務的新起

由於有了DockerServer的運作條件都打包起來,所以快速啟動Server在電腦上變成了很簡單的事情,

這導致後端從「Server常駐在電腦上」變為「依照不同的流量需求啟動不同數量的Server」

由於有了DockerServer的隔離變得簡單:

這導致後端從「單一個Server眾多邏輯」變為「多個職責單一的Server分享邏輯」


這次實作了Minecraft ServerDocker Image容器化,下回將會介紹如何透過Docker Compose來管理多個Docker以達到此系列一開始「單個電腦,多個Minecraft Server」的需求~


謝謝你的閱讀,也歡迎分享討論指正~

參考與引用資料


尚未有邦友留言

立即登入留言