如何访问AWS Lightsail Container中的Mongo Docker实例以导出数据?
别慌!虽然Lightsail容器服务的控制台没直接提供进入容器的入口,但咱们完全可以通过AWS CLI工具来访问容器并导出数据,下面给你三种可行的方案,按需选择:
方案一:直接进入容器执行导出命令(最直接)
这种方法适合快速导出小体量数据:
准备AWS CLI
先确保你本地装了AWS CLI,并且已经通过aws configure配置好了拥有Lightsail操作权限的凭证。获取容器信息
运行这条命令查看你的容器服务详情,找到当前运行的容器名称:aws lightsail get-container-services --service-name <你的容器服务名称>在返回的JSON结果里,找
currentDeployment→containers下面的容器名称,记下来备用。进入容器shell
执行下面的命令进入容器(如果容器里没有bash,换成/bin/sh试试):aws lightsail execute-container-command --service-name <你的容器服务名称> --container-name <刚才找到的容器名> --command "/bin/bash"导出Mongo数据
进入容器后,用Mongo自带的mongodump工具导出数据到临时目录:# 如果Mongo没设认证,直接跑 mongodump --out /tmp/mongo-backup # 如果有用户名密码,加上参数 mongodump -u <你的Mongo用户名> -p <你的Mongo密码> --out /tmp/mongo-backup把备份传到本地
保持容器shell连接,新开一个终端:- 如果容器里装了AWS CLI,直接把备份上传到S3(前提是有权限):
之后从S3下载到本地即可。aws s3 cp /tmp/mongo-backup s3://<你的S3桶名>/mongo-backup --recursive - 要是没装AWS CLI,也可以用
curl把备份文件传到你自己的临时服务器,或者结合方案二的存储卷方法来拷贝。
- 如果容器里装了AWS CLI,直接把备份上传到S3(前提是有权限):
方案二:通过存储卷挂载拷贝数据(更稳妥)
适合数据量较大的场景,不用担心传输中断:
创建Lightsail存储卷
登录Lightsail控制台,创建一个容量足够的存储卷(参考你的Mongo数据大小),确保和容器服务在同一个区域。更新容器部署挂载存储卷
新建一个容器部署配置,把刚创建的存储卷挂载到容器的某个目录(比如/backup),然后重新部署你的容器服务。进入容器拷贝数据
用方案一的步骤3进入容器,把Mongo的数据目录(通常是/data/db)或者mongodump导出的备份拷贝到挂载的存储卷:# 直接拷贝Mongo原始数据目录 cp -r /data/db/* /backup/ # 或者拷贝备份文件 cp -r /tmp/mongo-backup/* /backup/提取存储卷里的数据
把这个存储卷从容器服务卸载,挂载到同区域的一个Lightsail实例上,然后通过SSH连接到实例,把数据下载到本地。
方案三:导出容器镜像到本地运行(兜底方案)
如果上面两种方法都遇到障碍,可以试试把容器镜像拉到本地,本地运行后再导出数据:
导出容器镜像
运行这条命令导出镜像,命令执行后会返回一个镜像地址:aws lightsail export-container-image --service-name <你的容器服务名称> --container-name <容器名> --image-version <版本号> --region <你的区域>用
docker pull把这个镜像拉到本地。本地启动容器
用Docker启动这个镜像:docker run -d --name temp-mongo <镜像名称>本地导出数据
直接在本地操作:# 进入本地容器导出 docker exec -it temp-mongo /bin/bash # 或者直接在本地用mongodump连接 mongodump --host localhost --port 27017 --out ./mongo-backup
最后提醒
导出数据后,记得及时做好备份!下次部署Mongo的时候一定要挂载持久化存储卷,避免再遇到这种棘手的情况~
内容的提问来源于stack exchange,提问作者Lichess

