生哥在DoraCMS v2.1.2 Docker 版本(生产环境

这篇文章里写了如何使用docker来一键部署doracms,可以说极大降低了doracms的部署难度。可是随之而来也产生了一个问题,大家使用doracms,可能或多或少的都会有一些个人定制内容,以及自己创建的数据库结构。在这种时候,如果可以自行定制自己的docker镜像,那就可以高枕无忧地享受docker带来的快捷部署福利了~这篇文章就是用来指引各位看官,搭建属于自己的docker镜像。


---------------- linux环境 -----------------------


要实践本文里的内容,需要一些linux基础,而linux下也需要安装docker和git以及docker-compose(本文内容基于ubuntu)

安装docker:https://www.runoob.com/docker/ubuntu-docker-install.html

安装git、node、npm:https://www.html-js.cn/details/ry4-B-hkf.html

按装docker-compose:https://blog.51cto.com/9291927/2310444


---------------- 数据库环境部署 ----------------


doracms运行在mongodb和redis环境下,我们首先考虑的就是可以一键启动数据库环境,并且数据库内需要导入我们自己开发环境下定制的数据库数据。


首先,我们需要导出自己的数据库文件,启动mongod服务,然后在mongodb的bin目录使用命令

mongoexport -d dbname(数据库名,我们不出意外是doracms2) -o dir(导出目录,自定义一个)

导出后会有一大串json和bson数据,假定我们保存在了data文件夹里,然后我们新建一个文件夹比如MongoDocker,随便取个名字,放入data文件夹,另外新建docker-compose.yml  mongo-Dockerfile  setup.sh三个文件,如图


1.png


yml文件内容:


version: '2'
services:
    #环境必须的mongodb
    mongo_db:
        build:
          context: .
          
          #基于指定的dockerfile来生成我们需要的mongo镜像,这里没有使用既存的镜像是为了
          在dockerfile内指定一些操作
          dockerfile: mongo-Dockerfile
          
        restart: always
        
        #指定运行端口
        ports:
          - "27017:27017"
          
        #指定运行卷位置
        volumes:
          - "/home/volumes/mongo:/data/db"
          - "/etc/localtime:/etc/localtime"
          
    #环境必须的redis
    redis:
        #直接指定redis镜像
        image: "redis:alpine"
        
        ports:
         - "6379:6379"
        restart: always


yml文件内指定的mongo-Dockerfile内容:


# 指定需要加载的mongodb镜像
FROM mongo:3.6

# 指定docker容器内的工作区域
ENV WORKSPACE /usr/local/work

# 指定初始化数据库命令的位置
ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d

# 指定用于初始化的命令shell
ENV INSTALL_MONGO_SHELL setup.sh

# 使用RUN执行linux命令生成工作区目录
RUN mkdir -p $WORKSPACE

# 将我们之前导入的数据库备份文件复制去容器内的工作区目录
COPY ./data/*.* $WORKSPACE/

# 将初始化shell复制进容器内的指定目录
COPY ./$INSTALL_MONGO_SHELL $AUTO_RUN_DIR/

# 执行初始化shell
RUN chmod a+x $AUTO_RUN_DIR/$INSTALL_MONGO_SHELL


dockerfile内指定的setup.sh内容如下

#!/bin/bash
mongo <<EOF

#在mongo命令行内执行命令,生成admin用户
use admin;
db.createUser({ user: '你的用户名', pwd: '你的密码', roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] });

use doracms2;
EOF

#执行mongorestore命令导入你的数据
mongorestore --db doracms2 --drop $WORKSPACE


完成数据库环境一键部署的所有文件配置都在这里了,是不是很简单,下面要做的就,就是在MongoDocker根目下执行一个小小的命令

docker-compose up

就可以看见诸如

2.png


这样的一步步在执行命令,最后


3.png


命令行会直接显示redis和mongodb的运行状况,都已经正常启动


现在实际的运行情况是,redis和mongodb各有一个docker容器在运行,并且对外暴露的端口皆为其默认设置的端口,所达到的效果与我们去手动安装mongodb和redis,并且逐一打开其服务是一样的。


这时想把doracms跑起来,可以执行下面的操作

进入你的工作目录,比如

cd /home/web

然后clone你修改过的代码

git clone 代码git地址

进入代码目录执行

npm i

这里有一个坑,就是9以上的node在执行npm i时,遇到node-sass编译的文件在后续命令执行时会报错,所以我在这个项目上会选择使用8版本的node来运行

安装完依赖后,我们需要执行

npm run build

来编译生产代码

完成后,直接执行

node server.js

就可以看见成功链接redis和mongodb的信息,随后打包成功

访问localhost:8080,就可以看见网站已经跑起来啦


如果执行docker-compose up后报这样的错误,可能是因为linux内核与docker不兼容导致的

OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:301: running exec setns process for init caused \"exit status 23\""

可以执行

apt-get install --install-recommends linux-generic-lts-xenial

升级linux内核~ 


-------------------- 结语 -----------------------


用上手就会发现现在docker运用这样广泛和火爆的原因,我也是作为一个初学者,带来这样一篇也帮助自己梳理一遍思路的入门教程


在下一篇里,我们会尝试把web项目也作为一个docker镜像设置在docker-compose.yml里,真正实现服务器部署一键up敬请期待~