【docker】启动临时MongoDB容器、挂载数据卷运行数据库服务,并通过备份文件恢复MongoDB数据库备份数据

‌启动临时 MongoDB 容器、挂载数据卷运行数据库服务,并通过备份文件恢复数据

1.命令分解与功能说明

1.1.启动一个临时 MongoDB 容器‌,并进入交互式终端

(1)执行命令

bash 复制代码
docker run -it -p 127.0.0.1:27017:27017/tcp --rm --entrypoint bash -v /data/script/volume/data/mongodb:/data/mongodb 容器ID

(2)实现功能‌

启动一个 临时 MongoDB 容器‌,并进入交互式终端。

(3)参数说明

  • -it:以交互模式运行容器(支持命令行操作)。
  • -p 127.0.0.1:27017:27017/tcp:将容器的 27017 端口映射到主机的本地 27017 端口(仅允许本机访问)。
  • --rm:容器退出后自动删除(适用于临时测试场景)。
  • --entrypoint bash:覆盖默认入口命令,直接启动 Bash 终端。
  • -v /data/script/volume/data/mongodb:/data/mongodb:将主机目录挂载到容器,实现数据持久化(主机目录:容器)。
  • 容器ID:MongoDB 镜像 ID。(容器内现有镜像,可通过docker images查看选择)

1.2.在容器内手动启动 MongoDB 服务‌,并指定数据存储路径

不同版本mongod的所在路径可能不同,可以先查找命令:

find / -name mongod,找到路径为/usr/bin/mongod

(1)执行命令

bash 复制代码
/usr/bin/mongod --dbpath /data/mongodb/‌

(2)实现功能‌

在容器内手动启动 MongoDB 服务‌,并指定数据存储路径

(3)参数说明

  • --dbpath /data/mongodb/:使用挂载的卷目录作为数据库存储路径,确保数据持久化

1.3.恢复指定备份文件到 MongoDB 数据库‌

注意版本兼容性‌ :mongorestore 版本需与 MongoDB 服务版本一致(如 5.0 的备份不支持恢复到 4.4 实例)
文件类型 :此时的backup_mongodb-备份日期序号为zip文件,如非zip文件无需增加--gzip参数,并根据实际文件类型选择适合的参数。
新开一个shell页面:此条命令另开一个shell界面,在本地服务器执行。

(1)执行命令

bash 复制代码
./mongorestore -h 127.0.0.1:27017 --gzip --drop /data/backup/backup_mongodb-备份日期序号/‌

(2)实现功能‌

恢复指定备份文件到 MongoDB 数据库‌

(3)参数说明

  • -h 127.0.0.1:27017:连接到本机 MongoDB 服务。
  • --gzip:解压压缩格式的备份文件。
  • --drop:覆盖目标数据库的现有集合。
  • /data/backup/backup_mongodb--备份日期序号/:备份文件路径(需确保可访问该路径)

(4)确认恢复完成

最后输出done ,看到done日志后,在1.2的shell页面里,退出容器:

bash 复制代码
ctrl+C
exit

验证数据是否恢复

2.组合使用场景

此命令组合适用于以下场景:

(1)本地测试与数据恢复‌

快速启动临时 MongoDB 容器,避免污染生产环境。

通过挂载卷保留数据(即使容器删除,数据仍保留在主机目录 /data/script/volume/data/mongodb)。

‌(2)备份验证‌

将备份数据恢复到临时数据库,验证备份文件的完整性和正确性。

‌(3)开发调试‌

在隔离环境中调试数据库操作,测试数据迁移或恢复流程。

3.注意事项

(1)路径一致性‌

确保主机目录 /data/script/volume/data/mongodb 和 /data/backup/backup_mongodb-备份日期序号/ 存在且可读写。

‌(2)容器网络限制‌

-p 127.0.0.1:27017:27017/tcp 仅允许本机访问 MongoDB 服务,外部无法连接。

‌(3)备份文件兼容性‌

备份文件需由 mongodump 生成,且目录结构与版本兼容目标 MongoDB 实例。

4.流程总结

该流程以最小资源占用实现数据恢复验证,适合快速测试场景。
启动临时容器 手动运行数据库服务 强制恢复备份数据 退出后自动清理容器

5.问题记录

  1. 错误 Failed: error connecting to db server: no reachable servers
  • 原因‌:本地 MongoDB 服务未运行或端口被防火墙拦截。
  • ‌解决‌:检查服务状态(ps aux | grep mongod)和端口可达性(telnet 127.0.0.1 27017)。暴露端口,vi docker-compose.yaml,在ports:里按照现有格式增加:- 27017:27017
  1. 在启动一个临时 MongoDB 容器‌,并进入交互式终端,执行命令时报错:
  • 执行指令:docker run -it -p 127.0.0.1:27017:27017/tcp --rm --entrypoint bash -v /data/script/volume/data/mongodb:/data/mongodb 容器ID
  • 报错内容:docker: Error response from daemon: driver failed programming external connectivity on endpoint serene_perlman (60ba0d087e4c4c77d05c045523a31da46faed5285169e809549609b4215f850c): Bind for 127.0.0.1:27017 failed: port is already allocated.
    ERRO[0000] error waiting for container: context canceled
  • 解决:
    避免手动杀 Docker 进程,当端口被占用且无法通过 docker stop 或 docker rm 清理时(例如容器状态异常、僵尸进程残留),重启 Docker 是最直接的解决方案。

