Docker編譯Azerothcore原始碼

行者·无疆發表於2024-07-04

維基百科

Docker 是一個開放原始碼軟體,是一個開放平臺,用於開發應用、交付(shipping)應用、執行應用。 Docker允許使用者將基礎設施(Infrastructure)中的應用單獨分割出來,形成更小的顆粒(容器),從而提高交付軟體的速度。
Docker容器與虛擬機器類似,但二者在原理上不同。容器是將作業系統層虛擬化,虛擬機器則是虛擬化硬體,因此容器更具有便攜性、高效地利用伺服器。 容器更多的用於表示 軟體的一個標準化單元。由於容器的標準化,因此它可以無視基礎設施(Infrastructure)的差異,部署到任何一個地方。另外,Docker也為容器提供更強的業界的隔離相容。

前言

我一直想寫下Liunx下的編譯教程,畢竟Liunx執行起來更高效。但考慮到很多人還是用的Windows系統,所以最終決定用Docker執行Liunx的方式做個編譯教程。本文的目的是教會大家怎麼用Docker,怎麼在Liunx系統上編譯服務端,然後文章最後我也會發布個純淨版的Azerothcore服務端映象,映象檔案有點大,畢竟內含Ubuntu系統、原始碼、編譯檔案、DBC、地圖檔案、服務端等,同時按本文教程可以隨時更新,同步Azerothcore官方進度。

Docker的維基百科解釋如上,你把Docker理解為虛擬機器就好了,而且Docker是和宿主機共用核心,對效能影響幾乎可以忽略不計。另外我們在Docker上編譯Azerothcore原始碼,可以不必擔心繫統環境問題,你把服務端給別人時候也不用擔心別人系統執行不起來,Docker在Windows、Liunx、Macos上都可以執行。你以後釋出服務端就是4條命令的事情,別人下載服務端也就是5條命令的事情,簡單、方便、可移植就是它的特性。

Docker安裝

本教程Liunx也適用,Liunx的話建議使用Ubuntu 20,如果你想在Ubuntu不使用Docker直接編譯,那麼直接跳到“第二步:編譯安裝”的“環境部署”(請先切換至root);

另外說個題外話,昨晚閒得無聊,手機下了Termux裝Ubuntu,成功編譯並執行了服務端,其實現在手機效能都過剩了,我手機Mate40E,8G8H配置,配合本網站內的內網穿透教程,只是自己玩或者和朋友玩的話,比你買個伺服器香多了吧。

言歸正傳,說下Windows環境,接下來開始Docker的安裝:

  1. 確保win10版本為教育版、專業版或企業版,64位;
  2. 進入Docker官網下載選擇Windows版本進行安裝;
  3. 開啟Docker,出現“Docker Engine starting…”,等待一會出現“Strat”和“skip……”兩個按鈕,點“skip……”即可,安裝成功。

服務端搭建

以下命令均在Windows自帶的PowerShell(管理員身份開啟)內執行:

安裝Ubuntu

拉取Ubuntu映象

docker pull ubuntu

執行Ubuntu容器

docker run -itd --name eryuwow -p 8085:8085 -p 3306:3306 -p 3724:3724 ubuntu  #eryuwow是我自定義的容器名稱,你可以改成其他名字;8085、3306、3724是我們需要用到的埠,把它從容器裡對映出來

編譯安裝

進入Ubuntu容器

docker exec -it eryuwow /bin/bash

環境部署

apt update && apt install git && apt install curl && apt install unzip && apt install vim && apt-get install sudo && apt-get install tmux && apt-get install tzdata

在此期間顯示“Do you want to continue? [Y/n]”的,輸入y回車即可,以下若出現類似提示將不再贅述。期間如果讓你輸入國家,請依次輸入6和70,如圖所示:

Github加速

這個很重要,非常重要,否則接下來你下載原始碼和更新時候會訪問不了或者很慢很慢。但如果你下載Github檔案不慢的話,建議不要加速。下面講下host檔案加速Github的方法,開啟這個網址:

https://raw.hellogithub.com/hosts

複製其中內容,接下來輸入:

vim /etc/hosts #按i進入編輯模式,最後另起一行,右鍵即可貼上上面複製的內容,按Esc,輸入“:wq”回車

下載原始碼

cd / && git clone https://github.com/azerothcore/azerothcore-wotlk.git; cd azerothcore-wotlk

如果出現“fatal: unable to access ‘https://github.com/azerothcore/azerothcore-wotlk.git/’: GnuTLS recv error (-110): The TLS connection was non-properly terminated.”,請重新輸入一遍命令。

上面是官方地址(保證最新),如果下載速度過慢不願意等,按Ctrl+C結束下載,換成以下命令(我同步的Gitee地址,不保證最新):

cd / && git clone https://gitee.com/gswxy/azerothcore-wotlk.git; cd azerothcore-wotlk

