Docker部署MongoDB+Leanote

前言
根据慕课网布宝大佬的文章进行搭建,最后发现不能运行,应该是docker imange生成过程中的问题,现在把我自己折腾成功的经历记录下来,更正其中的一些错误,为mongo加上了验证。

原文链接:https://www.imooc.com/article/49225

本文大部分内容修改自原文,如有不妥,请联系修改

需要的工具如下

git
docker
需要的镜像

mongo
axboy/leanote
安装mongo并配置
获取镜像
docker pull mongo
创建mongo
编辑docker-compose.yaml,先创建mongo。docker-compose.yaml添加如下内容:

mongo:
image: mongo
container_name: mongo
ports:
- "27017:27017"
volumes:
- /home/ycg31/mongo:/data/db
restart: always
tty: true
image: mongo 是启动容器所使用的docker镜像

container_name: mongo 数据库容器名字。

ports: - " 27017:27017"数据库使用默认的端口映射出来,意思是把后面的docker服务的27017暴露到前面的宿主机的27017上。容器命名为mongo。以后的所有数据库都用docker部署,并使用默认端口,宿主机上就不需要起数据库服务了。

restart: always 总是重启,这样子重启宿主机后,自动启动这个容器。

  • /home/ycg31/mongo:/data/db 这个是挂载容器内部的数据到宿主机的/home/ycg31/mongo目录,这个很重要,因为但你重装系统后,只要不删除掉这个文件夹,数据还是能找到。

运行mongo
docker-compose -up -d​ # d表示后台运行
应在docker-compose.yaml所在的目录执行此命令,如果需要调用其他路径的docker-compose.yaml,也可以使用-f命令

docke-compose -f /path/to/docker-compose.yaml -up d
为mongodb数据库添加用户
像mysql一样有root用户, mongodb初始是没有用户的, 这样很不安全, 所以要为leanote数据库新建一个用户来连接leanote数据库(注意, 并不是为leanote的表users里新建用户, 而是新建一个连接leanote数据库的用户, 类似mysql的root用户).

mognodb v2与v3创建用户命令有所不同

mongodb v2 创建用户如下:

首先切换到leanote数据库下

use leanote;

添加一个用户root, 密码是abc123

db.addUser("root", "abc123");
{
"_id" : ObjectId("53688d1950cc1813efb9564c"),
"user" : "root",
"readOnly" : false,
"pwd" : "e014bfea4a9c3c27ab34e50bd1ef0955"
}

测试下是否正确

db.auth("root", "abc123");
1 # 返回1表示正确
mongodb v3 创建用户如下:

首先切换到leanote数据库下

use leanote;

添加一个用户root, 密码是abc123

db.createUser({
user: 'root',
pwd: 'abc123',
roles: [{role: 'dbOwner', db: 'leanote'}]
});

测试下是否正确

db.auth("root", "abc123");
1 # 返回1表示正确
mongo添加auth
编辑docker-compose.yaml,在mongo下添加auth认证,修改后如下:

mongo:
image: mongo
container_name: mongo
ports:
- "27017:27017"
volumes:
- /home/ycg31/mongo:/data/db
restart: always
command: mongod --auth
tty: true
command: mongod --auth 这条命令是给mongo加上验证,默认mongo是不需要验证的。

完成后重新部署mongo,注意一定用下面的命令,直接restart的话,compose的配置文件是不生效的。

docker-compose stop mongo
docker-compose -up -d​
初始化leanote数据库
因为leanote需要一个初始化的mongo数据才能运行,当我们要分离出独立的数据库时,就需要将初始化数据先导入到独立的数据库容器中。

获取Leanote包
从leanote官网获取leanote包,解压

leanote官网提供的下载链接是https://sourceforge.net/projects/leanote-bin/files/2.6.1/leanote-linux-amd64-v2.6.1.bin.tar.gz/download,这个无法用wget下载压缩包,而我发现只要把域名的https://sourceforge.net改成https://udomain.dl.sourceforge.net就能获取到文件。具体下载哪个,看自己系统了。