生产环境的替代方案‌ 若环境不允许重启 Docker,可尝试以下步骤:

‌查找占用端口的容器‌:

docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}" | grep 27017

停止相关容器‌:

docker stop <容器名称或ID>

‌清理残留进程‌:

pkill -f "docker-proxy.*27017" # 强制终止残留的 docker-proxy 进程

(1)确认容器状态‌:

bash 复制代码
docker ps -a  # 检查容器是否存在及状态

(2)释放端口冲突‌:

  • 通过 Docker 停止容器‌:
bash 复制代码
docker stop 容器ID  # 使用容器名称或完整ID
  • 若容器已不存在但端口仍占用‌:
bash 复制代码
service docker restart  # 直接重启 Docker 服务

(3)‌验证端口释放‌:

bash 复制代码
netstat -ltnp | grep 27017  # 确认端口是否释放

(4)‌重新启动容器‌:

bash 复制代码
service docker restart  # 确保有权限执行

(5)确认 Docker 服务重启成功‌:

bash 复制代码
service docker status  # 应显示 "active (running)"

6.命令详解,输出字段解释

1.docker ps -a

‌(1)命令作用‌

列出 Docker 宿主机上的 ‌所有容器‌,包括 ‌正在运行的容器‌ 和 ‌已停止的容器‌。

默认的 docker ps 仅显示运行中的容器,而 -a 参数扩展了查询范围。

‌(2)输出字段解释‌

执行 docker ps -a 后,输出包含以下关键信息

字段名称 说明
‌CONTAINER ID‌ 容器的唯一标识符(短格式,默认截断显示)
IMAGE‌ 容器使用的镜像名称
COMMAND‌ 容器启动时执行的初始命令
‌CREATED‌ 容器的创建时间命令
‌STATUS‌ 容器状态(如 Up X minutes 表示运行中,Exited (X) minutes ago 表示已停止)
PORTS‌ 容器与宿主机之间的端口映射信息
‌NAMES‌ 容器的自定义名称(未指定时由 Docker 自动生成)

(3)常用参数‌

参数 作用
‌-q‌ 仅显示容器 ID,适用于批量操作(如删除所有容器)8
‌--no-trunc‌ 显示完整的容器 ID 和命令(默认截断过长内容)8
‌--filter‌ 按条件过滤容器(如 status=exited 显示已停止的容器)45

(4)示例‌

‌列出所有容器‌(包括已停止的):

bash 复制代码
docker ps -a

‌仅显示容器 ID‌:

bash 复制代码
docker ps -a -q

‌过滤已停止的容器‌:

bash 复制代码
docker ps -a --filter "status=exited"

‌(5)注意事项‌

容器未显示的可能原因‌:

  • Docker 服务异常(需检查服务状态 systemctl status docker)。
  • 数据目录配置冲突(如 Snap 与传统安装方式混用导致路径不一致)。
  • 日志驱动配置错误(需检查 /etc/docker/daemon.json)。

数据安全‌:

  • 使用 docker ps -a 结合 docker inspect <容器ID> 可获取容器详细信息(如挂载卷、网络配置)。
  • 删除容器前建议通过 docker logs <容器ID> 查看日志。

(6)总结‌

docker ps -a 是 Docker 容器管理的核心命令之一,通过参数组合可灵活查看容器状态、定位问题及执行批量操作。若遇到容器列表异常,需优先排查 Docker 服务状态及配置文件。

相关推荐
梦想画家16 分钟前
Bash 脚本:让数据库管理更高效
数据库·bash
想睡好19 分钟前
mysql约束
数据库
PolarisHuster26 分钟前
如何查看k8s获取系统是否清理过docker镜像
docker·容器·kubernetes
小黄人V1 小时前
使用skywalking进行go的接口监控和报警
数据库·golang·skywalking
一只特立独行的猫2 小时前
Docker与Vmware网络模式的对别
网络·docker·容器
烂漫心空2 小时前
数据库的死锁相关(一)
数据库·sql·mysql
GoodStudyAndDayDayUp2 小时前
docker拉取国内镜像
运维·docker·容器
中草药z2 小时前
【Docker】Docker拉取部分常用中间件
运维·redis·mysql·docker·容器·nacos·脚本
星空2 小时前
Django 学习指南:从入门到精通(大体流程)
数据库·sqlite
码熔burning2 小时前
【MongoDB篇】MongoDB的索引操作!
数据库·mongodb·nosql