Docker数据库应用 --MongoDB

25 篇文章 0 订阅

MongoDB

MongoDB 是一款可扩展、高性能的开源文档数据库(Document-Oriented),是当今最流行的NoSQL数据库之一。它采用C++开发,支持复杂的数据类型和强大的查询语言,提供了关系数据库的绝大部分功能。由于其高性能、易部署、易使用等特点,MongoDB得到了广泛的应用。
MongoDB (源自“humogous”)是一个面向文档的跨平台数据库,避开了传统关系型数据库结构,转而使用动态类似于JSON 的BSON格式,使其能轻松的将多个数据写在同一类型中。MongoDB以AGPL 和 Apache License 联合协议发布。

1 使用官方镜像

用户可以使用docker run指令直接运行官方mongoDB镜像:

$ docker run --name mymongo -d mongo
$ docker ps
$ docker exec -it mymongo sh
# 通过mongo指令启动mongodbDB交互命令行
# mongo
-> show dbs
# 通过db.stats() 指令查看数据库状态
-> db.stats()
# 通过 env 指令查看环境变量的配置
/ #  env

1.1 连接mongoDB 容器

使用 --link 参数,连接新建的mymongo 容器,进入容器后,使用ping指令测试mymongo 容器的连通性

$ docker run --name mongo-link-mycontainer -it --link mymongo:db alpine sh
/ # ls
/ # ping db

1.2 直接使用 mongo cli指令

如果想直接在宿主机上使用mongoDB,可以在docker run 指令后加入 entrypoint指令,这样就可以直接进入mongo cli了:

$ docker run -it --link mymongo:db --entrypoint mongo mongo --host db
> db.version();
> db.stats();
> show dbs

还可以使用–storageEngine 参数来设置存储引擎:

$ docker run --name mymongodb -d mongo --storageEngine wiredTiger

2 使用自定义Dockerfile

2.1 准备工作

2.1.1 新建工作目录mongodb,并在目录下创建Dockerfile
$ mkdir ~/mongodb && cd ~/mongodb
$ touch Dockerfile

Dockerfile 内容如下:

# 设置从之前创建的ssh 镜像集成
FROM myubuntu:myssh
MAINTAINER kevin <kevin@163.com>
RUN apt-get update && \
    apt-get install -y mongodb pwgen && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# 创建mongoDB 存放数据文件的文件夹
RUN mkdir -p /data/db
VOLUME /data/db

# 启用mongodb 数据库登录身份验证
ENV AUTH yes

