Docker 构建MongoDB

MongoDB是一款可扩展性、高性能的开源文档数据库(Document-Oriented),是当今最流行的NoSQL数据库之一。它采用C++开发,支持复杂的数据类型和强大的查询语言,提供了关系型数据库的绝大部分功能。由于其高性能、易部署、易使用等特点,MongoDB已经在很多领域都得到了广泛的应用。

​ MongoDB(源自“humogous”)是一个面向文档的跨平台数据库,避开了传统关系数据库结构,转而使用动态类似于JSON的BSON格式,使其能轻松地将多个数据写在同一类型中。MongoDB以AGPL和Apache License联合协议发布。

1.使用官方镜像

#查看官方镜像
$ docker search --filter=is-official=true  mongo
NAME                DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mongo               MongoDB document databases provide high avai…   7167                [OK]
mongo-express       Web-based MongoDB admin interface, written w…   771                 [OK]

#运行一个容器
$ docker run --name mongo-container -d mongo
Digest: sha256:ebcdb042054d9974c8c3160d761b0bdb39b55115448242de1a5161c124ddb0af

使用docker ps 查看正在运行的mongo-container容器

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
5d745da54c89        mongo               "docker-entrypoint.s…"   6 seconds ago       Up 6 seconds        27017/tcp           mongo-container

在此,mongo-container启动一个bash进程,并通过mongo指令启动mongodbDB交互命令行,再通过db.stats()指令查看数据库状态:

$ docker exec -it 5d sh
# mongo
MongoDB shell version v4.4.1
connecting to: mongodb://127.0.0.1:27017/?
---
> db.stats()
{
	"db" : "test",
	"collections" : 0,
	"views" : 0,
	"objects" : 0,
	"avgObjSize" : 0,
	"dataSize" : 0,
	"storageSize" : 0,
	"totalSize" : 0,
	"indexes" : 0,
	"indexSize" : 0,
	"scaleFactor" : 1,
	"fileSize" : 0,
	"fsUsedSize" : 0,
	"fsTotalSize" : 0,
	"ok" : 1
}

这里可以通过env指令查看环境变量的配置

# su root
root@5d745da54c89:/# cd bin
root@5d745da54c89:/bin# env
HOSTNAME=5d745da54c89
OLDPWD=/
GPG_KEYS=20691EEC35216C63CAF66CE1656408E390CFB1F5
USER=root
PWD=/bin
HOME=/root
GOSU_VERSION=1.12
MONGO_VERSION=4.4.1
MONGO_REPO=repo.mongodb.org
MAIL=/var/mail/root
SHELL=/bin/bash
TERM=xterm
MONGO_PACKAGE=mongodb-org
SHLVL=1
MONGO_MAJOR=4.4
LOGNAME=root
JSYAML_VERSION=3.13.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
_=/usr/bin/env

镜像默认暴露了mongoDB的服务端口:27017,可以通过该端口访问服务。

1).连接mongoDB容器

使用–link参数,连接新建的mong-container容器:

$  docker run -it --link mongo-container:db alpine sh
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
df20fa9351a1: Pull complete 
Digest: sha256:185518070891758909c9f839cf4ca393ee977ac378609f700f60a771a2dfe321
Status: Downloaded newer image for alpine:latest

进入alpine系统容器后,可以使用ping指令测试mong-container容器的连通性:

/ # ping db
PING db (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.059 ms
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.053 ms
64 bytes from 172.17.0.2: seq=2 ttl=64 time=0.047 ms
64 bytes from 172.17.0.2: seq=3 ttl=64 time=0.048 ms
64 bytes from 172.17.0.2: seq=4 ttl=64 time=0.053 ms
64 bytes from 172.17.0.2: seq=5 ttl=64 time=0.063 ms
64 bytes from 172.17.0.2: seq=6 ttl=64 time=0.046 ms
^C
--- db ping statistics ---
7 packets transmitted, 7 packets received, 0% packet loss
round-trip min/avg/max = 0.046/0.052/0.063 ms

2).直接使用mongo cli指令

如果想在宿主机上使用mongoDB,可以在docker[container] run 指令后面加入entrypoint指令,这样就可以非常方便地进入mongo cli了:

[root@c7-45 ~]# docker run -it --link mongo-container:db --entrypoint mongo mongo --host db
MongoDB shell version v4.4.1
connecting to: mongodb://db:27017/?compressors=disabled&gssapiServiceName=mongodb

---

> db.version();
> 4.4.1
> db.stats();
> {
> "db" : "test",
> "collections" : 0,
> "views" : 0,
> "objects" : 0,
> "avgObjSize" : 0,
> "dataSize" : 0,
> "storageSize" : 0,
> "totalSize" : 0,
> "indexes" : 0,
> "indexSize" : 0,
> "scaleFactor" : 1,
> "fileSize" : 0,
> "fsUsedSize" : 0,
> "fsTotalSize" : 0,
> "ok" : 1
> }
> show dbs
> admin   0.000GB
> config  0.000GB
> local   0.000GB

最后,还可以使用 --storageEngine 参数来设置储存引擎:

$ docker run --name mongo-container -d mongo --storageEngine wiredTiger
a51267a41f6ffe9931e7aebda1fa17d54ae86d0022adffa8eda3838ac40b01d5

2.使用自定义Dockerfile

第一步,准备工作。新建项目目录,并在根目录新建Dockerfile,内容如下:

FROM sshd
MAINTAINER https://blog.csdn.net/weixin_46380571
RUN apt-get update && \
    apt-get install -y mongodb pwgen && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

RUN mkdir -p /data/db
VOLUME /data/db
ENV AUTH yes

ADD run.sh /run.sh
ADD set_mongodb_password.sh /set_mongodb_password.sh
RUN chmod 755 ./*.sh

EXPOSE 27017
EXPOSE 28017

CMD ["/run.sh"]

新建set_mongodb_password.sh脚本,此脚本主要负责配置数据库的用户名和密码:

#!/bin/bash
if [ -f /.mongodb_password_set ]; then
	echo "MongoDB passwrod already set!"
	exit 0
fi

/usr/bin/mongod --smallfiles --nojournal &

PASS=${MONGODB_PASS:-$(pwgen -s 12 1)}
_word=$( [ ${MONGODB_PASS} ] && echo "preset" || echo "random" )

RET=1
while [[ RET -ne 0 ]]; do
	echo "=> Wating for confirmation of MongoDB service startup"
        sleep 5
        mongo admin --eval "help" >/dev/null 2>&1
	RET=$?
done
echo "=> Creating an admin user with a ${_word} password in MongoDB"
mongo admin --eval "db.addUser({user: 'admin', pwd: '$PASS',roles: ['userAdminAnyDatabase','dbAdminAnyDatabase']});"
mongo admin --eval "db.shutdownServer();"
echo "=> Done!"
touch /.mongodb_password_set 
echo "============================================================================="
echo "You can now connect to this MongodDB server using:"
echo ""
echo "    mongo admin -u admin -p $PASS --host <host> --port <port>"
echo ""
echo "Please remrmber to change the above password as soon as possible!"
echo "============================================================================="

新建run.sh此脚本是主要的mongoDB启动脚本

#!/bin/bash
if [ ! -f /.mongodb_password_set ]; then
	/set_mongodb_password.sh
fi

if [ "$AUTH" == "yes" ];then
	export mongodb='/usr/bin/mongod --nojournal --auth --httpinterface --rest'
else
	export mongodb='/usr/bin/mongod --nojournal --httpinterface --rest'
fi

if [ ! -f /data/db/mongod.lock ]; then
	eval $mongodb
else
	export mongodb=$mongodb'  --dbpath /data/db'
	rm /data/db/mongod.lock
	mongod --dbpath /data/db --repair && eval $mongodb
fi

第二步:使用docekr build 指令构建镜像:

$ docker build -t mongodb:dockerfile .
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mongodb             dockerfile          25114728e330        2 hours ago         487MB
sshd                latest              06fc6cd9b3f7        2 weeks ago         251MB

第三步,启动容器,并分别映射27017和27018端口到本地

$ docker run -d -p 27017:27017 -p 28017:28017 mongodb:dockerfile

通过docker logs 来查看默认的admin账户密码:

$ docker logs c6
=============================================================================

You can now connect to this MongodDB server using:

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

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

屏幕中出现 U6h8KMbNGVrP 就是admin 用户的密码。

也可以利用环境变量在容器启动时访问指定密码:

$ docker run -d -p 27017:27107 -p 28017:28017 -e MONGODB_PASS="mypass" mongodb:dockerfile
6e05356e6e96ca40cddac7d22ab414b31fe7ea1b4f8252afb9705c18db2dc2ac
$ docker ps
CONTAINER ID        IMAGE                COMMAND             CREATED             STATUS              PORTS                                                                   NAMES
6e05356e6e96        mongodb:dockerfile   "/run.sh"           2 seconds ago       Up 1 second         22/tcp, 27017/tcp, 0.0.0.0:28017->28017/tcp, 0.0.0.0:27017->27107/tcp   beautiful_chatelet

甚至,设定不需要密码即可访问:

$ docker run -d -p 27017:27107 -p 28017:28017 -e AUTH=no mongodb:dockerfile
312fc71d5758c504d969f072bc2f059e1f7fe7df1b4feb56d04c586e058ee6a0
$ docker ps
CONTAINER ID        IMAGE                COMMAND             CREATED             STATUS              PORTS                                                                   NAMES
312fc71d5758        mongodb:dockerfile   "/run.sh"           4 seconds ago       Up 3 seconds        22/tcp, 27017/tcp, 0.0.0.0:28017->28017/tcp, 0.0.0.0:27017->27107/tcp   ecstatic_darwin

以上我启动的容器 查看日志会发现一个错误:

Error parsing command line: unrecognised option '--httpinterface'

查了一下https://codebug.vip/questions-1764286.htm

原来是

MongoDB 3.6删除了MongoDB弃用的HTTP接口和REST API

降级到3.4(直到2020年1月仍受支持)或用户第三方工具,例如https://docs.mongodb.com/ecosystem/tools/http-interfaces/中列出的工具

因为现在没有使用到mongodb 所以我就不做深研究。未完待续

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云原生解决方案

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值