MongoDB Docker 镜像制作与部署指南

1. Dockerfile 文件制作

创建无后缀的 Dockerfile 文件:

dockerfile 复制代码
# Dockerfile文件格式
# This dockerfile uses the mongo:7.0.25 image
# VERSION 1 - EDITION 1
# Author: cxnb
# Command format: Instruction [arguments / command] ..

# 1、第一行必须指定基础镜像信息
FROM mongo:7.0.25

# 2、维护者信息
MAINTAINER cxnb

# 3、替换配置文件为自己的配置文件
# COPY ./mongod.conf /etc/mongod.conf

# 4、复制创建cxnb数据库脚本到指定目录
COPY ./init-db.sh /docker-entrypoint-initdb.d/
RUN chmod +x /docker-entrypoint-initdb.d/init-db.sh

# 5、指定用户名密码
ENV MONGO_INITDB_ROOT_USERNAME=admin
ENV MONGO_INITDB_ROOT_PASSWORD=admin123

# 6、标记容器挂载目录
VOLUME /data/db
VOLUME /var/log/mongodb/mongod.log

# 7、标记对外公布的端口
EXPOSE 27017

# 8、设定时区,如果不设定时区,容器时间和主机时间会不一致。
ENV TZ=Asia/Shanghai

# 9、进入容器后自动运行的命令。
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

2. MongoDB 配置文件

创建 mongod.conf 文件:

yaml 复制代码
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
  dbPath: /data/db
  journal:
    enabled: true
  # engine:
  # mmapv1:
  wiredTiger:
    engineConfig:
      cacheSizeGB: 2

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0

# how the process runs
processManagement:
  timeZoneInfo: /usr/share/zoneinfo

security:
  authorization: enabled

#operationProfiling:
#replication:
#sharding:

## Enterprise-Only Options:
#auditLog:
#snmp:

3. 数据库初始化脚本

创建 init-db.sh 脚本:

bash 复制代码
#!/bin/bash

# 连接到 MongoDB 服务器
# 如果是4.0版本,则用mongo
# 如果先用mongo命令配置,容器启动生成了mongodb的/data/db文件,则换成mongosh配置时,需要先删除db文件夹中的内容。

mongosh <<EOF
use admin
db.auth('admin', 'admin123')
use cxnb
db.createUser({ 
  user: 'admin', 
  pwd: 'admin123', 
  roles: [{ 
    role: 'readWrite', 
    db: 'cxnb' 
  }] 
})
EOF

重要提示:确保脚本具有执行权限:

bash 复制代码
chmod +x init-db.sh

4. 文件组织

将以下文件放置在宿主机的同一目录中:

  • dockerfile (无后缀)
  • mongod.conf
  • init-db.sh

目录结构示例:

复制代码
/mongodb-docker/
├── dockerfile
├── mongod.conf
└── init-db.sh

5. 构建 Docker 镜像

bash 复制代码
docker build -t mongodb:7.0.25 . -f dockerfile

注意 :命令末尾的 . 表示使用当前目录作为构建上下文,不能省略。

6. 创建并运行容器

6.1 准备宿主机目录

bash 复制代码
# 创建数据目录
mkdir -p /mnt/mongodb/data && chmod 777 /mnt/mongodb/data

# 创建日志目录
mkdir -p /mnt/mongodb/logs && chmod 777 /mnt/mongodb/logs

# 创建配置目录
mkdir -p /mnt/mongodb/conf && chmod 777 /mnt/mongodb/conf

# 复制配置文件
cp ./mongod.conf /mnt/mongodb/conf/mongod.conf

6.2 运行容器

bash 复制代码
docker run \
  --privileged=true \
  --name mongodb \
  -p 27017:27017 \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=admin123 \
  -v /mnt/mongodb/data:/data/db \
  -v /mnt/mongodb/logs:/var/log/mongodb \
  -v /mnt/mongodb/conf/mongod.conf:/etc/mongod.conf \
  -v /etc/localtime:/etc/localtime \
  -d \
  mongodb:7.0.25 --auth

可选参数

  • 添加 --restart=always 使容器自动重启
  • 添加 --network custom-network 指定自定义网络

6.3 验证容器状态

