在现代容器化应用部署中,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的优势
- 与现有的基于docker-compose.yml文件的工作流程兼容,方便那些已经熟悉Docker Compose的用户过渡到Podman环境。
- 利用Podman的特性,如无守护进程运行容器,提高了容器的安全性和资源利用效率。
Podman Compose常用命令
-
启动服务
- 命令:podman-compose -f 'docker-compose.yml' up -d
- 功能:以守护进程模式(-d选项)启动在docker-compose.yml文件中定义的所有服务。这类似于Docker Compose中的up -d命令。
-
停止并移除服务
- 命令:podman-compose -f 'docker-compose.yml' down
- 功能:停止正在运行的服务,并移除相关的容器、网络(如果是由Podman Compose创建的)和卷(如果是由Podman Compose创建且没有设置为外部卷)。这与Docker Compose中的down命令功能类似。
-
查看服务状态
- 命令:podman-compose -f 'docker-compose.yml' ps
- 功能:列出在docker-compose.yml文件中定义的所有服务的容器状态,包括容器名称、镜像、状态等信息。
-
查看日志
- 命令: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 系统
- 安装 Podman:
bash
sudo apt-get update
sudo apt-get install -y podman podman-compose
- 验证 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_data
和mongodb_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');
(二)使用步骤
- 创建
init-mongo.js
文件:将上述脚本保存为init-mongo.js并放置在项目目录中。 - 挂载文件:确保在docker-compose.yml文件中将
init-mongo.js
挂载到/docker-entrypoint-initdb.d/
目录。 - 启动服务:运行
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
#
![](https://i-blog.csdnimg.cn/direct/45d236e91258454bbb997c9043717b7f.png)
如果想在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数据库,并确保每次部署都有一致且初始化的数据环境。