【实战】ubuntu使用docker搭建:Nginx + NodeJS + MongoDB
开始
接上一篇:机缘巧合与Docker结缘
在学习了docker之后,准备把这个神器逐步用到服务器上。
那就开始吧!
选择与思考
自己就这么一台小小服务器,我对docker的使用如何定位呢?
玩docker为的是能够快速搭建环境
然后把精力都用在开发上
而不是为了玩docker,把所有服务一股脑都改成docker,然后配置各种复杂架构…
我只需要先完成几个小目标。
够用就好。
逐步深化实战
小目标一:ubuntu下安装docker环境
ubuntu中安装docker,参考了菜鸟的教程:
Ubuntu Docker 安装
使用的命令有:
uname -r //3.10以上才可以安装 wget -qO- https://get.docker.com/ | sh //全自动,嗖嗖嗖 sudo usermod -aG docker ubuntu //以后docker命令不用sudo sudo vim /etc/docker/daemon.json //加入163的镜像如下: { "registry-mirrors": ["http://hub-mirror.c.163.com"] } docker run hello-world //hello-world成功
小目标二:docker + mongodb
对,这是我的初衷。
关于安全
在hub.docker.com中搜索mongodb,找到官方的镜像,居然发现大部分都标有This image has vulnerabilities
,即该镜像有漏洞。
在网上查了查,很多人对此表示担忧,但也有一些人表示,自己后续会再对镜像做好安全措施。
于是我也准备先用吧。毕竟我只是开发测试。
小坑
由于4.0以后开始兼容事务,于是选择了mongo:4.0.12这个版本。
规划上,考虑到数据持久化的事宜,要对日志、配置文件、数据库存放目录进行映射。
于是去镜像中查找mongodb.conf,发现整个镜像中并没有这个配置文件,而/etc/mongod.conf.orig
只是个示例。
真实的数据库存放目录为/data/db
,而日志文件,一直没找到。
后来在hub.docker.com查看到:
The MongoDB Server log is available through Docker's container log: $ docker logs some-mongo
这样就简单了,日志不需要映射。
而配置文件,如果需要的话,只需要-v /youconf/mongod.conf:/etc/mongod.conf
即可。
但镜像默认的设置就很好了,所以不需要再映射配置文件。
我们创建容器只需要这样写:(我加了一个备份文件夹)
docker run -d -p 27017:27017 --name mymgdb -v /youdata/db:/data/db -v /youdata/backup:/data/backup mongo:4.0.12
还有--always、--rm、-h等常用参数备查,具体参考:Docker命令详解(run篇)
docker占用空间的提醒
由于volume机制的存在,某些镜像比如mongodb、mysql,如果在docker run 的时候没有映射目录,docker会自动创建volume,而nginx、httpd、alpine则默认不会创建volume。
参数资料:Docker学习笔记(6)——Docker Volume
由于volume目的是持久化,那么删除容器之后,volumn会保留。
作为小白的我,这几天尝试了很多次mongodb的创建、删除。硬盘容量飞速下降。
这才发现是volume的原因。
甚至有网友遇到了玩docker把服务占满的情况。
以下几个命令,能帮助你查看docker占用资源的情况:
docker system df //查看image、容器、volume等的数量和占用空间情况 docker system prune //删除所有未使用数据,容器、volume、网络、挂起的镜像 docker volume ls //列出所有volume docker volume rm id //删除指定volume docker volume prune //删除所有未使用的volume docker image prune //删除所有未使用的image docker container prune //删除所有未使用的prune
关于prune可以查看Prune unused Docker objects
遇到个小问题:mongodb无法启动,错误代码(code=exited, status=100)
网上的办法,让删除mongod.lock和storage.bson,一般只删除第一个就解决问题了。
但我两个都删除了还是不行。
于是看了这个Mongod Service start exits with code 100
下面有个54票的答案,方法很简单:
cd /var/lib/mongodb //cd到你的数据库存放目录 sudo chown -R mongodb:mongodb * //在运行命令前你可以先ll看一下当前所属用户,是999
备份与恢复
官方hub.docker.com给出的办法是:
$ docker exec some-mongo sh -c 'exec mongodump -d <database_name> --archive' > /some/path/on/your/host/all-collections.archive
然后我尝试了一下,成功了:
docker exec mymgdb sh -c 'exec mongodump -d test --archive' > /data/backup/test.archive
但是在恢复的时候,就很难再把备份文件传进去。
于是放弃这种方法。
采用下文提供的办法:
Docker搭建MongoDB
docker exec mymgdb sh -c "exec mongorestore --archive=/data/backup/xx.archive" //成功恢复
【未完待续】
延伸阅读:
MongoDb进阶实践之九 Mongodb的备份与还原
MongoDB容器化
【未完待续】