系统版本:- Docker version 20.10.7, build f0df350
- docker-compose version 1.29.2, build 5becea4c
复制代码 1.docker-compose文件和start.sh
环境变量:Linux下必须export声明两个环境变量,注意这个账户同时也是创建的数据库的连接用户密码- export MONGO_INITDB_ROOT_USERNAME=<用户名>
- export MONGO_INITDB_ROOT_PASSWORD=<密码>
复制代码 目录:/home/user/docker-compose.yml
镜像:mongo:6.0.10
容器名:mongobss
挂载卷:data/db数据目录 start.sh后创建用户和库的脚本
环境变量:定义初始的mongo root角色用户
privileged:给予容器高权限- version: '3'
- services:
- mongodb:
- image: mongo:6.0.10
- container_name: mongobss
- ports:
- - 27017:27017
- privileged: true
- volumes:
- - "./data/db:data/db"
- - "./start.sh:/docker-entrypoint-initdb.d/start.sh" #这里是关键点涉及到mongo官方打包镜像时定义的sh启动文件在3中讲解
- environment:
- - MONGO_INITDB_ROOT_USERNAME=${MONGO_INITDB_ROOT_USERNAME}
- - MONGO_INITDB_ROOT_PASSWORD=${MONGO_INITDB_ROOT_PASSWORD}
- tty: true
复制代码
目录:/home/user/start.sh
set -e:遇到错误shell不退出
mongosh:mongo高版本的命令行工具替代了原有的mongo,该脚本使用mongosh创建了初始的用户和库- #!/bin/bash
- set -e
- echo "Creating database: <库名>"
- mongosh --username ${MONGO_INITDB_ROOT_USERNAME} --password ${MONGO_INITDB_ROOT_PASSWORD} <<EOF
- use admin
- use <库名>
- db.createUser({
- user: "${MONGO_INITDB_ROOT_USERNAME}",
- pwd: "${MONGO_INITDB_ROOT_PASSWORD}",
- roles: [{ role: "readWrite", db: "<库名>" }]
- })
- EOF
复制代码 该脚本一共420行大多部分都是启动mongo进程的准备,主要关注的是最后几行,for循环读取/docker-entrypoint-initdb.d/ 该文件下的.sh .js格式脚本去执行,如果按照常规方法使用docker-compose的command字段会替换掉ENTRYPOINT 指定的启动文件也就无法启动mongo进程,但是采用 1 中volume挂载方式将脚本放入for指定的目录下,就会自动执行。- cd /home/user
- export 用户变量
- export 密码变量
- //能联网
- docker pull mongo:6.0.10
- //内网环境
- //需要mongo 6.0.10的镜像tar, 一半网上找不到,可以在vmware中pull一个下来执行 docker save -o mongo.tar <镜像ID> 可以保存为tar包再上传到内网服务器
- docker load -i mongo.tar
- docker-compose up -d <br>//查看容器运行状态,测试中初始化的时长大概在40秒左右完成脚本执行,其他服务才能连上mongo,如果有其他服务连接mongo建议发起一个sleep等待这个时间<br>docker ps <br>dcoker logs -f monogobss<br>//成功的日志输出
复制代码 4.外部程序使用mongo:
java -jar启动jar包为例:
假设你的配置文件引用的是环境变量,要注意因为mongo容器启动时间较长我们主程序要等待mongo容器初始化完成在发起链接请求mongo,可以在服务的启动文件sleep 45秒左右- https://github.com/docker-library/mongo/blob/master/docker-entrypoint.sh
复制代码 - b70ce161a9f4 mongo:6.0.10 <strong>"docker-entrypoint.s…"</strong> 2 hours ago Up 2 hours 0.0.0.0:27017->27017/tcp, :::27017->27017/tcp mongobss
复制代码- export MONGO_INITDB_DATABASE="${MONGO_INITDB_DATABASE:-test}"
- echo
- for f in /docker-entrypoint-initdb.d/*; do
- case "$f" in
- *.sh) echo "$0: running $f"; . "$f" ;;
- *.js) echo "$0: running $f"; "${mongo[@]}" "$MONGO_INITDB_DATABASE" "$f"; echo ;;
- *) echo "$0: ignoring $f" ;;
- esac
- echo
- done
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |