こんにちは

溶岩の運用ミスで自宅を全焼させてしまった武田です。
前回に引き続きminecraftをやってきたいと思います。

やりたい事

  • minecraftサーバの起動/停止
  • 設定調整
  • バックアップ
  • 自動起動
  • Mod導入(ComputerCraft)+それで遊ぶ
    ※動作テストは前回作ったCentOS7の環境でやってきます。OSによっては操作異なるかもしれません。

Dockerで動かしてるminecraftサーバの起動/停止

コンテナ名 or CONTAINER IDの取得してコンテナの操作を行います。

[vagrant@localhost ~]$ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                                 NAMES
6752579cf325        k2wanko/minecraft   "java -jar minecraft   46 hours ago        Up 35 minutes       25575/tcp, 0.0.0.0:25565->25565/tcp   minecraft

この場合は [ minecraft ]がコンテナ名 [ 6752579cf325 ]がCONTAINER IDとなります。
※停止状態コンテナを探す場合は -a オプションを追加してください。

※前回の初期設定時にコンテナ名 [ minecraft ]を設定しましたdocker run --name minecraft -i -p 25565:25565 -e "EULA=true" k2wanko/minecraft の部分です。ちなみにnameを未指定にした場合は自動で適当な名前を付けてくれるので安心

Dockerコンテナの起動

docker start minecraft 

これで起動。自動的にminecraftサーバも動作します。

Dockerコンテナの停止

docker stop minecraft 

minecraft サーバコンソール

起動中のコンテナに接続してサーバコンソールも呼び出せます。
これで管理者としてアイテムを人に渡したりモードかえたりゲームモード変えてみたりなんだってできますね。

docker attach minecraft

[08:09:52] [Server thread/INFO]: Unknown command. Try /help for a list of commands
/help
[08:09:56] [Server thread/INFO]: --- Showing help page 1 of 7 (/help <page>) ---
[08:09:56] [Server thread/INFO]: /achievement give <stat_name> [player]
[08:09:56] [Server thread/INFO]: /ban <name> [reason ...]
[08:09:56] [Server thread/INFO]: /ban-ip <address|name> [reason ...]
[08:09:56] [Server thread/INFO]: /banlist [ips|players]
[08:09:56] [Server thread/INFO]: /clear <player> [item] [data]
[08:09:56] [Server thread/INFO]: /debug <start|stop>
[08:09:56] [Server thread/INFO]: /defaultgamemode <mode>

※動作確認として/helpコマンドを叩いてます。

minecraftサーバ設定変更(server.properties)

# 以下コマンドでコンテナの中の環境に入ります。
docker exec -it minecraft   bash 

# 設定を変更、サーバ名を[ADJUST Minecraft Server]にしましょう。
# ※vi使えれば簡単だったんですがないようなのでechoコマンドで代用
echo -e "#Minecraft server properties\n\
#Thu Jul 02 08:48:00 UTC 2015\n\
generator-settings=\n\
op-permission-level=4\n\
allow-nether=true\n\
level-name=world\n\
enable-query=false\n\
allow-flight=false\n\
announce-player-achievements=true\n\
server-port=25565\n\
level-type=DEFAULT\n\
enable-rcon=false\n\
force-gamemode=false\n\
level-seed=\n\
server-ip=\n\
max-build-height=256\n\
spawn-npcs=true\n\
white-list=false\n\
spawn-animals=true\n\
hardcore=false\n\
snooper-enabled=true\n\
online-mode=true\n\
resource-pack=\n\
pvp=true\n\
difficulty=1\n\
enable-command-block=false\n\
gamemode=0\n\
player-idle-timeout=0\n\
max-players=20\n\
spawn-monsters=true\n\
generate-structures=true\n\
view-distance=10\n\
motd=ADJUST Minecraft Server" >  server.properties

# コンテナから出る
exit

# コンテナを再起動してconfigを反映
docker restart minecraft 

minecraftサーバのバックアップ(Worldディレクトリ)

万が一に備えてホストサーバの方にもバックアップしておきたいところですね。
一生懸命作った建造物を間違って壊しちゃうかも知れませんからね。

バックアップ

