【实战】ubuntu使用docker搭建:Nginx + NodeJS + MongoDB

ShangQuan0 2019-08-25

开始

接上一篇:机缘巧合与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容器化

【未完待续】

相关推荐