耳语海岸
艾泽拉斯避难谷地

Docker 编译 Azerothcore 源码

维基百科

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是我们需要用到的端口,把它从容器里映射出来。

(二)编译安装

(1)进入 Ubuntu 容器

docker exec -it eryuwow /bin/bash

(2)环境部署

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 gdb

在此期间显示 “Do you want to continue? [Y/n]” 的,输入 y 回车即可,以下若出现类似提示将不再赘述。期间如果让你输入国家,请依次输入 6 和 70,如图所示:

(3)Github 加速

这个很重要,非常重要,否则接下来你下载源码和更新时候会访问不了或者很慢很慢。但如果你下载 Github 文件不慢的话,建议不要加速。下面讲下 host 文件加速 Github 的方法,打开这个网址:https://raw.hellogithub.com/hosts,复制其中内容,接下来输入:

vim /etc/hosts

按i进入编辑模式,最后另起一行,右键即可粘贴上面复制的内容,按Esc,输入“:wq”回车

(4)下载源码

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

(5)安装依赖

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

(6)编译源码

./acore.sh compiler all

(7)数据库安装

vim /etc/mysql/mysql.conf.d/mysqld.cnf

按i进入编辑模式,在“bind-address= 127.0.0.1”前面输入#,按Esc,输入“:wq”回车

service mysql restart
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
FLUSH PRIVILEGES;
exit;
./acore.sh db-assembler import-all

(三)服务器设置

(1)下载 data 和地图文件

./acore.sh client-data

(2)设置配置

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

(3)启动服务器

1)手动启动

建议第一次启动用手动方式,方便排查错误,以管理员身份打开 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

请注意,上述命令运行后, 只要容器不关闭,authserver 和 worldserver 如果出现异常中断,是会自动重启的。常用的 tmux 命令有:

tmux attach -t SESSION-NAME #SESSION-NAME替换为你的窗口名称,如auth-session,即可查看authserver运行情况
tmux ls #查看所有创建的窗口信息
先按ctrl+b, 放开后再按& #终止一个终端窗口(会退出程序,需输入y确认)
先按ctrl+b, 放开后再按d #暂时退出当前会话(不会退出程序)
2)一键启动
cd /azerothcore-wotlk && vim startup.sh

输入以下内容,然后按 Esc,输入 “:wq” 回车:

#!/usr/bin/env bash

# CHANGE THESE WITH THE CORRECT PATH

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
  1. 然后启动 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

最后,如果有帮助到你,打个赏吧,有什么问题 QQ 群(938973736)交流。

赞(1) 打赏
未经允许不得转载:GSWXY » Docker 编译 Azerothcore 源码

评论 抢沙发

评论前必须登录!

立即登录   注册

耳语海岸

WLK版本,定位于RP服务器,趣味养老,请注意:本服仅为技术交流和学习使用,欢迎广泛传播,不作为商业用途。

①群已满加入②群

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