※ホストサーバで実施
docker cp minecraft:/data/world .

これでホストサーバにワールドデータがコピーされます。

リストア

※ホストサーバで実施
# バックアップファイルの展開
cd /home/vagrant/backup/world && tar cf - ./ | docker exec -i 6752579cf325   tar x -C /data/world/

# 再起動して反映
docker restart minecraft

※cd [バックアップ元] && tar cf – ./ | docker exec -i [Container ID] tar x -C [バックアップ先]
これでリストア完了です。

コンテナの自動起動

何らかの理由でホストサーバの再起動が必要な場合などがあるかと思います。
そういった時にコンテナも自動的に立ち上がって欲しいところですね。
※自動起動設定は十分にご注意ください。

sudo vi /etc/systemd/system/docker1.service
[Unit]
Description=docker1
After=docker.service
Requires=docker.service

[Service]
ExecStart=/usr/bin/docker start minecraft

[Install]
WantedBy=multi-user.target

sudo systemctl enable docker1
ln -s '/etc/systemd/system/docker1.service' '/etc/systemd/system/multi-user.target.wants/docker1.service'

# 一覧確認
ls -l /etc/systemd/system/multi-user.target.wants/docker*

これで問題がなければホストサーバを再起動しても自動的にコンテナも起動するかと思います。

mod導入

minecraftといえばmodいれなきゃ始まらないですよね。
幸せな世界を作っていきましょう!

# コンテナの中の環境に入ります。
docker exec -it minecraft  bash 

# modsを導入したのいので[mods]ディレクトリへ
cd mods

# modsをダウンロード
wget http://addons-origin.cursecdn.com/files/2228/723/ComputerCraft1.73.jar
※導入modに合わせてください

# コンテナから出る
exit

# コンテナを再起動してmodを反映
docker restart minecraft 

これでサーバにmodが導入されたかと思います。
※クライアントにもmod入れるの忘れずに!

動作確認

今回はこのmodは[computercraft]を入れてみます。
これはゲームの中でもプログラムが触れるという技術者大喜びのmodです。
言語はluaとなっております。

f0
我が家にPCがきました!

f1
プログラム書いてみましょう。
fizzbuzzがいいかなと

f2
実行!
無事動いてますね。

ロボットを動かす

これだけだとわざわざminecraftでやる意味も無いのでこのmodで動かせるロボット(タートル)で遊んでみましょう!
タートル君

ちょっと荒々しい奴がいいですね。
今回はランダムに移動を繰り返しながらウロウロしながらTNT爆薬を投下しまくるヤツにしましょう。

タートルを設置して、燃料補給して、TNT爆薬をイベントリの1番目に設置
燃料及びTNT設置

computer craftランダム爆撃プログラム

---------- function ----------
function go_up()
    for i = 1, 20 do
        turtle.up()
    end
end

function go_ground()
    while turtle.detectDown() == false do
        turtle.down()
    end
end

function random_turn()
    turn = random_number(1,4)
    if r == 4 then
        return
    end
    for i = 1, turn do
        turtle.turnLeft()
    end
end

function random_number(min, max)
    return math.random(1,max)
end
---------- main ----------
turtle.select(1)
go_up()
while turtle.getItemCount(1) ~= 0 do
    random_turn()
    forward_count = random_number(3,6)
    for n=1,forward_count
    do
        turtle.forward()
    end
    turtle.placeDown()
    redstone.setOutput('bottom',true)
end
go_ground()

※ 実験時は場所に注意しましょう。私は家を破壊しました。同僚が気づく前にリストアしないと。
※ linux上からmod上のプログラムを記述することができます。modのエディタは貧弱すぎる。。。

さてさて、では実行してみます

本当に動きましたね、カワイイやつです。

タートル君を何台か動かした結果こんな感じなりました。
かなり激しい結果ですね。

爆撃前
a事前
爆撃後
3事後

このmod真面目にやればかなり強力なことができるみたいです。
木の伐採や採掘、農場収穫、黒曜石作成なども自動化して怠惰なる世界が構築できます、素晴らしい!
minecraftの世界で楽をしたい方へオススメします!

参考資料