目次
-
マイクラBEサーバーをDockerへ移行してみた
-
コンテナ内での監視が難しい問題に直面
-
Zabbix Agentをサイドカーで動かしてみる
-
コンテナログをsyslogにリダイレクトして専用ファイル化
-
ログイン/ログアウト検知をZabbixでトリガー化
-
まとめ
1. マイクラBEサーバーをDockerへ移行してみた
Linux Mint上にMinecraft BEサーバーを構築して運用してきましたが、サーバー更新が面倒という課題がありました。
Minecraft BEは特定バージョンを指定できず、常に最新版が求められます。そのため、手動でサーバーファイルを更新しなければならず、接続エラーが発生することもしばしば。
スクリプトでサーバーファイルを自動更新することも検討しましたが、そこで「Dockerを使えばもっと楽になるのでは?」と気づきました。
Dockerならワールドデータをマウントしておけば、コンテナを再作成するだけで最新サーバーに差し替え可能です。
以下が今回のdocker-compose.ymlです。
services:
mcbe_server:
image: itzg/minecraft-bedrock-server:latest
container_name: mcbe_server
ports:
- "19132:19132/udp"
environment:
- EULA=TRUE
volumes:
- ./minecraft-data:/data
restart: unless-stopped
logging:
driver: "syslog"
options:
tag: "mcbe_server"
syslog-facility: "local7"
さらに、Dockerイメージを常に最新化するため、cronで毎朝4時にdocker pullするスクリプトを実行するようにしました。
crontab -e
# 毎日午前4時にMinecraft BEサーバーを自動更新 0 4 * * *
/home/xxx/xxxx/minecraft/docker/update/update_mc_server.sh >> /home/xxx/xxxx/minecraft/vanila/docker-mcbe/update.log 2>&1`
update_mc_server.sh
#!/bin/bash
MC_SERVER_DIR="/home/xxx/xxxx/minecraft/vanila/docker-mcbe"
echo "---- Update started at $(date) ----"
cd $MC_SERVER_DIR
echo "Pulling the latest image..."
docker-compose pull
echo "Recreating container..."
docker-compose up -d --force-recreate
echo "Update finished at $(date)"
echo "----------------------------------"
これでサーバー更新の自動化が実現!
ワールドデータや自作アドオンも問題なく移行でき、もう手動対応の問い合わせが来ることもなくなりました。
次は監視環境の整備です。
2. コンテナ内での監視が難しい問題に直面
従来はホストOS上のZabbix Agentからserver.logを監視していました。
しかしDocker化後、同じ方法では監視できないことに気づきました。
-
コンテナ内部のログはそのままでは外部に出てこない
-
server.logは更新されず、単純なパス変更では解決しない
Geminiさんに相談してcommand指定を試しましたが、公式イメージの起動スクリプトが複雑でうまくいきませんでした。
そこで別の方法を模索しました。
3. Zabbix Agentをサイドカーで動かしてみる
試しに同じdocker-compose.ymlにZabbix Agentを追加しました。
zabbix-agent-mcbe:
image: zabbix/zabbix-agent2:6.0.28-ubuntu
container_name: zabbix-agent-mcbe
user: "root"
environment:
- ZBX_SERVER_HOST=192.168.11.XX
- ZBX_HOSTNAME=mcbe_server
volumes:
- /var/log:/var/log:ro
- ./zabbix_agentd.d:/etc/zabbix/zabbix_agentd.d:ro
ホストOSのログをマウントして監視できるようにしましたが、結局これは失敗…。
権限の問題やDocker内部のログ仕様のため、うまくログが拾えませんでした。
4. コンテナログをsyslogにリダイレクトして専用ファイル化
最終的に選んだのは syslogへログを流す方法 です。
logging:
driver: "syslog"
options:
tag: "mcbe_server"
syslog-facility: "local7"
さらにrsyslogで専用ファイルを作成します。
/etc/rsyslog.d/mcbe.conf
if $programname == 'mcbe_server' then /var/log/mcbeserver.log & stop
これにより、
「コンテナ → Dockerエンジン → syslog → 専用ログファイル」
という流れが完成しました。
余計なシステムログと混ざらず、Zabbixでも扱いやすくなります。
5. ログイン/ログアウト検知をZabbixでトリガー化
Zabbixのアイテムには以下を設定しました。
log["/var/log/mcbeserver.log", "Player (connected|disconnected)"]
ただしsyslog由来の余分な文字列が含まれているため、前処理で正規表現を使用して抽出します。
- 正規表現:
mcbe_server\[\d+\]: (.*) - 出力:
\1
次にトリガーを作成します。
- ログイン検知
find(/mcbe_server/log[...], "Player connected")=1
- ログアウト検知
find(/mcbe_server/log[...], "Player disconnected")=1
これでDiscordへ通知を飛ばし、誰がログインしているかが一目で分かるようになりました。
6. まとめ
今回の取り組みで得られた成果は以下の通りです。
-
サーバー更新をDocker+cronで自動化
-
ログ監視をsyslog+Zabbixで実現
-
Dockerの概念を実際に触って理解できた
普段クラウド監視をしている中で、DockerがIaaSやPaaSの仕組みに近いことを実感できました。
書籍だけではつかみにくかった「コンテナの概念」も体験を通じて理解が深まりました。
今後はさらに深堀りして、監視や運用のノウハウを記事化していきたいと思います!
ここまで読んでいただき、ありがとうございました 🙌