프로그래밍/마인크래프트 서버, 플러그인

Docker로 마인크래프트 서버 관리하기 - 고급편

Lou Park 2022. 11. 13. 00:18

⚠️ 들어가며

서버를 여는 방법은 초급편글에 있습니다.

초급편과는 달리, 약간의 컴퓨터 지식이 필요할 수 있습니다.

하지만 끈기와 의지가 있으신 분들이라면 충분히 따라할 수 있으실겁니다.

 

주제가 광범위하기 때문에 Q&A 형식으로 포스팅했습니다.


⛔️ docker: Error response from daemon: Conflict 오류가 떠요

이미 동일한 내용의 docker container가 올라가서 그렇습니다. 아래 명령어로 마크 서버 컨테이너를 삭제하고 다시 시도해보시면 될겁니다.

docker stop mc && docker rm mc

🧾 Server.properties를 바꾸고 싶어요  ex) 최대 플레이어 수 늘리기

최대 플레이어 수를 늘리려면 vim으로 server.properties를 직접 수정해도 되지만, vim 사용이 어려우신 분들도 있겠죠? 서버를 열때 명령어상에서 server.properties 설정을 해줄 수 있습니다. 

 

마인크래프트 서버 띄우는 명령어를 보시면 -e <무슨값>=<무슨값> 같은 패턴이 보이실겁니다. 

이렇게 옵션을 더해주면되는데요, 아래는 최대 플레이어(MAX_PLAYERS)를 256명으로 설정한 예시입니다.

docker run -d -it 
-e EULA=TRUE 
-e MAX_PLAYERS=256 
-v ~/be_minecraft_data:/data 
-p 19132:19132/udp --name mcbe 
itzg/minecraft-bedrock-server

더 많은 옵션들이 있습니다. 필요한 만큼 추가하면됩니다.

  • SERVER_NAME
  • SERVER_PORT
  • SERVER_PORT_V6
  • GAMEMODE
  • DIFFICULTY
  • LEVEL_TYPE
  • ALLOW_CHEATS
  • MAX_PLAYERS
  • ONLINE_MODE
  • WHITE_LIST
  • VIEW_DISTANCE
  • TICK_DISTANCE
  • PLAYER_IDLE_TIMEOUT
  • MAX_THREADS
  • LEVEL_NAME
  • LEVEL_SEED
  • DEFAULT_PLAYER_PERMISSION_LEVEL
  • TEXTUREPACK_REQUIRED
  • SERVER_AUTHORITATIVE_MOVEMENT
  • PLAYER_MOVEMENT_SCORE_THRESHOLD
  • PLAYER_MOVEMENT_DISTANCE_THRESHOLD
  • PLAYER_MOVEMENT_DURATION_THRESHOLD_IN_MS
  • CORRECT_PLAYER_MOVEMENT
  • ALLOW_NETHER
  • ANNOUNCE_PLAYER_ACHIEVEMENTS
  • MAX_WORLD_SIZE
  • ENABLE_COMMAND_BLOCK
  • HARDCORE
  • SNOOPER_ENABLED
  • GENERATE_STRUCTURES
  • FORCE_GAMEMODE
  • MAX_TICK_TIME
  • MAX_BUILD_HEIGHT
  • SPAWN_ANIMALS
  • SPAWN_MONSTERS
  • SPAWN_NPCS
  • SPAWN_PROTECTION
  • PVP
  • ALLOW_FLIGHT 등등등...

참고로, 화이트리스트 여러명 적는방법은 다음과 같습니다.

-e WHITE_LIST_USERS="player1,player2,player3"

📌 특정 버전의 서버를 열고 싶어요 or Spigot / Forge / Fabric 서버를 열고 싶어요

마찬가지로 서버 구동 명령어에 아래처럼 그저 옵션만 달리주면됩니다.

정말 다양한 종류의 서버들을 지원합니다.

# Forge
-e TYPE=FORGE
-e VERSION=1.12.2 
-e FORGE_VERSION=14.23.5.2854

# Spigot
-e TYPE=SPIGOT

# Quilt
-e TYPE=QUILT
-e QUILT_LOADER_VERSION=0.16.0
-e QUILT_INSTALLER_VERSION=0.4.1

# Fabric
-e TYPE=FABRIC
-e FABRIC_LAUNCHER_VERSION=0.10.2
-e FABRIC_LOADER_VERSION=0.13.1

# 그 밖에 지원하는 Type들...
PAPER | MAGMA | MOHIST | CATSERVER | LOLISERVER | CANYON | PURPUR | PUFFERFISH
CRUCIBLE | LIMBO | SPONGEVANILLA 

# Minecraft 다른 버전
-e VERSION=1.12.2

 


📥 SpigotMC/Bukkit/PaperMC 플러그인 자동 다운로드하기 

Resource ID를 통해서 서버 구동시 관련 플러그인이나 리소스를 자동으로 다운로드 할 수 있습니다.

예를들어 내가 spigotmc에서 EssentialsX를 구동시 서버에 설치한다고해보겠습니다.

URL에서 마지막의 숫자부분 (9089)가 Resource ID가 됩니다.

https://www.spigotmc.org/resources/essentialsx.9089/

서버 구동시 명령어 옵션으로 추가해줄 수 있습니다. (34315는 Vault 플러그인입니다.)

"SPIGET"은 오타가 아닙니다!

-e SPIGET_RESOURCES=9089,34315

🔨 JVM option을 주고싶어요

추가적인 JVM 옵션을 주고싶다면 JVM_OPTS를 이용하면됩니다.

-e JVM_OPTS="-someJVMOption someJVMOptionValue"

제가 마크 서버 최적화 하기 포스팅에서도 설명했던 aikar Flag를 적용시킬수도 있습니다.

