# 1.制作基础镜像
leanote 使用 mongodb 存储数据,如果把 mongodb 单独做成一个镜像,初始化数据时比较麻烦,所以最后还是决定把 mongodb 和 leanote 放到同一个镜像里边。
docker容器启动后,必须有一个进程前台运行,这个前台进程结束时docker容器结束,docker stop 时会给前台进程发信号,所以前台进程可以正常结束,而后台进程不会收到结束信号,前台进程结束时后台进程会被强制结束。
如果只是简单的启动 mongodb 和 leanote,mongodb 后台运行,leanote前台运行,结束容器的时候,leanote会正常结束,而mongodb则会非法结束,引起mongodb数据不一致。
其中一个解决办法就是使用supervisor作为前台进程,其他进程作为supervisor的子进程。
 
## 1.1.编写Dockerfile文件
使用easy_install来安装supervisor
cd /home/zhuyr/leanote
[root@dev leanote]# cat Dockerfile
FROM centos
MAINTAINER zhuyr<304748716@qq.com> # supervisor配置文件路径
ENV SUPERVISORD_CONF=/etc/supervisord.conf
# supervisor临时文件路径(日志文件、sock文件、pid文件)
ENV SUPERVISORD_TMP_CONF=/tmp/supervisor
# supervisor程序块文件路径,即是[program]块
ENV SUPERVISORD_INCLUDE_FILE=/etc/supervisordfile
# web管理界面的IP
ENV SUPERVISORD_WEB_IP=*
# web管理界面的PORT
ENV SUPERVISORD_WEB_PORT=9001
# web管理界面的账号
ENV SUPERVISORD_WEB_ACCOUNT=admin
# web管理界面的密码
ENV SUPERVISORD_WEB_PASSWORD=adminpass RUN mkdir -p ${SUPERVISORD_TMP_CONF}
RUN mkdir -p ${SUPERVISORD_INCLUDE_FILE} RUN yum -y update
RUN yum install -y python-setuptools wget telinit
RUN wget --no-check-certificate https://bootstrap.pypa.io/ez_setup.py -O |python
RUN easy_install supervisor
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} USER root
EXPOSE 22 80 9001 RUN /usr/sbin/init &
RUN /usr/sbin/telinit &

  

## 1.2 生成supervisor基础镜像
-t 生成的镜像名称
--rm 生成成功后删除中间镜像
--no-cache 不使用之前生成后缓存的中间镜像
注意命令后边跟的.,表示当前目录
[root@dev leanote]# docker build -t zhuyr/supervisor:1.0 --rm --no-cache .

[root@dev leanote]# 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

## 1.3 下载安装包

