leanote 使用 mongodb 存儲數據,如果把 mongodb 單獨做成一個鏡像,初始化數據時比較麻煩,所以最后還是決定把 mongodb 和 leanote 放到同一個鏡像里邊。
docker容器啟動后,必須有一個進程前台運行,這個前台進程結束時docker容器結束,docker stop 時會給前台進程發信號,所以前台進程可以正常結束,而后台進程不會收到結束信號,前台進程結束時后台進程會被強制結束。
如果只是簡單的啟動 mongodb 和 leanote,mongodb 后台運行,leanote前台運行,結束容器的時候,leanote會正常結束,而mongodb則會非法結束,引起mongodb數據不一致。
其中一個解決辦法就是使用supervisor作為前台進程,其他進程作為supervisor的子進程。
構建 supervisor 鏡像
FROM ubuntu:14.04
MAINTAINER LiangJunliang<noright0@163.com>
ADD sources.list /etc/apt/
RUN apt-get update && \
apt-get install -y supervisor
CMD [ "/bin/bash" ]
其中sources.list使用國內源。
docker build -t ljl/supervisor:1.0 --rm --no-cache .
-t 生成的鏡像名稱 --rm 生成成功后刪除中間鏡像 --no-cache 不使用之前生成后緩存的中間鏡像 注意命令后邊跟的.,表示當前目錄
構建 leanote 鏡像
鏡像內包含 mongodb 和 leanote。 使用ADD指令添加*.tar.gz時會自動解壓。
# ljl/leanote:2.0
# with mongodb
FROM ljl/supervisor:1.0
MAINTAINER LiangJunliang<noright0@163.com>
ADD init.sh /root/init.sh
ADD supervisord.conf /etc/supervisor/conf.d/supervisord.conf
ADD leanote-linux-amd64-v2.0.bin.tar.gz /root/
ADD mongodb-linux-x86_64-ubuntu1404-3.2.0.tgz /root/
RUN mkdir -p /root/db && \
cd /root && \
mv mongodb-linux-x86_64-ubuntu1404-3.2.0 mongodb && \
mkdir -p /root/conf_bak && \
cp /root/leanote/conf/* /root/conf_bak && \
chmod a+x /root/init.sh && \
chmod a+x /root/leanote/bin/run.sh
EXPOSE 9000
CMD ["/usr/bin/supervisord"]
supervisord.conf里配置啟動的進程,mongodb啟動時指定數據庫文件目錄,leanote啟動時先運行init.sh,再運行run.sh
[supervisord]
nodaemon=true
[program:mongodb]
command=/root/mongodb/bin/mongod --dbpath /root/db
[program:leanote]
command=/bin/bash -c "/root/init.sh && /root/leanote/bin/run.sh"
init.sh初始化數據庫。通過判斷是否存在文件/root/db/already-init-db來確定是否需要初始化數據庫。數據庫初始化時創建該文件。
生成鏡像時對conf目錄進行了備份,如果文件/root/leanote/conf/app.conf不存在,則說明容器啟動時將conf目錄作為數據卷掛載到了其他地方,這時就從備份文件恢復配置文件。
#!/bin/bash
#set -m
# 如果數據庫未初始化,則初始化數據庫
if [ ! -f "/root/db/already-init-db" ] ; then
touch /root/db/already-init-db
/root/mongodb/bin/mongorestore -h localhost -d leanote --dir /root/leanote/mongodb_backup/leanote_install_data/
fi
# 如果配置文件不存在,則復制配置文件
if [ ! -f "/root/leanote/conf/app.conf" ] ; then
cp /root/conf_bak/* /root/leanote/conf/
fi
編譯生成鏡像
docker build -t ljl/leanote:2.0 --rm --no-cache .
啟動鏡像
第一次啟動。
三個目錄,一個存放mongodb數據庫文件,一個存放leanote配置文件,一個存放leanote附件。一個端口9000,用於訪問leanote。
docker run --name leanote -d -v /srv/leanote/db:/root/db -v /srv/leanote/conf/:/root/leanote/conf/ -v /srv/leanote/files:/root/leanote/files -p 9000:9000 ljl/leanote:2.0
啟動容器
docker start leanote
停止容器
docker stop leanote
查看容器輸出
docker logs leanote
其他
安裝docker
wget -qO- https://get.docker.com/ | sudo sh
supervisor 子進程日志
supervisor子進程輸出至
/var/log/supervisor/
進入容器
docker exec -it leanote /bin/bash
問題
容器第一次啟動時leanote會退出,再次啟動容器就好了。
