跳转至

环境部署1: Open5GS

在网络上找到的有关 Dockerized Open5GS 的部署经验帖:

名称 地位 链接
herlesupreeth/docker_open5gs 最完整的Docker部署方案,官方推荐 https://github.com/herlesupreeth/docker_open5gs
Open5GS官方VoLTE Docker教程 官方文档中引用的Docker方案 https://open5gs.org/open5gs/docs/tutorial/03-VoLTE-dockerized/
Nick vs Networking博客 经典的Open5GS+UERANSIM入门教程 https://nickvsnetworking.com/my-first-5g-core-open5gs-and-ueransim/
Medium: 5G Core Network Setup eranga的详细部署经验 https://medium.com/rahasak/5g-core-network-setup-with-open5gs-and-ueransim-cd0e77025fd7
Gradiant 5G Charts Kubernetes/Helm部署参考 https://gradiant.github.io/5g-charts/open5gs-ueransim-gnb.html

下面给出笔者自己的步骤:

环境: Ubuntu 24.04, 采用本机部署 Open5GS Docker, 不考虑虚拟机

系统环境准备

系统版本确认:

Bash
1
2
# 确认Ubuntu版本 (22.04/24.04...)
lsb_release -a

Docker 和 Docker Compose 安装:

Bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 安装Docker
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 验证安装
docker --version    # 需要 >= 22.0.5
docker compose version  # 需要 >= 2.14

配置docker权限: [懒人族. 不想每次都显式输入 sudo]

Bash
1
2
sudo usermod -aG docker $USER
newgrp docker

拉取/构建/配置

本地仓库:

Bash
1
2
git clone https://github.com/herlesupreeth/docker_open5gs d2c-open5gs
cd d2c-open5gs

拉取预构建镜像: [推荐. 节省时间]

Bash
1
2
3
4
# 拉取基础镜像
docker pull ghcr.io/herlesupreeth/docker_open5gs:master
# 含义是: alias (用 docker images 检查, 发现二者UUID相同)
docker tag ghcr.io/herlesupreeth/docker_open5gs:master docker_open5gs

编辑 .env 文件并修改:

Bash
1
2
cd ~/d2c-open5gs
vim .env
YAML
1
2
3
4
5
6
# PLMN配置(测试用001/01即可)
MCC=001
MNC=01

# 重要: 改为你的主机IP地址
DOCKER_HOST_IP=192.168.1.100   # ← 改成你的实际IP

系统设置

网络:

Bash
1
2
3
4
5
6
7
8
9
# 关闭防火墙
sudo ufw disable

# 启用IP转发
sudo sysctl -w net.ipv4.ip_forward=1

# 持久化IP转发配置
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

环境变量:

Bash
1
2
3
4
cd ~/d2c-open5gs
set -a
source .env
set +a

启动 5GC

Bash
1
2
3
4
5
6
# 构建所有组件
docker compose -f sa-deploy.yaml build
# 启动所有5GC网络功能
docker compose -f sa-deploy.yaml up -d
# 查看运行状态
docker compose -f sa-deploy.yaml ps

alt text

alt text

alt text

Bash
1
2
3
4
5
6
7
# 全盘检查
# - mongodb
# - webui
# - nrf, scp, ausf, udm, udr, pcf, bsf, nssf
# - amf, smf, upf

docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

alt text

检查: 访问WebUI

打开浏览器访问: http://<DOCKER_HOST_IP>:9999, 其实也就是 localhost:9999

登录凭据:

  • 用户名: admin
  • 密码: 1423

alt text

后续

现在我们已经完成了初始化配置+第一次启动:

  1. 该怎么关闭呢?
  2. 下一次如何再启动呢?

关闭

Bash
1
2
3
4
5
6
7
cd ~/d2c-open5gs
# 方式A: 停止但保留容器 [推荐日常使用]
docker compose -f sa-deploy.yaml stop
# 方式B: 停止并删除容器
docker compose -f sa-deploy.yaml down
# 方式C: 停止并删除容器+数据卷 [完全重置. 慎用]
docker compose -f sa-deploy.yaml down -v