Linux:

64: leanote-linux-amd64.v2.6.1.bin.tar.gz: https://udomain.dl.sourceforge.net/project/leanote-bin/2.6.1/leanote-linux-amd64-v2.6.1.bin.tar.gz
32: leanote-linux-386.v2.6.1.bin.tar.gz: https://udomain.dl.sourceforge.net/projects/leanote-bin/files/2.6.1/leanote-linux-386-v2.6.1.bin.tar.gz/download
arm: leanote-linux-arm.v2.6.1.bin.tar.gz: https://udomain.dl.sourceforge.net/projects/leanote-bin/files/2.6.1/leanote-linux-arm-v2.6.1.bin.tar.gz/download
这里我使用的是64位的:

cd /home/ycg31/download
wget https://udomain.dl.sourceforge.net/project/leanote-bin/2.6.1/leanote-linux-amd64-v2.6.1.bin.tar.gz -O leanote.tar.gz
tar -xzf leanote.tar.gz -C .
当然也可以使用官方Dockerfile里面的下载链接 http://static.axboy.cn/leanote/leanote-linux-amd64-v2.6.1.bin.tar.gz

导入数据到Mongo
初始数据存放在 /home/ycg31/download/leanote/mongodb_backup/leanote_install_data中。

将解压出来的数据拷贝到mongo数据库的容器的根目录,容器名为mongo,这个容器就是我们刚刚启动的mongo数据库。

docker cp leanote/mongodb_backup/leanote_install_data mongo:/ #将leanote_install_data拷贝到mongo容器的根目录下
进入mongo数据库容器,把数据导入到数据库中

docker exec -it mongo bash #进入mongo的bash
mongorestore -h localhost -d leanote --drop --dir /leanote_install_data/ #将leanote_install_data导入mongo数据库
rm -rf /leanote_install_data # 可选操作:最后为了容器的干净,可以把数据包从容器中删去。
值得注意的是,这里加了个--drop参数,为的是防止旧数据和新数据冲突。

现在在mongodb中已经新建了leanote数据库, 可用命令查看下leanote有多少张”表”:

$> mongo

show dbs # 查看数据库
leanote 0.203125GB
local 0.078125GB
use leanote # 切换到leanote
switched to db leanote
show collections # 查看表
files
has_share_notes
note_content_histories
note_contents
初始数据的users表中已有2个用户:

这里的用户名是指leanote的用户,不是数据库的用户,不要混淆。这里的用户安装完成后去leanote的后台修改即可。

user1 username: admin, password: abc123 (管理员, 只有该用户才有权管理后台, 请及时修改密码)
user2 username: demo@leanote.com, password: demo@leanote.com (仅供体验使用)
修改Leanote配置
因为这个包有些配置和我们实际应用场景是不一致的。我们先改完配置,等待dockerfile导入。

我们修改的文件在/home/ycg31/download/leanote/config/app.conf中,

vi /home/ycg31/download/leanote/config/app.conf​
http.addr=0.0.0.0 # listen on all ip addresses
http.port=9001 #我这里改成了9001

site.url=http://192.168.100.117:9001

admin username

adminUsername=admin #这里可以更改成你在leanote创建的任何用户

mongdb

db.host=192.168.100.117
db.port=27017
db.dbname=leanote # 必须填写
db.username=dbuser# 如果是不需要验证的mongo这里和下面留空即可
db.password=dbpasswd # 本文建立的是需要auth验证的mongo,因此必须填
db.host: mongodb的host,改成你自己的mongodb的host
db.port: mongodb的port,改为你自己的mongodb的port,我这里填上面我部署的mongo容器的端口27017
db.dbname: 这是刚刚导入的数据的数据库名,上面我们使用了leanote作为包名
db.username和db.password就是上面创建的数据用户和密码
安装leanote并配置
下载镜像的Dockerfile文件安装,作者已经做出了无数据库版的镜像。

安装leanote
下载Dockerfile,修改配置并创建一个新的镜像

