0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

目次

  1. マイクラBEサーバーをDockerへ移行してみた

  2. コンテナ内での監視が難しい問題に直面

  3. Zabbix Agentをサイドカーで動かしてみる

  4. コンテナログをsyslogにリダイレクトして専用ファイル化

  5. ログイン/ログアウト検知をZabbixでトリガー化

  6. まとめ


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の仕組みに近いことを実感できました。
書籍だけではつかみにくかった「コンテナの概念」も体験を通じて理解が深まりました。

今後はさらに深堀りして、監視や運用のノウハウを記事化していきたいと思います!

ここまで読んでいただき、ありがとうございました 🙌

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?