开启

Bash
1
2
3
4
5
cd ~/d2c-open5gs
# 如果之前用 stop 关闭的
docker compose -f sa-deploy.yaml start
# 如果之前用 down 关闭的 [or 首次启动, 正如上面我们配置环境时]
docker compose -f sa-deploy.yaml up -d

推荐工作流

鉴于我们现在已经配置完所有环节, 后面就是日常的"开启/关闭"即可, 因此笔者推荐的工作流是:

Bash
1
2
3
4
# 上班:
docker compose -f sa-deploy.yaml start
# 下班:
docker compose -f sa-deploy.yaml stop
指令说明

指令说明 [暂时用不上, 担心后面有需要, 先整理着]

  • 修改配置文件: restart
    • 小型yaml配置
  • 修改 docker-compose.yaml / .env: down + up -d
    • 端口/网络/环境变量
  • 修改 Dockerfile: down + build + up -d
    • 构建脚本
  • 修改 Open5GS 源码: down + build --no-cache + up -d
    • C 代码

用 AI 总结了一下, 感觉整理的比笔者好:

Bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
docker_open5gs/
├── .env                    # 环境变量 → down + up
├── sa-deploy.yaml          # 部署定义 → down + up
├── base/
│   └── Dockerfile          # 基础镜像构建 → build --no-cache
├── amf/
│   └── amf.yaml            # AMF配置 → restart amf
├── smf/
│   └── smf.yaml            # SMF配置 → restart smf
├── upf/
│   └── upf.yaml            # UPF配置 → restart upf
└── ...

复盘: 结合open5gs环境部署, 讲解 docker 常见工作流

alt text

(1) 构建镜像

既可以利用本地的github仓库自行构建, 也可以直接pull远程的"别人构建好的镜像"

Bash
1
2
3
4
# Method 1: pull远程镜像
# [GitHub镜像仓库 ghio/...] -> PC -> [本地镜像库 d2c-open5gs]
docker pull ghcr.io/herlesupreeth/docker_open5gs:master # pull from remote
docker tag ghcr.io/herlesupreeth/docker_open5gs:master d2c-open5gs # alias
Bash
1
2
3
4
# Method 2: build本地镜像
# [Dockerfile (构建脚本)] -> [Docker引擎执行每一条构建指令] -> [本地镜像库 d2c-open5gs]
cd ~/d2c-open5gs/base
docker build --no-cache --force-rm -t d2c-open5gs .

检查本地镜像:

Bash
1
docker images

(2) docker-compose.yaml 多容器部署交互模式定义

比如这里的 sa-deploy.yaml, 定义了:

YAML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
services:
  mongodb:           # 数据库服务
    image: mongo     # 使用官方MongoDB镜像
    ports: ["27017:27017"]

  nrf:               # NRF网络功能
    image: docker_open5gs    # 使用我们的镜像
    command: /open5gs/install/bin/open5gs-nrfd  # 启动NRF程序
    depends_on: [mongodb]    # 依赖MongoDB先启动

  amf:               # AMF网络功能
    image: docker_open5gs
    command: /open5gs/install/bin/open5gs-amfd
    depends_on: [nrf]        # 依赖NRF先启动
    ports: ["38412:38412/sctp"]  # 暴露NGAP端口

  smf:               # SMF网络功能
    image: docker_open5gs
    ...

  upf:               # UPF网络功能
    image: docker_open5gs
    privileged: true         # 需要特权模式(创建TUN设备)
    ...

networks:
  default:           # 定义Docker内部网络
    driver: bridge
    ipam:
      config:
        - subnet: 172.22.0.0/24

alt text

(3) 构建额外组件

Bash
1
docker compose -f sa-deploy.yaml build

Docker Compose 读取 sa-deploy.yaml, 按照里面的定义, 对每一个需要构建的服务:

  1. 找到对应的 Dockerfile
  2. 执行 docker build, 生成该服务专用的images

(4) 启动所有容器

Bash
1
docker compose -f sa-deploy.yaml up -d
  1. 创建Docker网络
  2. 按依赖顺序启动容器