Kamailio、MySQL、Redis、Gin后端、Vue.js前端等基于容器化部署
基于容器化的部署方案,通常会将每个核心服务(如Kamailio、MySQL、Redis、Gin后端、Vue.js前端等)独立运行在不同的容器中,通过Docker或Kubernetes统一管理。以下是具体实现方式和关键原因:
1. 容器化部署的核心思路
- 每个服务独立容器化:
- Kamailio:运行在独立容器,处理SIP信令。
- MySQL:数据库单独容器化,存储用户、CDR等数据。
- Redis:缓存服务独立容器,存储会话和临时数据。
- Gin后端:运行业务逻辑的API容器。
- Vue.js前端:静态文件托管在Nginx容器或直接通过CDN分发。
- 容器间通信:
- 使用Docker自定义网络(如
docker network create voip-net
),让容器通过服务名(如mysql
、redis
)相互访问。 - 例如,Gin容器通过
mysql:3306
连接MySQL,Kamailio通过redis:6379
访问Redis。
- 使用Docker自定义网络(如
2. 为什么选择多容器分离部署?
(1) 环境隔离
- 依赖隔离:Kamailio可能依赖特定版本的
libsctp
,而MySQL需要libssl
,独立容器避免冲突。 - 安全性:即使某个容器被攻击(如Redis),其他服务(如MySQL)仍受Docker网络隔离保护。
(2) 独立扩展
- 按需扩缩容:
- 高并发时,单独扩展Kamailio容器(如从3个实例扩展到10个)。
- 数据库压力大时,扩展MySQL从库容器。
- 资源限制:
- 为Kamailio分配更多CPU,为MySQL分配更多内存,避免资源争抢。
(3) 简化依赖管理
- Kamailio容器:只需包含Kamailio二进制文件、配置文件及运行时依赖。
- MySQL容器:直接使用官方镜像,无需手动安装和配置。
3. 具体部署示例(Docker Compose)
以下是一个简化的docker-compose.yml
文件,展示多容器部署的典型配置:
version: '3.8'
# 定义自定义网络
networks:
voip-net:
driver: bridge
services:
# Kamailio容器
kamailio:
image: kamailio/kamailio:latest
ports:
- "5060:5060/udp" # SIP UDP端口
- "5061:5061/tcp" # SIP TLS端口
volumes:
- ./kamailio.cfg:/etc/kamailio/kamailio.cfg # 挂载配置文件
networks:
- voip-net
depends_on:
- mysql
- redis
# MySQL容器
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: "your_root_password"
MYSQL_DATABASE: "voip_db"
volumes:
- ./mysql_data:/var/lib/mysql # 持久化数据
networks:
- voip-net
# Redis容器
redis:
image: redis:alpine
volumes:
- ./redis_data:/data # 持久化数据
networks:
- voip-net
# Gin后端容器
gin-api:
build: ./voip-admin # 构建Gin后端的Dockerfile
ports:
- "8080:8080"
networks:
- voip-net
depends_on:
- mysql
- redis
# Vue.js前端容器(Nginx托管)
vue-frontend:
build: ./voip-web # 构建Vue项目的Dockerfile
ports:
- "80:80"
networks:
- voip-net
4. 关键配置说明
(1) Kamailio容器
- 配置文件挂载:将本地的
kamailio.cfg
挂载到容器内,动态修改路由逻辑。 - 端口映射:
5060/udp
:用于SIP信令。5061/tcp
:用于SIP over TLS加密通信。
- 依赖服务:通过
depends_on
确保MySQL和Redis先启动。
(2) MySQL容器
- 数据持久化:将
./mysql_data
目录挂载到容器,防止容器重启后数据丢失。 - 环境变量:初始化数据库和root密码。
(3) Redis容器
- 持久化:启用AOF(Append-Only File)模式,确保缓存数据可恢复。
command: redis-server --appendonly yes
(4) Gin后端容器
- 构建自定义镜像:通过
Dockerfile
编译Go项目:FROM golang:1.20 WORKDIR /app COPY go.mod ./ RUN go mod download COPY . . RUN go build -o voip-admin CMD ["./voip-admin"]
(5) Vue.js前端容器
- 静态资源托管:使用Nginx镜像托管编译后的Vue.js文件:
FROM nginx:alpine COPY dist /usr/share/nginx/html COPY nginx.conf /etc/nginx/conf.d/default.conf
5. 多容器部署的优势
- 一键启停:
docker-compose up -d # 启动所有服务 docker-compose down # 停止并清理
- 日志集中管理:
docker-compose logs -f kamailio # 查看Kamailio日志
- 独立升级:
- 更新Kamailio版本时,只需替换镜像标签:
image: kamailio/kamailio:5.6.0
- 更新Kamailio版本时,只需替换镜像标签:
6. 注意事项
- 数据持久化:务必挂载MySQL和Redis的数据目录,避免容器删除后数据丢失。
- 网络性能:SIP对延迟敏感,若跨物理机部署容器,需优化网络(如使用
host
网络模式或专用网卡)。 - 资源限制:为Kamailio容器分配足够CPU和内存(通过
cpus
和mem_limit
参数)。
总结
将Kamailio、MySQL、Redis等服务各自部署到独立容器,是容器化的标准实践。这种方式兼顾了灵活性、安全性和易维护性,尤其适合需要快速迭代、弹性扩展的VoIP管理系统。通过Docker Compose或Kubernetes编排,这样子就像搭积木一样自由组合服务,轻松应对复杂场景。