【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 服务状态及配置文件。

相关推荐
GUIQU.10 分钟前
【Oracle】视图
数据库·oracle
南棱笑笑生11 分钟前
20250605在微星X99主板中配置WIN10和ubuntu22.04.6双系统启动的引导设置
数据库
Leo.yuan23 分钟前
实时数据仓库是什么?数据仓库设计怎么做?
大数据·数据库·数据仓库·数据分析·spark
艾露z23 分钟前
深度解析Mysql中MVCC的工作机制
java·数据库·后端·mysql
gs8014039 分钟前
[闭源saas选项]Pinecone:为向量数据库而生的实时语义搜索引擎
数据库·搜索引擎
大熊猫侯佩1 小时前
使用令牌(Token)进一步优化 SwiftData 2.0 中历史记录追踪(History Trace)的使用
数据库·swift·apple
网安小张1 小时前
解锁FastAPI与MongoDB聚合管道的性能奥秘
数据库·python·django
老兵发新帖2 小时前
Flyway
数据库
薛晓刚2 小时前
一次Oracle的非正常关闭
数据库