当前位置: 首页 > article >正文

Docker Compose介绍及安装使用MongoDB数据库详解

在现代容器化应用部署中,Docker Compose是一种非常实用的工具,它允许我们通过一个docker-compose.yml文件来定义和运行多容器应用程序。然而,除了Docker之外,Podman也提供了类似的工具——Podman Compose,它允许我们在Podman环境中使用类似于Docker Compose的功能。本文将介绍如何使用Podman Compose来管理MongoDB数据库,并详细讲解如何使用init-mongo.js文件初始化数据库。

Podman Compose简介

Podman Compose是一个与Docker Compose类似的工具,旨在为Podman提供多容器应用编排的能力。Podman是一个无守护进程的容器引擎,它遵循容器运行时的标准,提供了更加简洁和安全的容器管理方式。

Podman Compose的工作原理

Podman Compose读取docker-compose.yml文件(虽然它名为docker-compose,但在Podman Compose中可以兼容使用这个文件格式来定义服务、网络和卷等信息),然后根据文件中的定义在Podman环境中创建和管理容器、网络等资源。

Podman Compose的优势

  1. 与现有的基于docker-compose.yml文件的工作流程兼容,方便那些已经熟悉Docker Compose的用户过渡到Podman环境。
  2. 利用Podman的特性,如无守护进程运行容器,提高了容器的安全性和资源利用效率。

Podman Compose常用命令

  1. 启动服务

    • 命令:podman-compose -f ‘docker-compose.yml’ up -d
    • 功能:以守护进程模式(-d选项)启动在docker-compose.yml文件中定义的所有服务。这类似于Docker Compose中的up -d命令。
  2. 停止并移除服务

    • 命令:podman-compose -f ‘docker-compose.yml’ down
    • 功能:停止正在运行的服务,并移除相关的容器、网络(如果是由Podman Compose创建的)和卷(如果是由Podman Compose创建且没有设置为外部卷)。这与Docker Compose中的down命令功能类似。
  3. 查看服务状态

    • 命令:podman-compose -f ‘docker-compose.yml’ ps
    • 功能:列出在docker-compose.yml文件中定义的所有服务的容器状态,包括容器名称、镜像、状态等信息。
  4. 查看日志

    • 命令:podman-compose -f ‘docker-compose.yml’ logs [service_name]
    • 功能:查看服务的容器日志。如果指定了service_name,则只查看该服务的日志;如果不指定,则查看所有服务的日志。

安装 Docker Compose

如果尚未安装Docker Compose,请先安装Docker Compose环境。

  • 对于Ubuntu系统,可以使用以下命令安装Docker Compose:
  sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose# 给予可执行权限sudo chmod +x /usr/local/bin/docker-compose# 检验Docker Compose是否安装成功docker-compose --version

Podman Compose 安装

在使用 Podman Compose 之前,确保你的系统已经安装了 Podman。如果尚未安装 Podman,可以参考官方文档进行安装。

对于 Ubuntu 系统

  1. 安装 Podman:
sudo apt-get update
sudo apt-get install -y podman podman-compose
  1. 验证 Podman 和 Podman Compose 是否安装成功:
podman --version
podman-compose --version

如果安装成功,你应该会看到类似如下的输出:

podman version 3.4.4
podman-compose version 1.0.3

使用Podman Compose配置MongoDB

以下是一个基本的docker-compose.yml文件示例,展示了如何配置MongoDB服务:

version: '3.8'services:mongodb:image: mongo:latestcontainer_name: mongodbenvironment:- MONGO_INITDB_ROOT_USERNAME=admin- MONGO_INITDB_ROOT_PASSWORD=admin123volumes:- mongodb_data:/data/db- mongodb_logs:/var/log/mongodb- ./mongod.conf:/etc/mongod.conf- ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.jshealthcheck:test: ["CMD", "mongo", "--eval", "db.adminCommand('ping')"]interval: 10stimeout: 5sretries: 5networks:- dco-netvolumes:mongodb_data:mongodb_logs:networks:dco-net:

(一)关键配置解释

  • 环境变量:设置MongoDB的初始化用户名和密码。
  • 卷挂载:
    • mongodb_datamongodb_logs 用于持久化数据和日志。
    • ./mongod.conf 用于自定义MongoDB配置。
    • ./init-mongo.js 用于初始化数据库。
  • 健康检查:确保MongoDB服务正常运行,通过定期执行db.adminCommand('ping')命令来检查。

初始化MongoDB数据库

init-mongo.js文件允许你在MongoDB容器启动时执行初始化脚本。这对于创建初始数据、用户或设置非常有用。

(一)示例init-mongo.js

db.auth('admin', 'admin123');db = db.getSiblingDB('mydatabase');db.createCollection('users');db.users.insertMany([{ name: 'Alice', email: 'alice@example.com' },{ name: 'Bob', email: 'bob@example.com' }
]);print('Initialized mydatabase with users collection');

(二)使用步骤

  1. 创建init-mongo.js文件:将上述脚本保存为init-mongo.js并放置在项目目录中。
  2. 挂载文件:确保在docker-compose.yml文件中将init-mongo.js挂载到/docker-entrypoint-initdb.d/目录。
  3. 启动服务:运行podman-compose -f 'docker-compose.yml' up -d启动MongoDB服务。

MongoDB容器启动时,会自动执行/docker-entrypoint-initdb.d/目录下的所有JavaScript文件,从而初始化数据库。

应用依赖mongodb的使用方式

如果一个应用依赖mongodb容器,以下给出一个完整的docker-compose.yml使用示例:

version: '3.8'services:mongodb:image: mongo:latestcontainer_name: mongodbenvironment:- MONGO_INITDB_ROOT_USERNAME=admin- MONGO_INITDB_ROOT_PASSWORD=admin123volumes:- mongodb_data:/data/db- mongodb_logs:/var/log/mongodb- ./mongod.conf:/etc/mongod.conf- ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.jshealthcheck:test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"]interval: 10stimeout: 5sretries: 5networks:- dco-netgodco:build:context: .dockerfile: Dockerfilecontainer_name: godcoports:- "7000:8080"volumes:- ./etc:/app/etc- ./static:/app/staticnetworks:- dco-netdepends_on:mongodb:condition: service_healthycommand: ["./godco", "-f", "./etc/godco-api.yaml"] volumes:mongodb_data:mongodb_logs:networks:dco-net:

init-mongo.js:

db = db.getSiblingDB('admin');
print("Starting database initialization...");
// 创建管理员用户
db.createUser({user: "yang",pwd: "yang123", // 请使用更安全的密码方式,例如环境变量或密钥管理服务roles: [ { role: "root", db: "admin" } ]}
);db = db.getSiblingDB('atomdco');
print("Switched to database: " + db.getName());
db.createCollection('mycollection'); // 创建集合
db.mycollection.insertMany([{ name: "Alice" }, { name: "Bob" }]);
db.createUser({user: "test1",pwd: "111111",roles: [{ role: "readWrite", db: "atomdco" }]
});print("database initialization success");

使用命令:

podman-compose -f 'docker-compose.yml' down
podman-compose -f 'docker-compose.yml' up -d
#查看日志
docker logs container_name_or_id
#如何知道容器启动成功了?
podman ps
#或者
podman-compose -f 'docker-compose.yml' logs

则会自动启动应用,先启动mongodb容器,再启动应用容器。并且mongodb数据库的初始化,init-mongo.js脚本会自动执行,完成创建用户名和密码等操作。如何查看脚本执行成功了?可以使用以下命令,进入mongodb容器查看。

 #进入容器podman-compose exec mongodb /bin/bash#进入之后,使用客户端连接:
mongosh "mongodb://admin:admin123@localhost:27017"
#或者
mongosh --username admin --password admin123
#

在这里插入图片描述
如果想在mongodb的容器中,执行一段js脚本呢?也是有办法的,可以写一个如下的shell脚本,加载执行js脚本。

#!/bin/bash# JavaScript 脚本路径
SCRIPT_PATH="./init-mongo.js"# 检查 mongosh 是否安装
if ! command -v mongosh &> /dev/null
thenecho "Error: mongosh could not be found. Please install it first."exit 1
fi# 执行 JavaScript 脚本
mongosh --host localhost --port 27017 --username $MONGO_INITDB_ROOT_USERNAME --password $MONGO_INITDB_ROOT_PASSWORD --authenticationDatabase admin <<EOF
load("$SCRIPT_PATH");
EOF# 检查脚本执行结果
if [ $? -eq 0 ]; thenecho "JavaScript script executed successfully."
elseecho "Failed to execute JavaScript script."exit 1
fi

结论

通过Podman Compose,你可以轻松管理和部署复杂的多容器应用。结合init-mongo.js文件,你可以自动化数据库初始化过程,确保每次部署都有一致的环境。Podman Compose提供了一种在Podman环境下类似于Docker Compose的功能,方便用户进行容器化应用的编排和管理。

参考资料

  • Podman Compose官方文档
  • MongoDB Docker Image文档

通过这些步骤,你可以高效地使用Podman Compose来管理你的MongoDB数据库,并确保每次部署都有一致且初始化的数据环境。

相关文章:

Docker Compose介绍及安装使用MongoDB数据库详解

在现代容器化应用部署中&#xff0c;Docker Compose是一种非常实用的工具&#xff0c;它允许我们通过一个docker-compose.yml文件来定义和运行多容器应用程序。然而&#xff0c;除了Docker之外&#xff0c;Podman也提供了类似的工具——Podman Compose&#xff0c;它允许我们在…...

科普:数据仓库中的“指标”和“维度”

在数据仓库中&#xff0c;指标和维度是两个核心概念&#xff0c;它们对于数据分析和业务决策至关重要。以下是对这两个概念的分析及举例说明&#xff1a; 一、指标 定义&#xff1a; 指标是用于衡量业务绩效的关键数据点&#xff0c;通常用于监控、分析和优化企业的运营状况。…...

11.swagger使用

菜单位置 未登录接口会返回401 登录的token存储的位置 配置文件swagger配置中将/dev-api修改/...

java高级知识之集合

前言 集合是java开发中的重点内容&#xff0c;需要掌握的东西很多&#xff0c;面试中可问的东西很多&#xff0c;无论是深度还是广度。集合框架中Collection对应的实现类如下所示&#xff0c;这些都是要完全掌握&#xff0c;一个可以分为三大类List集合、Set‘集合以及Map集合…...

deepseek + kimi 高效生成PPT

1.在deepseek中生成ppt大纲 2.将大纲复制到kimi中生成PPT kimi&#xff1a;https://kimi.moonshot.cn/...

hadoop之MapReduce:片和块

假如我现在500M这样的数据&#xff0c;如何存储&#xff1f; 500M 128M 128M 128M 116M 分为四个块进行存储。 计算的时候&#xff0c;是按照片儿计算的&#xff0c;而不是块儿。 块是物理概念&#xff0c;一个块就是128M ,妥妥的&#xff0c;毋庸置疑。 片是逻辑概念&…...

好好说话:深度学习扫盲

大创项目是和目标检测算法YOLO相关的&#xff0c;浅浅了解了一些有关深度学习的知识。在这里根据本人的理解做一些梳理。 深度学习是什么&#xff1f; 之前经常听到AI&#xff0c;机器学习&#xff0c;深度学习这三个概念&#xff0c;但是对于三者的区别一直很模糊。 AI&…...

ASP.NET Core的贫血模型与充血模型

目录 概念 需求 贫血模型 充血模型 总结 概念 贫血模型&#xff1a;一个类中只有属性或者成员变量&#xff0c;没有方法。充血模型&#xff1a;一个类中既有属性、成员变量&#xff0c;也有方法。 需求 定义一个类保存用户的用户名、密码、积分&#xff1b;用户必须具有…...

【愚公系列】《Python网络爬虫从入门到精通》001-初识网络爬虫

标题详情作者简介愚公搬代码头衔华为云特约编辑&#xff0c;华为云云享专家&#xff0c;华为开发者专家&#xff0c;华为产品云测专家&#xff0c;CSDN博客专家&#xff0c;CSDN商业化专家&#xff0c;阿里云专家博主&#xff0c;阿里云签约作者&#xff0c;腾讯云优秀博主&…...

Kubernetes控制平面组件:etcd(一)

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;kubectl 和 …...

2100年芜湖人的一天:张明的生活剪影

2100年芜湖人的一天&#xff1a;张明的生活剪影 破晓 6:30 "沙沙"的微风声轻轻掠过耳畔&#xff0c;杨柳的沙沙声混合着若有若无的鸟鸣&#xff0c;张明的意识从深邃的梦境中缓缓浮现。这并非真实的自然声响&#xff0c;而是他的脑机接口精心编织的唤醒交响曲。量子…...

外贸网站源码 助力企业抢占蛇年市场先机!

在竞争激烈的外贸市场中&#xff0c;蛇年无疑是企业寻求突破与增长的关键一年。外贸网站源码为企业提供了快速搭建专业外贸网站的解决方案&#xff0c;助力企业在新的一年抢占市场先机。 快速上线 时间就是商机&#xff0c;尤其是在蛇年这样充满变数和机遇的年份。外贸网站源码…...

verilog练习:i2c slave 模块设计

文章目录 前言1.结构2.代码2.1 iic_slave.v2.2 sync.v2.3 wr_fsm.v2.3.1 状态机状态解释 2.4 ram.v 3. 波形展示4. 建议5. 资料总结 前言 首先就不啰嗦iic协议了&#xff0c;网上有不少资料都是叙述此协议的。 下面将是我本次设计的一些局部设计汇总&#xff0c;如果对读者有…...

项目6:基于大数据校园一卡通数据分析和可视化

1、项目简介 本项目是基于大数据的清华校园卡数据分析系统&#xff0c;通过Hadoop&#xff0c;spark等技术处理校园卡交易、卡号和商户信息数据。系统实现消费类别、男女消费差异、学院消费排行和年级对比等分析&#xff0c;并通过Web后端和可视化前端展示结果。项目运行便捷&…...

Linux常见系统日志类型

目录 系统日志&#xff08;/var/log/syslog 或 /var/log/messages&#xff09; 认证日志&#xff08;/var/log/auth.log 或 /var/log/secure&#xff09; Web服务器日志&#xff08;/var/log/apache2/ 或 /var/log/nginx/&#xff09; MySQL日志&#xff08;/var/log/mysql/…...

npm 常用命令大全

npm 常用命令大全 下载包 npm install清理缓存 npm cache clean --force查看当前配置 npm config get registry设置淘宝镜像 npm config set registry https://registry.npmmirror.com查看 npm 版本 npm -vnpm 设置超时时间 npm config set fetch-timeout 600更新依赖 …...

java.io.InvalidClassException

类实现序列问题 如果实现了序列&#xff0c;最好生成序列号&#xff0c;因为类结构发生改变时&#xff0c;会报错 java.io.InvalidClassException 所以实现序列&#xff0c;需要生成序列号 private static final long serialVersionUID 1L;...

Datawhale 组队学习 Ollama教程 task1

一、Ollama 简介 比喻&#xff1a;Ollama 就像是一个“魔法箱子”&#xff0c;里面装满了各种大型语言模型&#xff08;LLM&#xff09;。你不需要懂复杂的魔法咒语&#xff08;配置&#xff09;&#xff0c;只需要轻轻一按&#xff08;一条命令&#xff09;&#xff0c;就能让…...

大模型基本原理(二)——ChatGPT的工作原理

如何得到一个ChatGPT&#xff1f; 1、无监督预训练&#xff1a;通过大量的文本数据集进行无监督训练&#xff0c;得到一个基座模型&#xff08;只会续写文本&#xff09; 2、监督微调&#xff1a;通过一些人类撰写的高质量对话数据对基座模型进行监督微调&#xff0c;得到一个…...

成为高能量体质:从身体神庙到精神圣殿的修炼之路

清晨五点&#xff0c;当城市还在沉睡&#xff0c;瑜伽垫上的汗水已经折射出第一缕阳光。这不是苦行僧的自虐&#xff0c;而是高能量体质者的日常仪式。在这个能量稀缺的时代&#xff0c;如何把自己修炼成一座小型核电站&#xff1f;答案就藏在身体的每个细胞里。 一、能量管理…...

51c自动驾驶~合集50

我自己的原文哦~ https://blog.51cto.com/whaosoft/13280022 #VLA 主流方案全解析 旨在让智能体在物理世界中通过感知、决策和行动来实现目标&#xff0c;而视觉 - 语言 - 动作&#xff08;VLA&#xff09;模型作为其中的关键技术&#xff0c;近年来备受关注。VLA 模型能够…...

测试自动化落地方向

一、视觉回归自动化测试&#xff08;低成本高回报&#xff09; 痛点&#xff1a; UI 频繁迭代导致视觉问题难覆盖 方案&#xff1a; 引入Applitools或SikuliX做视觉比对&#xff08;无需维护元素定位&#xff09; 关键路径截图比对&#xff0c;自动检测 UI 错位/样式问题 亮点…...

论文阅读:MGMAE : Motion Guided Masking for Video Masked Autoencoding

MGMAE:Motion Guided Masking for Video Masked Autoencoding Abstract 掩蔽自编码&#xff08;Masked Autoencoding&#xff09;在自监督视频表示学习中展现了出色的表现。时间冗余导致了VideoMAE中高掩蔽比率和定制的掩蔽策略。本文旨在通过引入运动引导掩蔽策略&#xff0…...

【嵌入式Linux应用开发基础】文件I/O基础编程

目录 一、文件I/O简介 二、文件描述符 2.1. 唯一性 2.2. 抽象性 2.3. 有限性 三、文件操作函数 四、标准文件I/O函数 五、文件执行权限 5.1. 权限类型 5.2. 权限分配对象 5.3. 权限表示方法 5.4. 权限设置命令 5.5. 权限设置的重要性 5.6. 实例说明 六、设备文件…...

Java 反射机制的安全隐患与防范措施:在框架开发与代码审计中的应用

前言 在 Java 编程的广阔领域中&#xff0c;反射机制堪称一把神奇且强大的钥匙&#xff0c;它为开发者打开了通往动态编程的全新大门。借助反射&#xff0c;Java 程序获得了在运行时自我审视和操作的独特能力&#xff0c;极大地增强了代码的灵活性与适应性。 简单来讲&#x…...

【JS】实现一个hexo插件并发布

hexo插件生成 在你的 hexo blog 目录&#xff0c;找到 node_modules. 新建一个文件夹。然后执行 npm init npm 会引导你生成 package.json 这是你的包的描述文件。需要注意的是&#xff0c;所有的 hexo 插件必须以 hexo - 开头&#xff0c;否则 hexo 不会加载。 如果hexo g中没…...

【Java 面试 八股文】MySQL 篇

MySQL 篇 1. MySQL中&#xff0c;如何定位慢查询&#xff1f;2. 那这个SQL语句执行很慢&#xff0c;如何分析呢&#xff1f;3. 了解过索引吗&#xff1f;&#xff08;什么是索引&#xff09;4. 索引的底层数据结构了解过吗&#xff1f;5. B树和B树的区别是什么呢&#xff1f;6.…...

ES6 Proxy 用法总结以及 Object.defineProperty用法区别

Proxy 是 ES6 引入的一种强大的拦截机制&#xff0c;用于定义对象的基本操作&#xff08;如读取、赋值、删除等&#xff09;的自定义行为。相较于 Object.defineProperty&#xff0c;Proxy 提供了更灵活、全面的拦截能力。 1. Proxy 语法 const proxy new Proxy(target, hand…...

vue中使用高德地图自定义掩膜背景结合threejs

技术架构 vue3高德地图2.0threejs 代码步骤 这里我们就用合肥市为主要的地区&#xff0c;将其他地区扣除&#xff0c;首先使用高德的webapi的DistrictSearch功能&#xff0c;使用该功能之前记得检查一下初始化的时候是否添加到plugins中&#xff0c;然后搜索合肥市的行政数据…...

tomcat如何配置保存7天滚动日志

在 Tomcat 中&#xff0c;logging.properties 文件是用于配置 Java 日志框架&#xff08;java.util.logging&#xff09;的。若要实现 catalina.out 日志保存 7 天&#xff0c;且每天的日志文件名带有时间戳&#xff0c;可以按以下步骤进行配置&#xff1a; 1. 备份原配置 在修…...