安裝依賴

cp /azerothcore-wotlk/conf/dist/config.sh /azerothcore-wotlk/conf/config.sh && vim /azerothcore-wotlk/conf/config.sh  #按i進入編輯模式,找到“OSDISTRO="ubuntu”,刪去前面的#,按Esc,輸入“:wq”回車
git config --global http.postBuffer 524288000 && ./acore.sh install-deps

編譯原始碼

./acore.sh compiler all

資料庫安裝

vim /etc/mysql/mysql.conf.d/mysqld.cnf  #按i進入編輯模式,在“bind-address= 127.0.0.1”前面輸入#,按Esc,輸入“:wq”回車
service mysql restart  #重啟mysql
mysql -uroot -p  #回車,彈出Enter password讓你輸入密碼時,繼續回車(第一次登陸時處於無密碼狀態,故跳過直接選擇回車即可進入),登入MySQL
use mysql;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密碼';  #此處為修改MySQL的root密碼,新密碼即你自己設定的密碼,不要忘記!
update user set host = '%' where user ='root';
source /azerothcore-wotlk/data/sql/create/create_mysql.sql  #建立acore使用者
FLUSH PRIVILEGES;
exit;
./acore.sh db-assembler import-all  #匯入資料庫

伺服器設定

下載data和地圖檔案

./acore.sh client-data

設定配置

cp env/dist/etc/authserver.conf.dist env/dist/etc/authserver.conf
cp env/dist/etc/worldserver.conf.dist env/dist/etc/worldserver.conf

啟動伺服器

手動啟動

建議第一次啟動用手動方式,方便排查錯誤,以管理員身份開啟PowerShell:

docker exec -it eryuwow /bin/bash  #進入容器
cd /azerothcore-wotlk  #進入目錄

新建一個命令視窗,視窗名稱命名為auth-session,以執行authserver:

tmux new -s auth-session  #新建一個命令視窗視窗名稱為
./acore.sh run-authserver  #如果出現“mysql: [Warning] Using a password on the command line interface can be insecure.”紅字錯誤請不用管

先按ctrl+b, 放開後再按d,可以退出該命令視窗(程序不會結束),新建一個命令視窗,視窗名稱命名為world-session ,以執行worldserver:

tmux new -s world-session
  #新建一個命令視窗
./acore.sh run-worldserver  #如果出現“Can't set process priority class, error: Permission denied”紅字錯誤請不用管

請注意,上述命令執行後, 只要容器不關閉,authserver和 worldserver如果出現異常中斷,是會自動重啟的。常用的tmux命令有:

tmux attach -t SESSION-NAME  #SESSION-NAME替換為你的視窗名稱,如auth-session,即可檢視authserver執行情況
tmux ls  #檢視所有建立的視窗資訊
先按ctrl+b, 放開後再按&  #終止一個終端視窗(會退出程式,需輸入y確認)
先按ctrl+b, 放開後再按d  #暫時退出當前會話(不會退出程式)

一鍵啟動

cd /azerothcore-wotlk && vim startup.sh

輸入以下內容,按Esc,輸入“:wq”回車:

#!/usr/bin/env bash

# CHANGE THESE WITH THE CORRECT PATHS

authserver="/azerothcore-wotlk/acore.sh run-authserver"
worldserver="/azerothcore-wotlk/acore.sh run-worldserver"

authserver_session="auth-session"
worldserver_session="world-session"

if tmux new-session -d -s $authserver_session; then
    echo "Created authserver session: $authserver_session"
else
    echo "Error when trying to create authserver session: $authserver_session"
fi

if tmux new-session -d -s $worldserver_session; then
    echo "Created worldserver session: $worldserver_session"
else
    echo "Error when trying to create worldserver session: $worldserver_session"
fi

if tmux send-keys -t $authserver_session "$authserver" C-m; then
    echo "Executed \"$authserver\" inside $authserver_session"
    echo "You can attach to $authserver_session and check the result using \"tmux attach -t $authserver_session\""
else
    echo "Error when executing \"$authserver\" inside $authserver_session"
fi

if tmux send-keys -t $worldserver_session "$worldserver" C-m; then
    echo "Executed \"$worldserver\" inside $worldserver_session"
    echo "You can attach to $worldserver_session and check the result using \"tmux attach -t $worldserver_session\""
else
    echo "Error when executing \"$worldserver\" inside $worldserver_session"
fi

以後啟動容器後,開啟cmd或者 PowerShell,輸入以下命令就可以啟動服務端了:

docker exec -it eryuwow /bin/bash  #進入容器
cd /azerothcore-wotlk && ./startup.sh

進階教程

更新伺服器

docker exec -it eryuwow /bin/bash  #進入容器
cd /azerothcore-wotlk && git pull  #更新原始碼
./acore.sh compiler build  #重新編譯
./acore.sh db-assembler import-updates  #更新資料庫