cd /home/ycg31/download #切换到下载目录
git clone https://github.com/axboy/leanote.git leanote-docker #git拉取leanote
cd leanote-docker/nodb #进入nodb文件夹,不带数据库的
vi Dockerfile
修改Dockerfile文件,我这里跟原作者的方法不一样,不需要压缩,直接把目录放进去,而且原作者省略了重要的一步,就是要把ADD要导入的文件或者文件夹拷贝到Dockerfile所在的目录。

cp -r /home/ycg31/download/leanote /home/ycg31/download/leanote-docker/nodb
然后修改Dockerfile文件

1.将leanote目录ADD到/root/目录下(第7行)

2.把leanote目录从/root/移动到/data/目录下(注释16、17行,添加18行)

3.编辑完成:wq保存退出,修改结果如下:

FROM madnight/alpine-wkhtmltopdf-builder:0.12.5-alpine3.10-705860667 as builder
FROM axboy/leanote:latest as fontBuilder
FROM alpine:3.12
MAINTAINER zcw
ENV TZ=Asia/Shanghai

ADD leanote /root/
COPY --from=builder /bin/wkhtmltopdf /usr/local/bin/wkhtmltopdf
COPY --from=fontBuilder /usr/share/fonts/truetype /usr/share/fonts/truetype
RUN apk update && apk add --no-cache tzdata mongodb-tools
libgcc libstdc++ libx11 glib libxrender libxext libintl
ttf-dejavu ttf-droid ttf-freefont ttf-liberation ttf-ubuntu-font-family &&
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&
mkdir /data/ && \

wget http://static.axboy.cn/leanote/leanote-linux-amd64-v2.6.1.bin.tar.gz -O /root/leanote.tar.gz && \

tar -xzf /root/leanote.tar.gz -C /data/ && \

mv /root/leanote /data/ &&
chmod +x /data/leanote/bin/run.sh &&
chmod +x /usr/local/bin/wkhtmltopdf

EXPOSE 9000
CMD sh /data/leanote/bin/run.sh
创建一个新的镜像,名字为axboy/leanote,tag为no-db2.6.1

$docker build . -t="axboy/leanote:no-db2.6.1"
运行leanote镜像
编辑docker-compose.yaml,创建并运行leanote。

  leanote:    image: axboy/leanote:no- leanote:
image: axboy/leanote:no-db2.6.1 #用上面创建的镜像创建
container_name: leanote #容器名
ports:
- "9001:9001" #端口映射到宿主机9001端口上
volumes:
- /home/ycg31/leanote_db:/data/db #数据目录挂载到宿主机
- /home/ycg31/leanote:/data/leanote #leanote网页文件挂载到宿主机
restart: always #总是重启
运行

docker-compose -up -d​
排错并修复
问题
不管是用布宝原文的方法,还是官方Dockerfile构建,还是我上面的方法构建的image文件创建的leanote容器,在启动时都会报错如下:

root@docker:/home/ycg31/# docker logs leanote
sh: can't open '/data/leanote/bin/run.sh': No such file or directory
sh: can't open '/data/leanote/bin/run.sh': No such file or directory
原因未知,在生成image的过程中并未报错,查看映射的宿主文件夹/home/ycg31/leanote下的空的。

所以其实上面dockfile生成image的时候用官方默认的就好了,改了也白改。

解决办法
将之前下载并修改好的leanote文件夹,复制或者移动到leanote容器映射到宿主机的文件夹,我这里是/home/ycg31/leanote。

cp /home/ycg31/download/leanote/* /home/ycg31/leanote
ok,这下可以用http://ip:9001正常访问了。

尾声
用修改后的container创建一个image,以备后用

查看所有的容

docker container ls -a
leanote是原容器name,leanote-nodb是新image的REPOSITORY

docker commit leanote leanote-nodb
查看新镜像

docker image ls

posted @ 2020-12-12 17:08  ycg31  阅读(822)  评论(0)    收藏  举报