# 添加脚本
COPY start-mongodb.sh /start-mongodb.sh
COPY set_mongodb_password.sh /set_mongodb_password.sh
RUN chmod 755 /*.sh

EXPOSE 27017

CMD ["/start-mongodb.sh"]
2.1.2 创建set_mongodb_password.sh脚本,此脚本负责配置数据库的用户名和密码
#!/bin/bash
# 脚本用来设置数据库的用户名和密码

# 判断是否已经设置过密码
if [ -f /.mongodb_password_set ]; then
    echo "MongoDB password already set!"
    exit 0
fi

/usr/bin/mongod --nojournal &

# ${varname:-word},如果varname存在且非null,则返回其值;否则,返回word。用途:如果变量未定义,则返回默认值。可参考https://blog.csdn.net/flowingflying/article/details/5047415
:'
pwgen生成的密码易于记忆且相当安全。从技术上来说,容易记忆的密码不会比随机生成的密码更加安全。但是,在大多数情况下,pwgen生成的密码已经足够安全,除了网银密码等需要高安全等级的情况外。使用易于记忆的密码的好处就是你不会把这些密码写下来或者存到电脑上的某个地方,这样做本来就是不安全的。
安装:
apt-get install pwgen 
语法:
pwgen [ OPTION ] [ pw_length ] [ num_pw ]
参数: 
-c or –capitalize 
密码中至少包含一个大写字母

-A or –no-capitalize 
密码中不包含大写字母

-n or –numerals 
密码中至少包含一个数字

-0 or –no-numerals 
密码中不包含数字

-y or –symbols 
密码中至少包含一个特殊符号

-s or –secure 
生成完全随机密码

-B or –ambiguous 
密码中不包含歧义字符(例如1,l,O,0)

-H or –sha1=path/to/file[#seed] 
使用SHA1 hash给定的文件作为一个随机种子

-C 
在列中打印生成的密码

-1 
不要在列中打印生成的密码,即一行一个密码

-v or –no-vowels 
不要使用任何元音,以避免偶然的脏话

例子:
生成长度8,含有数字,含有大小写字母的密码**4**个,**列**打印
pwgen -ncC 8 4
IGhoo0Oh Thex7AeS Ir9xaera Ahngi6Ee

生成长度8,含有数字,含有小写字母,不包含歧义的密码4个,列打印
pwgen -nABC 8 4
yaew4aph roof3sho ooyoo3oh soo9coah
  
生成长度16,含有数字,含有大小写字母,含有特殊字符的密码8个,**行**打印
pwgen -ncy1 16 8
egh5iehoo7Keiqu/
ooC8quaiteof+een
Uyieithobu^u1Ap9
yuqu=oQuoFie6Gof
shi9ohS<eid9phae
ahquai*gah6quaiF
ohSh*iqueeL4il6o
rai7oeij-ah1Deis
'
PASS=${MONGODB_PASS:-$(pwgen -s 12 1)}
_word=$( [ ${MONGODB_PASS} ] && echo "preset" || echo "random" )

RET=1
        # 批量注释
        :<<MULTILINECOMMENT
			...注释的内容
			...注释的内容
			其中,MULTILINECOMMENT可以随意命名,只要别跟中间的注释内容混淆即可。
			shell一旦遇到:<<MULTILINECOMMENT,就不执行脚本了,一直到再碰到MULTILINECOMMENT后重新开始执行脚本
			如果忘记写MULTILINECOMMENT或者写错(由于已经不执行脚本了,所以即使写错也不会报错),则:<<MULTILINECOMMENT之后的脚步将都不会执行。
		MULTILINECOMMENT
		:<<! 
			-eq //等于;
			-ne //不等于; 
			-gt //大于(greater ); 
			-lt //小于(less); 
			-ge //大于等于; 
			-le //小于等于
			
[[ ]]是 Shell 内置关键字,它和 test 命令类似,也用来检测某个条件是否成立。
test 能做到的,[[ ]] 也能做到,而且 [[ ]] 做的更好;test 做不到的,[[ ]] 还能做到。可以认为 [[ ]]test 的升级版,对细节进行了优化,并且扩展了一些功能。
[[ ]] 的用法为:
[[ expression ]][[ ]] 判断 expression 成立时,退出状态为 0,否则为非 0 值。注意[[ ]]和expression之间的空格,这两个空格是必须的,否则会导致语法错误。
		!
# 判断服务是否成功启动
while [[ RET -ne 0 ]]; do
    echo "=> Waiting for confirmation of MongoDB service startup"
    sleep 5
    # --eval arg    evaluate javascript,即登录mongoshell后操作的指令
    mongo admin --eval "help" > /dev/null 2>&1
    # $? 是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值。所谓退出状态,就是上一个命令执行后的返回结果。退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1,这和C语言的 main() 函数是类似的。
    RET=$?
done

# 通过docker logs + id 可以看到下面的输出
# echo "=> Createing an admin user with a ${_word} password in MongoDB"
# 设置mongo 数据库用户密码,并分配权限
mongo admin --eval "db.addUser({user: 'admin', pwd: '$PASS', roles: [ 'userAdminAnyDatabase', 'dbAdminAnyDatabase' ]});"

# 关闭mongo数据库
mongo admin --eval "db.shutdownServer();"

echo "=>Done!"
touch /.mongodb_password_set

echo "========================================================================="
echo "You can now connect to this MongoDB server using:"
echo ""
echo "       mongo admin -u admin -p $PASS --host <host> --port <port>  "
echo ""
echo "Please remember to change the above password as soon as possible!"
echo "========================================================================="
2.1.3 新建start-mongo.sh脚本,此脚本是主要的mongoDB启动脚本
#!/bin/bash
# 判读是否建立mongo用户密码,如果未创建,则执行创建脚本
if [ ! -f /.mongodb_password_set ]; then
    /set_mongodb_password.sh
fi

# 判断是否设置密码登录环境变量,如果设置,则设置密码登录的mongo启动环境变量,否则配置正常启动环境变量
if [ "${AUTH}" == "yes" ]; then
    # 可以自定义MongoDB的启动参数,并注意不同版本的mongo对启动参数的取舍。
    export mongodb='/usr/bin/mongod --nojournal --auth'
else
    export mongodb='/ust/bin/mongod --nojournal'
fi

# 判断是否存在mongo的lock文件,如果不存在,则直接执行启动mongo的命令,否则删除该文件,再执行启动命令
if [ ! -f /data/db/mongod.lock ]; then
    eval $mongodb
else
    export mongodb=$mongodb' --dbpath /data/db'
    rm -f /data/db/mongod.lock
    # 使用repair修复mongodb非正常关闭导致的问题,再执行启动mongo服务,参考http://blog.itpub.net/26995414/viewspace-733012/
    mongod --dbpath /data/db --repair && eval $mongodb
fi

2.2 构建镜像

$ docker build -t mymongo .

2.3 启动容器

$ docker run --name my-mongo -d -p 27017:27017 mymongo
# 使用docker logs 查看默认的admin账号密码
$ docker logs my-mongo
=====================================================================
You can now connet to this MongoDB server using:

    mongo admin -u admin -p S3npuUdRSFNV --host <host> --port <port>

Please remember to change the above password as soon as possible!
=====================================================================

屏幕输出的 S3npuUdRSFNV 就是admin的密码,也可以使用环境变量在容器启动时指定密码

$ docker run -d -p 27017:27017 -e MONGODB_PASS="mypass" mymongo

甚至可以不需要设置密码

$ docekr run -d -p 27017:27017 -e AUTH=no mymongo

3 mongoDB 的启动参数

由于mongodb 不同版本的启动参数有相应的取舍,具体需按照实际使用的版本进行参数选择,以下列举了mongo 3.2.6 版本的启动参数:

参数作用
–quiet安静输出,去除多余输入内容
–port arg指定服务端口号,默认端口27017
–bind_ip arg绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定默认本地所有IP
–logpath arg指定mongodb日志文件,注意是指定文件不是目录
–logappend使用追加的方式写日志
–pidfilepath argPID File 的完整路径,如果没有设置,则没有PID文件
–keyFile arg集群的私钥的完整路径,只对于Replica Set 架构有效
–unixSocketPrefix argUnix域套接字替代目录(默认 /tmp)
–fork以守护进程的方式运行MongoDB,创建服务器进程
–auth启用验证
–cpu指定显示CPU的利用率和iowait
–dbpath arg指定数据库路径
–diaglog argdiaglog 选项:0=off,1=W,2=R,3=both,7=W+some reads
–directoryperdb设置每个数据库将被保存在一个单独的目录
–journal启用日志选项,MongoDB的数据操作将会写入到journal 文件夹的文件里
–journalOptions arg启用日志诊断选项
–ipv6启用ipv6选项
–jsonp允许jsonp形式通过HTTP 访问(有安全影响)
–maxConns arg最大同时连接数,默认2000
–noauth不启用验证
–nohttpinterface关闭HTTP接口,默认关闭27018端口访问
–noprealloc禁用数据文件预分配(往往影响性能)
–noscripting禁用脚本引擎
–notablescan不允许表扫描
–nounixsocket禁用unix套接字监听
–nssize arg (=16)设置信数据库.ns文件大小(MB)
–objcheck在收到客户数据,检查有效性
–profile arg档案参数:0=off, 1=slow, 2=all
–quota限制每个数据库的文件数,设置默认为8
–quotaFiles arg限制单个数据库允许的文件
–rest开启简单的Rest API
–repair修复所有数据库,如 run repair on all dbs
–repairpath arg修复生成的文件目录,默认为目录dbpath
–slowms arg (=100)profile和日志输出延迟
–smallfiles使用较小的默认文件
–syncdelay arg (=60)数据写入磁盘的时间秒数(0=never,不推荐)
–sysinfo打印一些诊断系统信息
–upgrade升级数据库,* Replication 参数
–fastsync从一个dbpath 里启用从库复制服务,该dbpath的数据库是主库的快照,可用于快速启用同步
–autoresync如果从库与主库同步数据差的多,自动重新同步
–oplogSize arg设置oplog 的大小(MB),* 主/从参数
–maser主库模式
–slave从库模式
–source arg从库端口号
–only arg指定单一的数据库复制
–slavedelay arg设置从库同步主库的延迟时间,* Replica set(副本集)选项
–replSet arg设置副本集名称,* Sharding(分片)选项
–configsvr声明这是一个集群的config服务,默认端口27019,默认目录/data/configdb
–shardsvr声明这是一个集群的分片,默认端口27018
–noMoveParanoia关闭偏执为moveChunk数据保存

上述参数可以直接在mongod.conf 配置文件中配置(高版本已使用yml文件进行配置),例如:
dbpath = /data/mongodb
logpath = /data/mongodb/mongodb.log
logappend = true
port = 27017
fork = true
auth = true

4 相关资源

MongoDB 相关资源如下:
MongoDB 官网:https://www.mongodb.org
MongoDB 官方镜像: https://hub.docker.com/_/mongo/
MongoDB 官方镜像实现:https://github.com/docker-library/mongo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我理解了你的问题。 首先,我需要确认一下你的操作系统是否已经安装了 DockerDocker Compose 工具。如果还没有安装,请先安装这两个工具。 接下来,我们可以通过以下步骤来实现你的要求: 1. 创建一个 Dockerfile 文件,用于构建我们的镜像。在这个文件中,我们需要指定基础镜像、安装所需的动态语言环境以及连接数据库的驱动程序。以下是一个示例: ```dockerfile # 指定基础镜像 FROM php:7.4-apache # 安装所需的 PHP 扩展和库 RUN docker-php-ext-install pdo_mysql mysqli # 安装 MySQL 驱动程序 RUN apt-get update && apt-get install -y libmysqlclient-dev RUN docker-php-ext-install pdo_mysql # 将 Web 应用程序复制到容器中 COPY ./src /var/www/html/ # 暴露端口 EXPOSE 80 ``` 2. 在当前目录下创建一个 docker-compose.yaml 文件,用于定义我们的应用程序和数据库的服务。以下是一个示例: ```yaml version: '3' services: web: build: . ports: - "80:80" depends_on: - db db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: example MYSQL_DATABASE: test MYSQL_USER: test MYSQL_PASSWORD: test volumes: - db_data:/var/lib/mysql volumes: db_data: ``` 在这个文件中,我们定义了两个服务:web 和 db。web 服务使用上面创建的 Dockerfile 文件构建镜像,并将容器内的 80 端口映射到宿主机的 80 端口。db 服务使用 MySQL 官方镜像,并设置了一些环境变量和数据卷。 3. 在当前目录下创建一个 src 目录,用于存放我们的 Web 应用程序代码。以下是一个示例: ```php <?php $host = 'db'; $user = 'test'; $password = 'test'; $dbname = 'test'; // 创建数据库连接 $conn = new mysqli($host, $user, $password, $dbname); // 检查连接是否成功 if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // 查询数据 $sql = "SELECT * FROM users"; $result = $conn->query($sql); // 显示数据 if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { echo "id: " . $row["id"]. " - Name: " . $row["name"]. "<br>"; } } else { echo "0 results"; } // 关闭数据库连接 $conn->close(); ?> ``` 在这个文件中,我们创建了一个数据库连接,查询了 users 表中的数据,并将数据显示在 Web 页面上。 4. 执行以下命令启动应用程序和数据库的服务: ```bash docker-compose up -d ``` 5. 打开浏览器,访问 http://localhost,应该可以看到从数据库中读取的数据已经显示在页面上了。 以上就是利用 DockerDocker Compose 工具搭建动态语言运行环境并连接数据库的基本步骤。你可以根据自己的需求修改 Dockerfile 和 docker-compose.yaml 文件,以适应不同的应用程序和数据库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值