开始
接上一篇:机缘巧合与 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 容器化
【未完待续】