1.制作基础镜像

leanote 使用 mongodb 存储数据,如果把 mongodb 单独做成一个镜像,初始化数据时比较麻烦,所以最后还是决定把 mongodb 和 leanote 放到同一个镜像里边。
docker容器启动后,必须有一个进程前台运行,这个前台进程结束时docker容器结束,docker stop 时会给前台进程发信号,所以前台进程可以正常结束,而后台进程不会收到结束信号,前台进程结束时后台进程会被强制结束。
如果只是简单的启动 mongodb 和 leanote,mongodb 后台运行,leanote前台运行,结束容器的时候,leanote会正常结束,而mongodb则会非法结束,引起mongodb数据不一致。
其中一个解决办法就是使用supervisor作为前台进程,其他进程作为supervisor的子进程。

1.1阿里云镜像源

其中sources.list使用国内源。

  1. [root@k8smaster zhuyr]# cd /home/zhuyr/leanoteDockerFile/sources
  2. [root@dev sources]# vi sources.list
  3. deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
  4. deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
  5. deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
  6. deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
  7. deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse

1.2编写Dockerfile文件

  1. [root@k8smaster zhuyr]# cat Dockerfile
  2. FROM ubuntu:14.04
  3. MAINTAINER zhuyr<304748716@qq.com>
  4. ADD sources.list /etc/apt/
  5. RUN apt-get update && \
  6. apt-get install -y supervisor
  7. CMD [ "/bin/bash" ]
  8. 使用easy_install来安装supervisor
  9. [root@k8smaster zhuyr]# cat Dockerfile
  10. FROM centos
  11. MAINTAINER zhuyr<304748716@qq.com>
  12. # supervisor配置文件路径
  13. ENV SUPERVISORD_CONF=/etc/supervisord.conf
  14. # supervisor临时文件路径(日志文件、sock文件、pid文件)
  15. ENV SUPERVISORD_TMP_CONF=/tmp/supervisor
  16. # supervisor程序块文件路径,即是[program]块
  17. ENV SUPERVISORD_INCLUDE_FILE=/etc/supervisordfile
  18. # web管理界面的IP
  19. ENV SUPERVISORD_WEB_IP=*
  20. # web管理界面的PORT
  21. ENV SUPERVISORD_WEB_PORT=9001
  22. # web管理界面的账号
  23. ENV SUPERVISORD_WEB_ACCOUNT=admin
  24. # web管理界面的密码
  25. ENV SUPERVISORD_WEB_PASSWORD=adminpass
  26. RUN mkdir -p ${SUPERVISORD_TMP_CONF}
  27. RUN mkdir -p ${SUPERVISORD_INCLUDE_FILE}
  28. RUN yum -y update
  29. RUN yum install -y python-setuptools wget telinit
  30. RUN wget --no-check-certificate https://bootstrap.pypa.io/ez_setup.py -O |python
  31. RUN easy_install supervisor
  32. RUN echo -e "[unix_http_server]\nfile=${SUPERVISORD_TMP_CONF}/supervisor.sock\n[inet_http_server]\nport=${SUPERVISORD_WEB_IP}:${SUPERVISORD_WEB_PORT}\nusername=${SUPERVISORD_WEB_ACCOUNT}\npassword=${SUPERVISORD_WEB_PASSWORD}\n[supervisord]\nlogfile=${SUPERVISORD_TMP_CONF}/supervisord.log\nlogfile_maxbytes=50MB\nlogfile_backups=10\nloglevel=info\npidfile=${SUPERVISORD_TMP_CONF}/supervisord.pid\nnodaemon=false\nminfds=1024\nminprocs=200\n[supervisorctl]\nserverurl=unix://${SUPERVISORD_TMP_CONF}/supervisor.sock\n[include]\nfiles = ${SUPERVISORD_INCLUDE_FILE}/*.ini" > ${SUPERVISORD_CONF}
  33. USER root
  34. EXPOSE 22 80 9001
  35. RUN /usr/sbin/init &
  36. RUN /usr/sbin/telinit &

1.3生成supervisor基础镜像

-t 生成的镜像名称
—rm 生成成功后删除中间镜像
—no-cache 不使用之前生成后缓存的中间镜像
注意命令后边跟的.,表示当前目录
[root@dev sources]# docker build -t zhuyr/supervisor:1.0 —rm —no-cache .
[root@dev sources]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
zhuyr/supervisor 1.0 e116f6895b37 About a minute ago 236.6 MB
ubuntu 14.04 7c09e61e9035 7 days ago 187.9 MB
[root@dev sources]# cd ..
[root@dev leanote]# pwd
/home/zhuyr/leanote

