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 所以我就不做深研究。未完待续