12.2 MongoDB

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

12.2 MongoDB - 图1

12.2.1 使用官方镜像

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


  1. $ docker run --name mongo-container -d mongo
  2. ade2b5036f457a6a2e7574fd68cf7a3298936f27280833769e93392015512735

之后,可以通过docker ps指令查看正在运行的mongo-container容器的容器ID:


  1. $ docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
  3. NAMES
  4. ade2b5036f45 mongo "/entrypoint.sh mongo" 1 hours ago Up 22 hours 27017/tcp
  5. mongo-container

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


  1. $ docker exec -it ade2b5036f45 sh
  2. # mongo
  3. MongoDB shell version: 3.2.6
  4. connecting to: test
  5. > show dbs
  6. local 0.000GB
  7. > db.stats()
  8. {
  9. "db" : "test",
  10. "collections" : 1,
  11. "objects" : 1,
  12. "avgObjSize" : 39,
  13. "dataSize" : 39,
  14. "storageSize" : 16384,
  15. "numExtents" : 0,
  16. "indexes" : 1,
  17. "indexSize" : 16384,
  18. "ok" : 1
  19. }

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


  1. root@ade2b5036f45:/bin# env
  2. HOSTNAME=ade2b5036f45
  3. MONGO_VERSION=3.2.6
  4. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  5. GPG_KEYS=DFFA3DCF326E302C4787673A01C4E7FAAAB2461C 42F3E95A2C4F08279C4960ADD
  6. 68FA50FEA312927
  7. PWD=/bin
  8. SHLVL=1
  9. HOME=/root
  10. MONGO_MAJOR=3.2
  11. GOSU_VERSION=1.7
  12. _=/usr/bin/env
  13. OLDPWD=/

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

1.连接mongodb容器

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


  1. $ docker run -it --link mongo-container:db alpine sh
  2. / # ls

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


  1. / # ping db
  2. PING db (172.17.0.5): 56 data bytes
  3. 64 bytes from 172.17.0.5: seq=0 ttl=64 time=0.093 ms
  4. 64 bytes from 172.17.0.5: seq=1 ttl=64 time=0.104 ms
  5. ^C
  6. --- db ping statistics ---
  7. 2 packets transmitted, 2 packets received, 0% packet loss
  8. round-trip min/avg/max = 0.093/0.098/0.104 ms

2.直接使用mongo cli指令

如果想直接在宿主机器上使用mongodb镜像,可以在docker run指令后面加入entrypoint指令,这样就可以非常方便的直接进入mongo cli了。


  1. $ docker run -it --link mongo-container:db --entrypoint mongo mongo --host db
  2. > db.version();
  3. 3.2.6
  4. > db.stats();
  5. {
  6. "db" : "test",
  7. "collections" : 0,
  8. "objects" : 0,
  9. "avgObjSize" : 0,
  10. "dataSize" : 0,
  11. "storageSize" : 0,
  12. "numExtents" : 0,
  13. "indexes" : 0,
  14. "indexSize" : 0,
  15. "fileSize" : 0,
  16. "ok" : 1
  17. }
  18. > show dbs
  19. local 0.000GB

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


  1. $ docker run --name mongo-container -d mongo --storageEngine wiredTiger

12.2.2 使用自定义Dockerfile

首先是准备工作。新建项目目录,并在根目录新建Dockerfile,内容如下:


  1. # 设置从用户之前创建的sshd镜像继承。
  2. FROM sshd
  3. MAINTAINER docker_user (user@docker.com)
  4. RUN apt-get update && \
  5. apt-get install -y mongodb pwgen && \
  6. apt-get clean && \
  7. rm -rf /var/lib/apt/lists/*
  8. # 创建mongodb存放数据文件的文件夹
  9. RUN mkdir -p /data/db
  10. VOLUME /data/db
  11. ENV AUTH yes
  12. # 添加脚本
  13. ADD run.sh /run.sh
  14. ADD set_mongodb_password.sh /set_mongodb_password.sh
  15. RUN chmod 755 ./*.sh
  16. EXPOSE 27017
  17. EXPOSE 28017
  18. CMD ["/run.sh"]

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


  1. #!/bin/bash
  2. # 这个脚本主要是用来设置数据库的用户名和密码。
  3. # 判断是否已经设置过密码。
  4. if [ -f /.mongodb_password_set ]; then
  5. echo "MongoDB password already set!"
  6. exit 0
  7. fi
  8. /usr/bin/mongod --smallfiles --nojournal &
  9. PASS=${MONGODB_PASS:-$(pwgen -s 12 1)}
  10. _word=$( [ ${MONGODB_PASS} ] && echo "preset" || echo "random" )
  11. RET=1
  12. while [[ RET -ne 0 ]]; do
  13. echo "=> Waiting for confirmation of MongoDB service startup"
  14. sleep 5
  15. mongo admin --eval "help" >/dev/null 2>&1
  16. RET=$?
  17. done
  18. # 通过docker logs + id可以看到下面的输出。
  19. echo "=> Creating an admin user with a ${_word} password in MongoDB"
  20. mongo admin --eval "db.addUser({user: 'admin', pwd: '$PASS', roles:
  21. [ 'userAdminAnyDatabase', 'dbAdminAnyDatabase' ]});"
  22. mongo admin --eval "db.shutdownServer();"
  23. echo "=> Done!"
  24. touch /.mongodb_password_set
  25. echo "========================================================================"
  26. echo "You can now connect to this MongoDB server using:"
  27. echo ""
  28. echo " mongo admin -u admin -p $PASS --host <host> --port <port>"
  29. echo ""
  30. echo "Please remember to change the above password as soon as possible!"
  31. echo "========================================================================"

新建run.sh,此脚本是主要的mongodb启动脚本:


  1. #!/bin/bash
  2. if [ ! -f /.mongodb_password_set ]; then
  3. /set_mongodb_password.sh
  4. fi
  5. if [ "$AUTH" == "yes" ]; then
  6. # 这里读者可以自己设定Mongodb的启动参数。
  7. export mongodb='/usr/bin/mongod --nojournal --auth --httpinterface --rest'
  8. else
  9. export mongodb='/usr/bin/mongod --nojournal --httpinterface --rest'
  10. fi
  11. if [ ! -f /data/db/mongod.lock ]; then
  12. eval $mongodb
  13. else
  14. export mongodb=$mongodb' --dbpath /data/db'
  15. rm /data/db/mongod.lock
  16. mongod --dbpath /data/db --repair && eval $mongodb
  17. fi

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


  1. $ docker build -t mongodb-image .

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


  1. $ docker run -d -p 27017:27017 -p 28017:28017 mongodb

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


  1. $ docker logs sa9

  1. You can now connect to this MongoDB server using:
  2. mongo admin -u admin -p 5elsT6KtjrqV --host &lt;host&gt; --port &lt;port&gt;
  3. Please remember to change the above password as soon as possible!
  4. =======================================================================


屏幕输出中的5elsT6KtjrqV就是admin用户的密码。

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


  1. $ docker run -d -p 27017:27017 -p 28017:28017 -e MONGODB_PASS="mypass" mongodb

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


  1. $ docker run -d -p 27017:27017 -p 28017:28017 -e AUTH=no mongodb

同样,读者也可以使用-v参数来映射本地目录到容器。