[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
# 2.制作leanote docker镜像
## 2.1 编写Dockerfile文件(修改原Dockerfile文件)
镜像内包含 mongodb 和 leanote。
使用ADD指令添加*.tar.gz时会自动解压。
[root@dev leanote]# cat Dockerfile
# zhuyr/leanote:2.6.1
# with mongodb FROM zhuyr/supervisor:1.0
MAINTAINER zhuyr<304748716@qq.com> ADD init.sh /root/init.sh
#ADD supervisord.conf /etc/supervisor/conf.d/supervisord.conf
ADD supervisord.conf /etc/supervisord.conf
COPY leanote-linux-amd64-v2.6.1.bin.tar.gz /root/
COPY mongodb-linux-x86_64-3.0.1.tgz /root/ RUN mkdir -p /root/db && \
cd /root && \
tar -xvf /root/mongodb-linux-x86_64-3.0.1.tgz && \
tar -xvf /root/leanote-linux-amd64-v2.6.1.bin.tar.gz && \
mv /root/mongodb-linux-x86_64-3.0.1 /root/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"]
[root@dev leanote]#
## 2.2 写supervisor文件
supervisord.conf里配置启动的进程,mongodb启动时指定数据库文件目录/root/db以后存放mongodb数据,leanote启动时先运行init.sh,再运行run.sh
[root@dev leanote]#  cat supervisord.conf
[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"
## 2.3 初始化数据库或添加配置文件
init.sh初始化数据库。通过判断是否存在文件/root/db/already-init-db来确定是否需要初始化数据库。数据库初始化时创建该文件。leanote的初始数据存放于/root/leanote/mongodb_backup/leanote_install_data/目录下
生成镜像时对conf目录进行了备份,如果文件/root/leanote/conf/app.conf不存在,则说明容器启动时将conf目录作为数据卷挂载到了其他地方,这时就从备份文件恢复配置文件。
[root@dev leanote]#  cat init.sh
#!/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

 

## 2.4 目录内容显示
[root@dev leanote]# 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
-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]#
# 3.运行docker
第一次启动。
三个目录,一个存放mongodb数据库文件,一个存放leanote配置文件,一个存放leanote附件。一个端口9000,用于访问leanote。
 
[root@dev 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
后台初始帐户密码:admin abc123
 
## 3.1 修改mongodb数据库和leanote的配置文件
[root@test2 leanote]# docker exec -it leanote /bin/bash
[root@33106c3f0054 bin]# pwd
/root/mongodb/bin
[root@33106c3f0054 bin]# ./mongo
>show dbs;
leanote 0.078GB
local 0.078GB
> use leanote;
switched to db leanote
> db.createUser({
... user:'zhuyr',
... pwd:'abc123',
... roles:[{role:'dbOwner',db:'leanote'}]
... }); Successfully added user: {
"user" : "zhuyr",
"roles" : [
{
"role" : "dbOwner",
"db" : "leanote"
}
]
}
> db.auth("zhuyr","abc123");
1
> #查看leanote配置文件
[root@33106c3f0054 leanote]# cd conf/
[root@33106c3f0054 conf]# pwd
/root/leanote/conf
[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

制作 leanote docker 镜像 并运行的更多相关文章

  1. 制作 leanote docker 镜像

    leanote 使用 mongodb 存储数据,如果把 mongodb 单独做成一个镜像,初始化数据时比较麻烦,所以最后还是决定把 mongodb 和 leanote 放到同一个镜像里边. docke ...

  2. 制作一个docker镜像:mysql-8-x64-linux

    因为个人学习需要,为软件系统的虚拟容器化,以下将mysql制作为docker镜像,并记录下详细步骤. 欢迎大家学习交流和转载,同时写作不易,如果各位觉得不错,请点赞支持. 备注:以下代码和文章,欢迎复 ...

  3. Docker安装Jenkins打包Maven项目为Docker镜像并运行【保姆级图文教学】

    一.前言 Jenkins作为CI.CD的先驱者,虽然现在的风头没有Gitlab强了,但是还是老当益壮,很多中小公司还是使用比较广泛的.最近小编经历了一次Jenkins发包,感觉还不错,所以自己学习了一 ...

  4. 制作seata docker镜像

    seata是阿里巴巴的一款开源的分布式事务框架,官方已经支持docker了,但是因为业务的需要,需要自己定制. 制作docker镜像 官方的Dockerfile.下载seata-server-1.1. ...

  5. 制作zipkin docker镜像

    这里使用的zipkin知识基于内存的版本,没有接入外部存储 https://zipkin.io/ https://github.com/openzipkin/zipkin https://github ...

  6. 制作sentinel docker镜像

    在sentinel官方下载jar包即可运行,但是在部署的时候一个一个的启动jar包很不方便,制作成镜像方便部署和管理. 1)直接运行 # 修改端口号,默认是8080 java -jar sentine ...

  7. Spring Boot 的项目打包成的 JAR 包,制作成 docker 镜像并运行

    上一篇:Docker学习(三)docker容器操作 首先把本地的项目打包好,我这里直接把已经打包好的springboot-mybatis-0.0.1-SNAPSHOT.jar包直接上传到linuxmy ...

  8. Java的jar包构建成docker镜像并运行

    结构如下 把jar和Dockerfile放到一个文件,不在一个文件下会报错文件找不到 创建一个构建文件 buildimage.sh vi /home/hanby/buildimage.sh echo ...

  9. 【玩转开源】制作Docker镜像

    做嵌入式方向经常会遇到的一个问题,就是编译环境安装,如果换电脑,再重新安装环境是一个比较费时的事情,这个时候可以自己制作一个Docker镜像,然后把编译环境在Docker镜像里面配置好,以后同步环境就 ...

随机推荐

  1. #论文阅读# Universial language model fine-tuing for text classification

    论文链接:https://aclweb.org/anthology/P18-1031 对文章内容的总结 文章研究了一些在general corous上pretrain LM,然后把得到的model t ...

  2. Markdown Note

    Markdown-Note 1.基本编辑 粗体和斜体 源代码: *斜体*或_斜体_ **粗体** ***加粗斜体*** ~~删除线~~ 显示效果: 斜体或_斜体_ 粗体 加粗斜体 删除线 分级标题 第 ...

  3. Education Reform(CodeForces-119C)【DP】

    题意:从m门课选出n个排到n天,每天一门,难度须递增,每门课对应着一个作业量Xi,且Xi = Xi-1 + k or Xi - Xi-1 * k,总作业量要尽可能大,问能否排布,若能排布,求方案. 思 ...

  4. postman的安装与使用方法介绍

    软件介绍 在我们平时开发中,特别是需要与接口打交道时,无论是写接口还是用接口,拿到接口后肯定都得提前测试一下,这样的话就非常需要有一个比较给力的Http请求模拟工具,现在流行的这种工具也挺多的,像火狐 ...

  5. hdu 6043 KazaQ's Socks

    规律题.我自己写的规律对长度为2的要特判,wa一万次... 规律题目,容易错的反而是数据小的时候,得长记性. 题解:规律 先是1~n 然后1~n-2 n-1  1~n-2 n 交替出现 比如当n=4 ...

  6. 轻松搭建CAS 5.x系列(2)-搭建HTTPS的SSO SERVER端

    概要说明 CAS要求,必须使用HTTPS的服务,否则就只等实现登录,无法实现单点登录.科普下HTTPS,网站有HTTP和HTTPS两种协议.HTTP是浏览器到网站之间是明文传输,比如你输入帐号名和密码 ...

  7. C语言快速判断素数——不超时

    这属于算法上的问题,好好考虑一下算法,还要考虑一下素数的定义. 素数是只有1和本身能整除的整数.所以在求素数的时候,要将素数与1到素数本身中间的所有整数都相除,看是否有整除的数,如果有,那肯定不是素数 ...

  8. VS219 没有.net core 3.0模板

    控制台命令 dotnet --info dotnet --version 都正常显示有安装3.0 需要升级VS 2019 16.3.3,本地版本为16.3.2

  9. linux 打包与解压命令--常用

    一般情况用这俩个就足以了 压缩 tar -czf jpg.tar.gz *.jpg   //将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,生成一个gzip压缩过的包,命名为jp ...

  10. css的一些样式

    input标签中的一些样式: <input type="text">:表示输入文本 <input type="password">:表示 ...