【OAI实战】基于Docker-Compose的5G核心网基础部署与排错指南
1. 环境准备:从零搭建OAI 5G核心网基础平台
第一次接触OAI 5G核心网部署时,我被各种专业术语和复杂的配置步骤搞得晕头转向。经过多次实践后,我发现用Docker-Compose部署其实可以像搭积木一样简单。这里分享我的实战经验,帮你避开那些我踩过的坑。
硬件要求其实很亲民,我用的是2019年的联想ThinkPad T480(i5-8250U/16GB内存/256GB SSD)就能流畅运行。不过建议至少预留30GB磁盘空间,因为那些Docker镜像加起来可不小。操作系统必须是Ubuntu 18.04,这个版本经过OAI官方充分验证,我在20.04上试过会遇到依赖冲突。
安装系统时有个小技巧:在VMware中创建虚拟机时,记得把网络适配器设为桥接模式。有次我用了NAT模式,结果容器间通信死活不通,排查了整整一天才发现是这个原因。系统安装完成后,第一件事就是换源:
sudo sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list sudo apt update && sudo apt upgrade -y这个操作能让后续的软件安装速度提升5-10倍。有次我在默认源下安装docker-compose,光依赖下载就等了40分钟,换成阿里源后3分钟搞定。
2. Docker环境配置的魔鬼细节
很多人以为直接apt install docker就完事了,其实这里面藏着不少玄机。有次我偷懒没卸载旧版本,结果启动容器时各种权限报错。正确的做法是先彻底清理:
sudo apt-get remove docker docker-engine docker.io containerd runc sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd安装新版时推荐用阿里云的镜像源,这是我测试过国内速度最快的:
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"特别提醒:docker-compose的版本必须用1.29.2及以上。有次我用了系统默认的1.25.0,启动时YAML解析直接报错。建议用pip安装指定版本:
sudo pip3 install docker-compose==1.29.2验证安装时别只看版本号,一定要跑个实际容器测试。我习惯用这个命令检查网络连通性:
docker run --rm alpine ping -c 4 www.aliyun.com3. 镜像下载的加速技巧
下载OAI镜像最让人头疼的就是速度问题。官方镜像仓库在欧洲,国内直接拉取经常只有几十KB/s。经过多次尝试,我总结出几个有效方案:
方案一:使用国内镜像缓存
docker pull registry.cn-hangzhou.aliyuncs.com/oai/oai-amf:v1.4.0 docker tag registry.cn-hangzhou.aliyuncs.com/oai/oai-amf:v1.4.0 oai-amf:v1.4.0方案二:配置Docker守护进程在/etc/docker/daemon.json中添加:
{ "registry-mirrors": ["https://registry.docker-cn.com"] }然后重启服务:
sudo systemctl restart docker有次我遇到镜像拉取到一半断连的情况,可以用这个命令恢复:
docker pull --resume-from=$(docker images -q oai-amf)完整镜像列表建议用脚本批量下载:
for image in amf nrf smf udr udm ausf; do docker pull oaisoftwarealliance/oai-$image:v1.4.0 docker tag oaisoftwarealliance/oai-$image:v1.4.0 oai-$image:v1.4.0 done4. 网络配置的常见陷阱
创建网桥时有个细节很容易忽略:子网划分。官方文档用的192.168.70.128/26可能会和本地网络冲突。我建议先检查路由表:
route -n如果冲突了可以改用172.21.0.0/16这类私有地址。创建命令要带上MTU设置:
docker network create --driver=bridge --subnet=172.21.0.0/16 \ -o "com.docker.network.bridge.mtu"="1500" \ -o "com.docker.network.bridge.name"="demo-oai" \ demo-oai-public-net最坑的是IP转发设置,如果不开启会导致UE无法注册:
sudo sysctl -w net.ipv4.ip_forward=1 echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf验证网络连通性时,别只用ping测试。我习惯用这个组合命令:
docker run --network=demo-oai-public-net --rm busybox \ sh -c "ping -c 2 172.21.0.1 && nc -zv 172.21.0.1 80"5. 核心网启动与排错实战
启动命令看起来简单:
python3 core-network.py --type start-basic但第一次运行时我遇到了三个典型问题:
问题一:MySQL容器启动超时解决方法是在docker-compose文件里增加健康检查:
healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 5s timeout: 3s retries: 10问题二:AMF注册失败查看日志发现是NRF地址不对:
docker logs oai-amf | grep -i nrf需要检查docker-compose里AMF的配置文件:
environment: - NRF_IPV4_ADDRESS=192.168.70.130问题三:UPF无法连接SMF这个问题最隐蔽,最终发现是防火墙规则冲突:
sudo iptables -P FORWARD ACCEPT sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE6. 运维监控技巧
运行中的核心网需要持续监控,我常用的几个命令:
查看容器资源占用:
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"实时查看AMF日志:
docker logs -f oai-amf | grep -E "Registration|Deregistration"抓取N1/N2接口消息:
docker exec oai-amf tcpdump -i any -w amf.pcap性能瓶颈定位可以用:
docker exec oai-smf top -H -p $(pgrep -d, -f smf)有次遇到UE频繁掉线,最后发现是AMF内存泄漏。现在我会定期检查:
watch -n 5 'docker ps --format "{{.Names}}: {{.Status}}" | grep -i unhealthy'7. 常见问题解决方案
镜像下载卡住: 先检查磁盘空间:
df -h /var/lib/docker清理无用镜像:
docker system prune -a -f容器启动失败: 查看详细日志:
docker inspect --format='{{.State.Error}}' oai-smf网络不通: 检查iptables规则:
sudo iptables -L -n -v --line-numbers查看网桥配置:
brctl show demo-oai证书过期: OAI镜像内置的证书有时会过期,需要重新生成:
docker exec oai-amf openssl req -x509 -new -keyout amf.key -out amf.pem8. 进阶调试方法
当标准日志无法定位问题时,我会启用DEBUG模式:
docker stop oai-amf docker run -it --env LOG_LEVEL=DEBUG oai-amf:v1.4.0对于协议栈问题,Wireshark分析必不可少:
docker exec oai-smf tshark -i any -f "port 38412" -w smf.pcap内存泄漏检查:
docker exec oai-amf valgrind --leak-check=full ./amf -c /etc/amf.confCPU性能分析:
docker exec oai-smf gdb -p $(pgrep smf) -ex "thread apply all bt" --batch有次遇到随机崩溃,最后用这个命令发现是线程竞争:
docker exec oai-amf gdb -ex "set pagination off" -ex "thread apply all bt" --batch -p $(pgrep amf)