参考
搭建
L4D2 服务端体积较大(约 30GB), 建议在宿主机上预先下载, 然后通过数据卷挂载到 Docker 容器中, 这样可以避免每次重建镜像都重新下载
下载服务端
在宿主机创建一个工作目录(如 ~/l4d2_host), 并下载 SteamCMD:
mkdir -p ~/l4d2_host && cd ~/l4d2_host
curl -sSL https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz | tar zxvf -
使用 SteamCMD 匿名登录并下载 L4D2 服务端(AppID: 222860):
./steamcmd.sh +login anonymous +force_install_dir ./l4d2_server +app_update 222860 validate +quit
完整结构
.
├── bin
├── dedicatedserver_readme.txt
├── hl2
├── hlds_steamgames.vdf
├── l4d2-devkit.sh
├── left4dead2
├── left4dead2.dat
├── left4dead2_dlc1
├── left4dead2_dlc2
├── left4dead2_dlc3
├── left4dead2.exe
├── left4dead2.ico
├── left4dead2_lv
├── platform
├── srcds_linux
├── srcds_run
├── steam_appid.txt
├── steamapps
└── update
docker构建
Dockerfile
FROM debian:12-slim
ENV LANG=C.UTF-8
ENV DEBIAN_FRONTEND=noninteractive
# 替换为清华源, 添加 32 位架构支持并安装依赖
RUN sed -i 's/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list.d/debian.sources && \
dpkg --add-architecture i386 && \
apt-get update && \
apt-get install -y --no-install-recommends \
ca-certificates curl lib32gcc-s1 lib32stdc++6 lib32z1 \
lib32ncurses6 lib32tinfo6 libcurl4 libcurl4:i386 \
tmux && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# 创建 steam 用户并切换
RUN useradd -m -s /bin/bash steam
USER steam
WORKDIR /home/steam
# 暴露游戏默认端口 (TCP/UDP)
EXPOSE 27015/tcp 27015/udp
构建镜像
docker build -t l4d2_server:latest .
服务器配置
在宿主机的 ~/l4d2_host 目录下创建配置文件, 后续通过挂载注入容器
服务器基础配置
宿主机下新建server.cfg, 后续会挂载到容器的left4dead2/cfg/server.cfg
// ================= 基础信息 =================
hostname "My L4D2 Docker Server" // 服务器名称
sv_steamgroup "你的Steam组ID" // 关联的 Steam 组 ID
sv_steamgroup_exclusive "1" // 是否仅限 Steam 组成员进入 (0=否, 1=是)
sv_tags "hidden" // 隐藏服务器, 不在公共大厅显示
sv_region "255" // 区域设置 (255 表示全球)
// ================= 游戏规则 =================
sv_consistency "0" // 允许玩家使用不同的 Mod 进入 (必须为0, 否则三方图报错)
sv_allow_lobby_connect_only "0" // 允许通过 IP 直连 (0=允许, 1=仅限大厅)
sv_cheats "0" // 是否开启作弊 (0=关闭, 1=开启)
// ================= 网络与性能 =================
sv_maxrate "30000" // 最大网络带宽限制
sv_minrate "20000" // 最小网络带宽限制
fps_max "300" // 服务器最大帧率
欢迎信息(可选)
宿主机新建motd.txt, 玩家进入服务器时会弹出此文本
后续会挂载到容器的left4dead2/cfg/motd.txt
Welcome to My L4D2 Server!
Enjoy your stay!
部署与启动
创建容器
docker run -d \
--name l4d2 \
--net host \
--restart unless-stopped \
-v $(pwd)/l4d2_server:/home/steam/l4d2_server \
-v $(pwd)/server.cfg:/home/steam/l4d2_server/left4dead2/cfg/server.cfg \
-v $(pwd)/motd.txt:/home/steam/l4d2_server/left4dead2/cfg/motd.txt \
l4d2_server:latest \
/home/steam/l4d2_server/srcds_run \
-game left4dead2 \
-insecure \
+map c1m1_hotel \
-maxplayers 8 \
+exec server.cfg
--net host: 使用宿主机网络, 避免端口映射带来的 NAT 问题(推荐)
-insecure: 禁用 VAC 反作弊, 运行三方图和插件的必要条件
+map c1m1_hotel: 初始启动地图(死亡中心第一关)
+exec server.cfg: 加载配置文件
建图
获取目标地图代码, 执行命令建立地图
docker exec -it l4d2_mini sh /home/steam/left4dead2_server/srcds_run -game left4dead2 -secure -insecure +map 地图代码 -maxplayers 8 -condebug +exec /home/steam/left4dead2_server/left4dead2/cfg/server.cfg -nomaster
若要使用三方图, 须将地图文件拷贝到容器内/home/steam/l4d2server/left4dead2/addons路径下
- 示例, 使用广州增城地图
拷贝vpk文件
docker cp ./2396847377.vpk l4d2:/home/steam/l4d2server/left4dead2/addons
修改地图代码为增城第一关, 启动
docker exec -it l4d2 sh /home/steam/l4d2server/srcds_run -game left4dead2 -secure -insecure +map zc_m1 -maxplayers 8 -condebug +exec /home/steam/l4d2server/left4dead2/cfg/server.cfg -nomaster
连接
创建大厅
页面选择: 完成战役-与好友一起玩游戏-创建新战役大厅
设置服务器
服务器类型选目前最佳专用
按~启动控制台, 设置强制使用指定服务器, 开始游戏
mm_dedicated_force_servers 服务器IP:端口
- 示例, 设服务器IP为112.126.28.203, 端口默认27015
mm_dedicated_force_servers 112.126.28.203:27015
连接成功后服务端显示用户已经加入
安装插件
获取 Metamod 和 SourceMod: 前往 Metamod 官网 和 SourceMod 官网 下载最新的 Linux 版本
解压到游戏目录: 将下载的压缩包解压到宿主机的 l4d2_server/left4dead2/ 目录下(会生成 addons 和 cfg 等文件夹, 直接覆盖合并)
配置 Metamod: 在 left4dead2/addons/ 目录下创建 metamod.vdf 文件, 内容如下
"Plugin"
{
"file" "../left4dead2/addons/sourcemod/bin/sourcemod_mm"
}
重启服务器: docker restart l4d2
进入容器输入 meta list 和 sm plugins list 验证是否安装成功
控制台指令
基础
队友传送
Warp_all_survivors_here
作弊
Sv_Cheats 1
无敌
god 1
穿墙
noclip
第三人称
thirdpersonshoulder 1
绑定按键
# 将常用指令绑定到键盘按键上, 例如将第三人称绑定到 <kbd>V</kbd> 键:
bind g "thirdpersonshoulder 1"
bind v "thirdpersonshoulder 1"
bind b "thirdpersonshoulder 0"
bind p "noclip"
武器
无限弹药不换弹夹
sv_infinite_ammo 1
激光
upgrade_add laser_sight
榴弹
give weapon_grenade_launcher
m60
give rifle_m60
地图
map 地图代码
突变模式
map 地图代码 模式名
猎头者
map 地图代码 mutation2