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:
bash 复制代码
  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:
bash 复制代码
sudo apt-get update
sudo apt-get install -y podman podman-compose
  1. 验证 Podman 和 Podman Compose 是否安装成功:
bash 复制代码
podman --version
podman-compose --version

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

bash 复制代码
podman version 3.4.4
podman-compose version 1.0.3

使用Podman Compose配置MongoDB

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

yaml 复制代码
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

javascript 复制代码
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使用示例:

bash 复制代码
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:

bash 复制代码
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");

使用命令:

bash 复制代码
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容器查看。

bash 复制代码
 #进入容器
 podman-compose exec mongodb /bin/bash

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

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

bash 复制代码
#!/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数据库,并确保每次部署都有一致且初始化的数据环境。

相关推荐
-dcr18 分钟前
21.mariadb 数据库
数据库·云计算·运维开发·mariadb
荒村瘦马23 分钟前
MySQL中SELECT 语句如何 INTO OUTFILE 保存数据到文件
数据库·mysql·导出文件·into outfile
Script kid32 分钟前
Pytest框架速成
数据库·pytest
小Lu的开源日常1 小时前
如何使用 GitHub Action 发布 Docker 镜像
docker·开源·github
hans汉斯1 小时前
【人工智能与机器人研究】一种库坝系统水下成像探查有缆机器人系统设计模式
大数据·数据库·论文阅读·人工智能·设计模式·机器人·论文笔记
June`1 小时前
Redis:高性能内存数据库的六大核心优势
数据库·redis·缓存
IvorySQL1 小时前
PostgreSQL的逻辑复制spill溢出案例和启停库逻辑
数据库·postgresql
神秘人X7071 小时前
docker安装
docker·容器·eureka
安审若无2 小时前
PMON failed to acquire latch 的报错及sqlplus / as sysdba 无法连接
linux·运维·数据库
失因2 小时前
Docker 容器与镜像
java·运维·spring cloud·docker·容器