-e JVM_OPTS="-XX:+IgnoreUnrecognizedVMOptions -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:InitiatingHeapOccupancyPercent=15 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true"

📏 최대, 최소 메모리 설정을 하고싶어요

이젠 옵션이라 말하기도 입아픈걸~

# -Xms2G -Xmx2G
-e MEMORY=2G 

# -Xms2G -Xms4G
-e INIT_MEMORY=2G -e MAX_MEMORY=4G

💸 클라우드 서버를 이용하는데, 비용 때문에 밤중에는 서버를 닫고 싶어요

물론 클라우드 서버 인스턴스를 켜두는 것 만으로도 돈이 들이지만... 조금이라도 비용절감을 하고싶으시다면 crontab에 docker container 중지하고 시작하는걸 등록 해두시면 되겠습니다.

 

아래는 매일 새벽 2시~9시까진 서버를 내렸다가 9시에 여는 예시입니다.

서버시간은 UTC 기준일 수 있으니 Timezone 세팅 코드도 추가해두었습니다.

$ sudo timedatectl set-timezone Asia/Seoul
$ crontab -e

0 2 * * * docker container stop mc
0 9 * * * docker container start mc

⏰ 특정시간마다 월드를 자동으로 백업하고 싶어요

https://github.com/itzg/docker-mc-backup 를 이용해서 백업하시면 됩니다. 여러가지 옵션에 당황스러우시겠지만 필요한 예시만 추려서 보여드리겠습니다.

 

아래 명령어는 /backups 폴더에 tar파일로 매일(1d)마다 백업합니다.

docker run \
-e SRC_DIR=/backups \
-e BACKUP_INTERVAL=1d \
--name=mcbackup itzg/mc-backup

 

 

저런식으로 2시간(2h)마다도 가능하고 2시간 30분(2h 30m)마다도 가능합니다.

캬~ 서버 열기 좋은 세상이다 그죠

# 압축은 이렇게 푸시면됩니다.
tar -xvf <파일명.tar>

🖥️ 제 컴퓨터로 월드 파일을 옮기고 싶어요

scp로 옮기실 수 있는 분들은 이 질문을 하지 않았을거같아서 FTP로 옮기는 방법을 추천드립니다. GCP로 서버를 여신분들이라면 아래 블로그 강의를 따라가시는게 좋을 것 같군요!


🤔 옵션 넣는거 불편해요, 여러 서버를 만들어야하는데 효율적인 방법 없을까요?

고급편 글을 보면 대부분 모든것이 옵션으로 이루어져있습니다. docker run 말고 docker compose를 이용하시면 매번 긴 명령어를 적어서 컨테이너를  run하는 번거로움으로부터 해방됩니다.

# Docker compose plugin 설치
$ sudo apt-get update
$ sudo apt-get install docker-compose-plugin

# 설정파일 생성
$ touch docker-compose.yml

 

docker-compose.yml은 설정파일입니다.

Java Edition 서버 + 백업 기능까지 붙인 설정파일을 예시로 들어드릴테니 변형해서 사용하시면됩니다.

environment쪽에 우리가 앞에서 -e 옵션으로 설정해줬던 모든 것들이 들어갈 수 있습니다.

version: "3.4"

services:
  mc:
    image: itzg/minecraft-server
    ports:
      - 25565:25565
    environment:
      EULA: "TRUE"
    tty: true
    stdin_open: true
    restart: unless-stopped
    volumes:
      - ./minecraft-data:/data
  backups:
    image: itzg/mc-backup
    environment:
      BACKUP_INTERVAL: "2h"
    volumes:
      - mc:/data:ro
      - ./mc-backups:/backups

docker compose up 명령어로 서버, 백업 프로그램을 한번에 구동시킬 수 있습니다.

아주 편리하죠?

docker compose up # 실행(올리기)
docker compose down # 내리기

 


😱 실수로 볼륨 설정을 안했어요...서버가 꺼지면 월드가 초기화될 위기에 처했어요

docker로 마크서버 띄우는 명령어에서 -v 해서 볼륨 설정하는 부분이있는데, 이를 누락하신채로 서버를 운영하실 경우 서버 재시작시 모든 파일이 날아가게 됩니다.  하지만 아직 서버가 구동중이라면 희망이 있는데요, docker 볼륨이 mount된 위치를 알아내어 파일을 복사하는 방법입니다.

 

# 컨테이너 이름을 mc라고 하면...
$ docker inspect -f "{{.Mounts}}" mc

# 이런 결과가 나올겁니다.
[{volume e565906355b0bc4516706b2db5269fc962f97967f7ac01d03d2e8fb9bf34f194 /var/lib/docker/volumes/e565906355b0bc4516706b2db5269fc962f97967f7ac01d03d2e8fb9bf34f194/_data /data local  true }]

반환된 문자열에서 이렇게 파일 경로와 같은 부분이 있는데요, 이 부분이 지금 서버 파일이 저장된 장소입니다. 이 경로를 복사해주세요.

/var/lib/docker/volumes/e565906355b0bc4516706b2db5269fc962f97967f7ac01d03d2e8fb9bf34f194/_data

cp 명령어로 해당 경로에 있는 파일을 복사해준 후, 향후 서버 구동시 ~/my_data 폴더를 볼륨으로 마운트해주면 됩니다.

$ cp -r <복사한 경로> <저장할 경로>
$ cp -r /var/lib/docker/volumes/e565906355b0bc4516706b2db5269fc962f97967f7ac01d03d2e8fb9bf34f194/_data ~/my_data

🤓 아직 부족해요 더 알고싶어요

모든걸 설명하기엔 너무 기네요... 더 알고싶으신 분들은 https://github.com/itzg/docker-minecraft-server/blob/master/README.md 를 참고하시기 바랍니다. 감사합니다!