2.制作leanote docker镜像

2.1编写Dockerfile文件

[root@test2 leanote]# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.1.tgz
[root@test2 leanote]# wget https://static.axboy.cn/leanote/leanote-linux-amd64-v2.6.1.bin.tar.gz
镜像内包含 mongodb 和 leanote。
使用ADD指令添加*.tar.gz时会自动解压。

  1. [root@dev leanoteDockerFile]# cat Dockerfile
  2. # zhuyr/leanote:2.6.1
  3. # with mongodb
  4. FROM zhuyr/supervisor:1.0
  5. MAINTAINER zhuyr<304748716@qq.com>
  6. ADD init.sh /root/init.sh
  7. ADD supervisord.conf /etc/supervisord.conf
  8. ADD wkhtmltopdf /usr/local/bin
  9. ADD fonts.tar /usr/share/fonts/
  10. COPY leanote-linux-amd64-v2.6.1.bin.tar.gz /root/
  11. COPY mongodb-linux-x86_64-3.0.1.tgz /root/
  12. RUN yum install -y libXrender*
  13. RUN yum install -y libfontconfig*
  14. RUN yum install -y libXext*
  15. RUN mkdir -p /root/db && \
  16. cd /root && \
  17. tar -xvf /root/mongodb-linux-x86_64-3.0.1.tgz && \
  18. tar -xvf /root/leanote-linux-amd64-v2.6.1.bin.tar.gz && \
  19. mv /root/mongodb-linux-x86_64-3.0.1 /root/mongodb && \
  20. mkdir -p /root/conf_bak && \
  21. cp /root/leanote/conf/* /root/conf_bak && \
  22. chmod a+x /root/init.sh && \
  23. chmod a+x /root/leanote/bin/run.sh && \
  24. chmod a+x /usr/local/bin/wkhtmltopdf
  25. EXPOSE 9000
  26. CMD ["/usr/bin/supervisord"]
  27. [root@dev leanoteDockerFile]#

2.2写supervisor文件

supervisord.conf里配置启动的进程,mongodb启动时指定数据库文件目录/root/db以后存放mongodb数据,leanote启动时先运行init.sh,再运行run.sh

  1. [root@dev leanoteDockerFile]# cat supervisord.conf
  2. [supervisord]
  3. nodaemon=true
  4. [program:mongodb]
  5. command=/root/mongodb/bin/mongod --dbpath /root/db
  6. [program:leanote]
  7. command=/bin/bash -c "/root/init.sh && /root/leanote/bin/run.sh"

2.3初始化数据库或添加配置文件

init.sh初始化数据库。通过判断是否存在文件/root/db/already-init-db来确定是否需要初始化数据库。数据库初始化时创建该文件。leanote的初始数据存放于/root/leanote/mongodb_backup/leanote_install_data/目录下
生成镜像时对conf目录进行了备份,如果文件/root/leanote/conf/app.conf不存在,则说明容器启动时将conf目录作为数据卷挂载到了其他地方,这时就从备份文件恢复配置文件。

  1. [root@dev leanoteDockerFile]# cat init.sh
  2. #!/bin/bash
  3. #set -m
  4. # 如果数据库未初始化,则初始化数据库
  5. if [ ! -f "/root/db/already-init-db" ] ; then
  6. touch /root/db/already-init-db
  7. /root/mongodb/bin/mongorestore -h localhost -d leanote --dir /root/leanote/mongodb_backup/leanote_install_data/
  8. fi
  9. # 如果配置文件不存在,则复制配置文件
  10. if [ ! -f "/root/leanote/conf/app.conf" ] ; then
  11. cp /root/conf_bak/* /root/leanote/conf/
  12. fi

2.4目录内容显示

[root@dev leanoteDockerFile]# ll
总用量 58876
-rw-r—r—. 1 root root 675 3月 7 20:33 Dockerfile
-rw-r—r—. 1 root root 428 3月 7 20:32 init.sh
-rw-r—r—. 1 root root 20717785 3月 7 20:35 leanote-linux-amd64-v2.6.1.bin.tar.gz
-rw-r—r—. 1 root root 39554547 3月 7 20:35 mongodb-linux-x86_64-3.0.1.tgz
drwxr-xr-x. 2 root root 59 3月 7 20:21 sources
-rw-r—r—. 1 root root 197 3月 7 20:31 supervisord.conf
[root@dev leanoteDockerFile]#

2.5生成leanote镜像

[root@dev leanoteDockerFile]# docker build -t zhuyr/leanote:2.6.1 —rm —no-cache .
[root@dev leanoteDockerFile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
zhuyr/leanote 2.4 60896a4094b8 12 seconds ago 477.4 MB
zhuyr/supervisor 1.0 e116f6895b37 15 minutes ago 236.6 MB
ubuntu 14.04 7c09e61e9035 7 days ago 187.9 MB
[root@dev leanoteDockerFile]#
第一次启动。
三个目录,一个存放mongodb数据库文件,一个存放leanote配置文件,一个存放leanote附件。一个端口9000,用于访问leanote。
[root@dev leanoteDockerFile]# docker run —name leanote -d -v /leanote/leanotedb:/root/db -v /leanote/conf/:/root/leanote/conf/ -v /leanote/files:/root/leanote/files -p 9000:9000 zhuyr/leanote:2.6.1
后台初始帐户密码:admin abc123

3.修改mongodb数据库和leanote的配置文件

  1. [root@test2 leanote]# docker exec -it leanote /bin/bash
  2. [root@33106c3f0054 bin]# pwd
  3. /root/mongodb/bin
  4. [root@33106c3f0054 bin]# ./mongo
  5. > use leanote;
  6. switched to db leanote
  7. > db.createUser({
  8. ... user:'zhuyr',
  9. ... pwd:'abc123',
  10. ... roles:[{role:'dbOwner',db:'leanote'}]
  11. ... });
  12. Successfully added user: {
  13. "user" : "zhuyr",
  14. "roles" : [
  15. {
  16. "role" : "dbOwner",
  17. "db" : "leanote"
  18. }
  19. ]
  20. }
  21. > db.auth("zhuyr","abc123");
  22. 1
  23. >
  24. [root@33106c3f0054 leanote]# cd conf/
  25. [root@33106c3f0054 conf]# pwd
  26. /root/leanote/conf
  27. [root@33106c3f0054 conf]# cat app.conf

4.问题处理

如果mongodb里的leanote没导入成功,则进入容器重新执行以下命令:
/root/mongodb/bin/mongorestore -h localhost -d leanote —dir /root/leanote/mongodb_backup/leanote_install_data/
登录后,进入后台管理-配置-站点URL,修改成你的实际域名或IP地址如:http://172.16.160.210:9000

5.导出PDF配置 wkhtmltopdf

Leanote的PDF导出使用了wkhtmltopdf, 所以需要先安装wkhtmltopdf, 然后以管理员身份登录Leanote管理后台配置wkhtmltopdf路径.
安装wkhtmltopdf
wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.4/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz
tar -xvf wkhtmltox-0.12.4_linux-generic-amd64.tar.xz
cd wkhtmltopdf/bin
chmod +x wkhtmltopdf
mv wkhtmltopdf /usr/local/bin
测试是否安装成功
wkhtmltopdf http://www.baidu.com ./baidu.pdf
导出的PDF中文会乱码,我们需要找到windows里C:\Windows\Fonts文件夹中的宋体或者微软雅黑字体,上传到服务器/usr/share/fonts/目录下即可。
配置wkhtmltopdf路径.
/usr/local/bin/wkhtmltopdf

备份

[root@amoyzhu create]# ssh-keygen -t rsa
[root@amoyzhu create]# ssh-copy-id 172.16.160.210
[root@amoyzhu create]# ssh ‘172.16.160.210’
[root@amoyzhu create]# exit
[root@amoyzhu leanote]# scp -r conf root@172.16.160.210:/leanote/
[root@amoyzhu leanote]# scp -r files root@172.16.160.210:/leanote/
[root@amoyzhu leanote]# scp -r leanotedb root@172.16.160.210:/leanote/
[root@master images]# docker save zhuyr/leanote:2.6.1 > /leanote/create/leanote.tar
[root@master images]# scp leanote.tar root@172.16.160.210:/leanote/
[root@node1 images]# docker load < leanote.tar
[root@node1 images]# docker load -i leanote.tar
在另一台启动leanote
[root@test2 leanote]# docker run —name leanote -d -v /leanote/leanotedb:/root/db -v /leanote/conf/:/root/leanote/conf/ -v /leanote/files:/root/leanote/files -p 9000:9000 zhuyr/leanote:2.6.1