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

news2025/2/12 14:51:52

在现代容器化应用部署中,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:latest
    container_name: mongodb
    environment:
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=admin123
    volumes:
      - mongodb_data:/data/db
      - mongodb_logs:/var/log/mongodb
      - ./mongod.conf:/etc/mongod.conf
      - ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js
    healthcheck:
      test: ["CMD", "mongo", "--eval", "db.adminCommand('ping')"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - dco-net

volumes:
  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:latest
    container_name: mongodb
    environment:
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=admin123
    volumes:
      - mongodb_data:/data/db
      - mongodb_logs:/var/log/mongodb
      - ./mongod.conf:/etc/mongod.conf
      - ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js
    healthcheck:
      test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - dco-net

  godco:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: godco
    ports:
      - "7000:8080"
    volumes:
      - ./etc:/app/etc
      - ./static:/app/static
    networks:
      - dco-net
    depends_on:
      mongodb:
        condition: service_healthy
    command: ["./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
then
    echo "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 ]; then
    echo "JavaScript script executed successfully."
else
    echo "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数据库,并确保每次部署都有一致且初始化的数据环境。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2296890.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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/

好好说话:深度学习扫盲

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

【愚公系列】《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 和 …

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

在竞争激烈的外贸市场中&#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后端和可视化前端展示结果。项目运行便捷&…

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 模型能够…

论文阅读: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. 实例说明 六、设备文件…

【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.…

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

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

Python----PyQt开发(PyQt高级:图像显示,定时器,进度条)

一、图像显示 1.1、增加图标 1.直接创建setWindowIcon(QIcon(灯泡.jpg)) import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton from PyQt5.QtGui import QIconclass MainWindow(QMainWindow):def __init__(self):super(MainWindow, self).__init_…

Tomcat添加到Windows系统服务中,服务名称带空格

要将Tomcat添加到Windows系统服务中&#xff0c;可以通过Tomcat安装目录中“\bin\service.bat”来完成&#xff0c;如果目录中没有service.bat&#xff0c;则需要使用其它方法。 打到CMD命令行窗口&#xff0c;通过cd命令跳转到Tomcat安装目录的“\bin\”目录&#xff0c;然后执…