出于安全上的原因,MongoDB部署在Docker容器中,一般不会暴露27017端口到公网。但是如果要维护MongoDB,比如查询特定数据,删除,排查问题,则非常之麻烦,需要登录到容器内部的控制台,有时没有客户端还要安装等等,为了一点功能要一大波的操作。
一般而言,通过停止容器,然后打开端口,操作完了再关闭端口之类的方法也是可以的,比如:
docker stop mongodb_container
docker run -d --name mongodb_container -p 27017:27017 mongo
还是有点感觉麻烦,甚至是不是会导致其他的问题都感觉不安全,这个时候,简单一个端口转发搞定,使用Gost这个工具非常简单。(https://v2.gost.run/port-forwarding/)
./gost -L :7017/172.20.0.2:27017
简单的一行命令,暴露7017端口到 容器的27017端口,这样可以方便的使用图形工具(类似Studio3T)远程管理,用完中断掉这个命令即可。类似的方法完全可以用来重定向其他服务,比如数据库,ssh ,远程桌面 etc…
接下来备忘一下查问题所需要的MongoDB基本命令
//查询gpsPostion集合,字段tag_id为123,且按date排序
db.getCollection("gpsPostion").find({tag_id:'123'}).sort({date:1})
//查询gpsPostion集合中,tag_id和date相同的数据,(联合索引冲突,改表前处理)
db.getCollection('gpsPostion').aggregate([
{
$group: {
_id: { field1: "$tag_id", field2: "$date" },
count: { $sum: 1 }
}
},
{
$match: {
count: { $gt: 1 }
}
}
])
// 统计记录数
db.getCollection("gpsPostion").countDocuments({})
// 统计特定时间前的数据
db.getCollection("gpsPostion").find({ date: { $lt: ISODate("2024-05-01T00:00:00Z") } });
// 删除特定时间前的数据
db.getCollection("gpsPostion").deleteMany({ date: { $lt: ISODate("2024-05-01T00:00:00Z") } });
备注,获取容器IP的Docker命令
docker inspect \
-f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id