Database-Mongodb的容器化实践

使用官方镜像

1.使用官方镜像
[root@adson ~]# docker run --name mongo-container -d mongo
[root@adson ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f7e7bc23d405 mongo “docker-entrypoint…” 45 seconds ago Up 43 seconds 27017/tcp mongo-container

在此mongo容器启动一个bash进程,并通过mongo指令启动mongodb交互命令行,再通过db.stats()指令查看数据库状态:
[root@adson ~]# docker exec -it f7e7bc23d405 sh
#mongo
MongoDB shell version v4.0.0
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.0
Welcome to the MongoDB shell.
For interactive help, type “help”.
。。。。。。。。。。。。。。
To enable free monitoring, run the following command:
db.enableFreeMonitoring()

 > use test
switched to db test
> db
test
> db.stats()
{
        "db" : "test",
        "collections" : 0,
        "views" : 0,
        "objects" : 0,
        "avgObjSize" : 0,
        "dataSize" : 0,
        "storageSize" : 0,
        "numExtents" : 0,
        "indexes" : 0,
        "indexSize" : 0,
        "fileSize" : 0,
        "fsUsedSize" : 0,
        "fsTotalSize" : 0,
        "ok" : 1
}

> exit
bye

可以通过env指令查看环境变量的配置:
#env
HOSTNAME=f7e7bc23d405
HOME=/root
GPG_KEYS=9DA31620334BD75D9DCB49F368818C72E52529D4
TERM=xterm
MONGO_PACKAGE=mongodb-org
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MONGO_MAJOR=4.0
JSYAML_VERSION=3.10.0
GOSU_VERSION=1.10
MONGO_REPO=repo.mongodb.org
PWD=/
MONGO_VERSION=4.0.0

镜像默认暴露mongodb的服务端口:27017,可以通过该端口访问服务。
(1)连接mongodb容器
使用–link参数,连接新建的mongo-container容器
进入alpine系统容器后,用户可以通过ping指令测试mongo容器的连通性:
[root@adson ~]# docker run -it --link mongo-container:db alpine sh
/ # ls
bin etc lib mnt root sbin sys usr
dev home media proc run srv tmp var
/ # ping db
PING db (172.17.0.6): 56 data bytes
64 bytes from 172.17.0.6: seq=0 ttl=64 time=0.096 ms
64 bytes from 172.17.0.6: seq=1 ttl=64 time=0.088 ms
64 bytes from 172.17.0.6: seq=2 ttl=64 time=0.074 ms
^C
— db ping statistics —
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.074/0.086/0.096 ms

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

[root@adson ~]# docker run -it --link mongo-container:db --entrypoint mongo mongo --host db
MongoDB shell version v4.0.0
connecting to: mongodb://db:27017/
MongoDB server version: 4.0.0
Welcome to the MongoDB shell.
For interactive help, type “help”.
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
Server has startup warnings:
2018-07-06T14:14:44.292+0000 I CONTROL [initandlisten]
2018-07-06T14:14:44.292+0000 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-07-06T14:14:44.292+0000 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2018-07-06T14:14:44.292+0000 I CONTROL [initandlisten]
2018-07-06T14:14:44.293+0000 I CONTROL [initandlisten]
2018-07-06T14:14:44.293+0000 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is ‘always’.
2018-07-06T14:14:44.293+0000 I CONTROL [initandlisten] ** We suggest setting it to ‘never’
2018-07-06T14:14:44.293+0000 I CONTROL [initandlisten]
2018-07-06T14:14:44.293+0000 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is ‘always’.
2018-07-06T14:14:44.293+0000 I CONTROL [initandlisten] ** We suggest setting it to ‘never’
2018-07-06T14:14:44.293+0000 I CONTROL [initandlisten]

Enable MongoDB’s free cloud-based monitoring service to collect and display
metrics about your deployment (disk utilization, CPU, operation statistics,
etc).

The monitoring data will be available on a MongoDB website with a unique
URL created for you. Anyone you share the URL with will also be able to
view this page. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.

To enable free monitoring, run the following command:
db.enableFreeMonitoring()

> db.version();
4.0.0
> db.stats();
{
        "db" : "test",
        "collections" : 0,
        "views" : 0,
        "objects" : 0,
        "avgObjSize" : 0,
        "dataSize" : 0,
        "storageSize" : 0,
        "numExtents" : 0,
        "indexes" : 0,
        "indexSize" : 0,
        "fileSize" : 0,
        "fsUsedSize" : 0,
        "fsTotalSize" : 0,
        "ok" : 1
}

最后,还可以使用–storageEngine参数来设置储存引擎:
docker run --name mongo-container -d mongo --storageEngine wiredTiger

使用自定义Dockerfile

新建项目目录,并在根目录新建Dockerfile
[root@adson ~]# mkdir mongodb
[root@adson mongodb]# touch Dockerfile
[root@adson mongodb]# vi Dockerfile

FROM sshd:Dockerfile
MAINTAINER docker_user (user@docker.com)
RUN apt-get update &&
apt-get install -y mongodb pwgen &&
apt-get clean &&
rm -rf /var/lib/lists/*
#创建mongodb存放数据文件的文件夹
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脚本。此脚本主要负责配置数据库的用户名和密码:
[root@adson mongodb]# vi set_mongodb_password.sh
#!/bin/bash
#这个脚本主要是用来设置数据库的用户名和密码。
#判断是否已经设置过密码。
if [ -f /.mongodb_password_set]; then
echo “MongoDB password already set!”
exit 0
fi
/usr/bin/mongod --smallfiles --nojournal &
PASS=KaTeX parse error: Expected '}', got 'EOF' at end of input: {MONGODB_PASS:-(pwgen -s 12 1)}
_word=$( [ KaTeX parse error: Expected 'EOF', got '&' at position 19: …NGODB_PASS } ] &̲& echo "preset"…?
done
#通过docker logs + id可以看到以下输出。
echo “=> Creating an admin user with a ${_word} password in MongoDB”
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 --port "
echo “”
echo “Please remember to change the above password as soon as possible!”
echo "

新建run.sh,此脚本是主要的mongodb启动脚本:
[root@adson mongodb]# vi run.sh

#!/bin/bash
if [ ! -f /.mongodb_password_set ]; then
/set_mongodb_password.sh
fi
if [ “$AUTH” == “yes” ]; then
#这里读者可以自己设定Mongodb的启动参数。
export mongodb=’/usr/bin/mongod --nojournal --auth --rest’
else
export mongodb=’/usr/bin/mongod --nojournal --rest’
fi
if [ ! -f /data/db/mongod.lock ]; then
eval m o n g o d b e l s e e x p o r t m o n g o d b = mongodb else export mongodb= mongodbelseexportmongodb=mongodb’ --dbpath /data/db’
rm /data/db/mongod.lock
mongod --dbpath /data/db --repair && eval $mongodb
fi

使用docker build指令构建镜像:
[root@adson mongodb]# docker build -t mongodb-image .

启动容器,映射27017、28017端口到本地:
[root@adson mongodb]# docker run -d -p 27017:27017 -p 28017:28017 mongodb-image
a05b48666e41c04b9011a1457528ba4875e0a9c164930360713e2f5ffad2ca47

[root@adson mongodb]# docker logs 7a
/set_mongodb_password.sh: line 2: [: missing `]’
=> Waiting for confirmation of MongoDB service startup
Fri Jul 6 19:07:42.819 [initandlisten] MongoDB starting : pid=6 port=27017 dbpath=/data/db/ 64-bit host=7ad40fcd1e4b
Fri Jul 6 19:07:42.820 [initandlisten] db version v2.4.9
Fri Jul 6 19:07:42.820 [initandlisten] git version: nogitversion
Fri Jul 6 19:07:42.820 [initandlisten] build info: Linux orlo 3.2.0-58-generic #88-Ubuntu SMP Tue Dec 3 17:37:58 UTC 2013 x86_64 BOOST_LIB_VERSION=1_54
Fri Jul 6 19:07:42.820 [initandlisten] allocator: tcmalloc
。。。。。。。。。。。。。。。。。。。。。。。
server should be down…
=> Done!

You can now connect to this MongoDB server using:
mongo admin -u admin -p eotLEwLS7GvG --host --port
Please remember to change the above password as soon as possible!

Fri Jul 6 19:07:47.956 [initandlisten] MongoDB starting : pid=32 port=27017 dbpath=/data/db 64-bit host=7ad40fcd1e4b
。。。。。。。。。。。。。。。。

屏幕中输出的eotLEwLS7GvG就是admin的密码。

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

[root@adson ~]# docker run -d -p 27017:27017 -p 28017:28017 -e MONGODB_PASS=“myp
ass” mongo
0615313b0d56d672b918fb676ef75469e3d863fa11a79b1ec092390943daac4b

甚至,设定不需要密码即可访问:
[root@adson ~]# docker run -d -p 27017:27017 -p 28017:28017 -e AUTH=no mongo

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

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