bash 复制代码
# 检查容器运行状态
docker ps -a | grep mongodb

# 查看容器日志
docker logs mongodb

# 进入容器
docker exec -it mongodb mongosh -u admin -p admin123

7. 镜像导出与导入

7.1 导出镜像

bash 复制代码
# 导出镜像为tar文件
docker save mongodb:7.0.25 -o /opt/docker/images/mongodb_7.0.25.tar

7.2 压缩镜像

bash 复制代码
cd /opt/docker/images
gzip mongodb_7.0.25.tar

7.3 导入镜像

bash 复制代码
# 方法一:直接导入压缩文件
docker load -i /opt/docker/images/mongodb_7.0.25.tar.gz

# 方法二:先解压再导入
gunzip mongodb_7.0.25.tar.gz
docker load -i mongodb_7.0.25.tar

8. 扩展功能

8.1 数据库备份与恢复

bash 复制代码
# 备份数据库
docker exec mongodb mongodump -u admin -p admin123 --authenticationDatabase admin -o /backup/
docker cp mongodb:/backup/ ./local_backup/

# 恢复数据库
docker cp ./local_backup/ mongodb:/restore/
docker exec mongodb mongorestore -u admin -p admin123 --authenticationDatabase admin /restore/

8.2 使用 Docker Compose

创建 docker-compose.yml 文件:

yaml 复制代码
version: '3.8'

services:
  mongodb:
    build:
      context: .
      dockerfile: dockerfile
    container_name: mongodb
    ports:
      - "27017:27017"
    environment:
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=admin123
    volumes:
      - /mnt/mongodb/data:/data/db
      - /mnt/mongodb/logs:/var/log/mongodb
      - /mnt/mongodb/conf/mongod.conf:/etc/mongod.conf
      - /etc/localtime:/etc/localtime
    restart: unless-stopped
    command: ["--auth"]

启动服务:

bash 复制代码
docker-compose up -d

9. 安全建议

  1. 修改默认密码:生产环境中务必使用强密码替换默认密码
  2. 网络隔离:将 MongoDB 容器放置在内部网络中,避免直接暴露到公网
  3. 定期更新:定期更新基础镜像以获取安全补丁
  4. 备份策略:建立定期备份机制
  5. 访问控制:限制只有必要的主机可以访问 MongoDB 端口

10. 故障排除

常见问题:

  1. 权限错误:确保宿主机目录具有适当权限
  2. 配置文件错误:检查 YAML 格式和缩进
  3. 端口冲突:确保 27017 端口未被占用
  4. 初始化失败:检查 init-db.sh 脚本格式和权限

调试命令:

bash 复制代码
# 查看容器日志
docker logs mongodb

# 进入容器检查文件
docker exec -it mongodb bash

# 检查 MongoDB 服务状态
docker exec mongodb mongosh --eval "db.adminCommand('serverStatus')"

通过以上步骤,您可以成功创建、部署和管理基于 Docker 的 MongoDB 实例。

相关推荐
SPC的存折2 小时前
openEuler 24.03 MariaDB Galera 集群部署指南(cz)
linux·运维·服务器·数据库·mysql
仲芒2 小时前
[24年单独笔记] MySQL 常用的 DML 命令
数据库·笔记·mysql
SPC的存折2 小时前
MySQL 8.0 分库分表
linux·运维·服务器·数据库·mysql
蓦然乍醒3 小时前
使用 DBeaver 还原 PostgreSQL 备份文件 (.bak) 技术文档
数据库·postgresql
XDHCOM3 小时前
Redis节点故障自动恢复机制详解,如何快速抢救故障节点,确保数据不丢失?
java·数据库·redis
QCzblack3 小时前
BugKu BUUCTF ——Reverse
java·前端·数据库
cyber_两只龙宝3 小时前
【Oracle】Oracle之DQL中WHERE限制条件查询
linux·运维·数据库·云原生·oracle
luis的妙妙屋3 小时前
主流数据库数据类型对比分析
数据库
XDHCOM3 小时前
ORA-00054资源忙故障修复,远程处理Oracle报错解决方案,数据库锁超时NOWAIT指定问题排查
数据库·oracle
q21030633723 小时前
初学Access(具体示例)
数据库