另外只要你在worldserver.conf裡面沒有改過預設值:

Updates.EnableDatabases = 7

你在每次啟動服務端的時候都會自動更新資料庫。

更改data檔案

如果你想用自己的data檔案,或者想替換dbc檔案,可以使用cp命令,下面示例如下:

docker cp C:\Users\71479\Downloads\data.zip eryuwow:/azerothcore-wotlk/env/dist/bin  #該命令為另起個PowerShell視窗後輸入,複製data.zip到docker容器對應目錄內,這裡的“C:\Users\71479\Downloads\data.zip”替換成你本機data.zip的路徑
cd /azerothcore-wotlk/env/dist/bin && unzip -o data.zip && rm data.zip #unzip是解壓命令,-o是直接覆蓋,對data.zip執行解壓並覆蓋,rm是刪除命令,完成後刪除data.zip檔案

新增功能

這個連結是官方Github儲存庫,裡面有眾多的功能模組,如果你英文不好的話,多用下翻譯,以自動平衡功能為例:

下載後,結合“(二)更改data檔案”,將壓縮包複製到/azerothcore-wotlk/modules目錄,然後輸入以下命令重新編譯即可:

cd /azerothcore-wotlk && ./acore.sh compiler build

需要注意的是你要檢查下載下來的壓縮包內是否有sql檔案,如果有的話,需要你將這些檔案匯入到資料庫,比較簡單的方法是連線資料庫後執行該sql檔案。

連線資料庫

這裡建議使用HeidiSQL(因為免費),你也可以用Navicat SQL軟體。地址寫localhost即可,使用者名稱root,密碼是前面你自己設定的即可(我設定的是root)。

解決記憶體佔用過大問題

因為docker用的是WSL2,可能會導致Vmmem程序記憶體佔用過大,你可以給你的容器設定最大記憶體的方式來緩解:

1.按下Windows + R 鍵,輸入 %UserProfile% 並執行進入使用者資料夾;

2.新建檔案,命名為.wslconfig,然後記事本編輯;

3.填入以下內容並儲存, memory為系統記憶體上限,這裡我限制最大4GB,可根據自身電腦配置設定:

[wsl2]
memory=4GB
swap=0
localhostForwarding=true

4.然後啟動cmd命令提示符,輸入wsl --shutdown,重啟下docker即可。

釋出服務端

按以上教程你已經做好了一個純淨可更新的WLK服務端,如果你想分享給別人的話,按以下步驟來做:

開通映象倉庫

國內的話還是選擇阿里雲映象服務吧,別人下載速度也快些,首先你要註冊個阿里雲賬號,然後開啟容器映象服務,選擇個人版(免費),點選映象倉庫——建立映象倉庫,新建個名稱空間和倉庫名稱,倉庫型別選擇公開,摘要自己填寫,提交即可。

容器打包為映象

以管理員身份開啟PowerShell,執行:

docker commit -m="eryuwow" -a="eryuwow" eryuwow eryuwow:1.0  #-m後面是描述資訊,-a後面是建立者,eryuwow是容器名,eryuwow:1.0是映象名:版本號

推送映象

阿里雲容器映象服務/例項列表/映象倉庫/基本資訊,裡面有詳細的操作指南,下面是我的示例:

docker login --username=**** registry.cn-hangzhou.aliyuncs.com  ##其中****換成你阿里雲賬號,回車輸入密碼
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/gswxy/gswxy:[映象版本號]  ##給你本地映象打上tag,[映象版本號]自己定義,比如我寫的是1.0;[ImageId]可以用docker images檢視
docker push registry.cn-hangzhou.aliyuncs.com/gswxy/gswxy:[映象版本號]  ##[映象版本號]填你剛才寫的版本號

別人怎麼用

別人安裝好docker後, 以管理員身份開啟PowerShell:

docker pull registry.cn-hangzhou.aliyuncs.com/gswxy/gswxy:1.0

上述命令可以在你的阿里雲容器映象服務/例項列表/映象倉庫/基本資訊:從Registry中拉取映象中可以看到,

這個映象是我的,跟著教程走下來的純淨的服務端,資料庫使用者名稱是root,密碼是gswxy.com,你可以執行命令拉取下來。

拉取下來後,可以用docker images命令檢視當前的映象,如圖所示:

然後輸入以下命令執行容器:

docker run -itd --name gswxy -p 8085:8085 -p 3306:3306 -p 3724:3724 0fa8a792a779  #其中gswxy你可以自定義名字;0fa8a792a779是上面圖例的IMAGE ID

然後輸入以下命令進入容器和執行服務端:

docker exec -it gswxy /bin/bash  #進入容器
cd /azerothcore-wotlk && service mysql start && ./startup.sh 

最後,如果有幫助到你,打個賞吧。

相關文章