乐趣区

实战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 容器化

【未完待续】

退出移动版