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数据库,并确保每次部署都有一致且初始化的数据环境。

相关推荐
AnnyYoung44 分钟前
普通用户授权docker使用权限
linux·docker·centos
yuanpan1 小时前
SQLite数据库中查询性能优化及索引创建的原则总结
数据库·性能优化·sqlite
一张假钞1 小时前
Python3连接MongoDB并写入数据
数据库·python·mongodb
lu9up2 小时前
Oracle常用导元数据方法
数据库·oracle
A XMan.2 小时前
DeepSeek AI R1推理大模型API集成文档
数据库
lhw---99992 小时前
C语言基本概念————讨论sqrt()和pow()函数与整数的关系
c语言·数据库·mysql
奔跑吧邓邓子2 小时前
【Python深入浅出㉙】Python3邂逅MySQL:开启数据交互之旅
数据库·python·mysql·交互
文牧之4 小时前
MySQL的字符集(Character Set)和排序规则(Collation)
运维·数据库·mysql
胡晔可可4 小时前
数据库中存储时候将字段为空串时转换成null
java·数据库