November 6, 2017 · openkb mongodb Docker dockerfile

openKB + mongoDB with Docker

openKB is a "Open Source Nodejs Markdown based knowledge base (FAQ) app". I will demonstrate how to run openKB with Docker and also how to change from the embedded database to a mongoDB, also running in Docker.

I will use a standard CentOS 7 as the Docker host but this approach will work on any Linux-based Docker host.

There is a Dockerfile provided by the openKB project but I have made some adjustments so we will be using "my" Dockerfile.

Start by creating a new directory that we will be using to build our own openkb Docker image.

mkdir ~/openkb && cd ~/openkb

Create a new Dockerfile
vim Dockerfile

And paste the following

FROM alpine:3.6  
MAINTAINER dodgydudes  
RUN apk add --update nodejs nodejs-npm git && git clone https://github.com/mrvautin/openKB.git /var/openKB  
WORKDIR /var/openKB  
RUN npm install  
VOLUME /var/openKB/public/uploads/  
VOLUME /var/openKB/config  
EXPOSE 4444  
ENTRYPOINT ["npm", "start"]  

Build the Docker image
docker build -t openkb .

As we want the content in openKB to be persistent we need to create the following directories
mkdir -p /docker/openkb/config /docker/openkb/data /docker/openkb/upload

Feel free to change the directories to fit your needs and environment.

Fetch a copy of the config file and put it in the config directory
wget https://raw.githubusercontent.com/mrvautin/openKB/master/config/config.json -O /docker/openkb/config/config.json

Modify the config.json to use mongoDB instead of the embedded db. Specify the user and password of the user that will be used to connect to the mongoDB. We will soon create the actual user in mongoDB
vim /docker/openkb/config/config.json

"database": {
    "type": "mongodb",
    "connection_string": "mongodb://<user>:<pass>@mongo:27017/openkb"
    }

If you are using RHEL/CentOS as the Docker host you need to apply the following command as per the mongoDB documentation or else SELinux will give it a hard time
chcon -Rt svirt_sandbox_file_t /docker/openkb/data

In order to create the user that we will use to connect to the mongoDB we first need to start the mongoDB docker container
docker run --name mongo -v /docker/openkb/data:/data/db --rm -d mongo --auth

Notice the --auth at the end, this tells mongodb to run with authentication enabled.

When the mongoDB container has started we connect to it with the following command
docker exec -it mongo mongo admin

First of we need to create the initial admin account which we then will use to create the new user.

db.createUser({ user: '<some-admin-user>', pwd: '<some-admin-password>', roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] });  

Type exit to exit the mongoDB container.

Connect to the mongoDB container with the newly created admin user account

docker exec -it mongo mongo -u "<some-admin-user>" -p "<some-admin-pass>" --authenticationDatabase "admin"  

Switch from the "admin" db to the "openkb" db
use openkb

And create the new user with the same username and password as you typed in to the config.json file

db.createUser({ user: '<user>', pwd: '<pass>', roles: [ { role: "readWrite", db: "openkb" } ] });  

Type exit to exit the mongoDB container.

Now we are ready to try the database connection. We will use --link to create a connection between the openkb container and the mongodb container in order to save the data in mongoDB

docker run --name openkb --link mongo:mongo -itd --rm -p 4444:4444 -v /docker/openkb/config:/var/openKB/config -v /docker/openkb/uploads:/var/openKB/public/uploads openkb  

Open port 4444/tcp on your host if it is blocked by a firewall

firewall-cmd --zone=public --permanent --add-port=4444/tcp  
firewall-cmd --reload  

Then verify access to the openKB website, either via your browser or via curl
curl localhost:4444

If you want to run openKB and mongoDB with docker-compose I have made a docker-compose.yml that you can use. Create a new file called docker-compose.yml and paste the following

version: "2"  
services:  
  mongo:
   image: mongo:latest
   restart: always
   volumes: 
     - /docker/openkb/data:/data/db
   command: mongod --auth
  openkb:
    depends_on:
     - mongo
    restart: always
    image: openkb
    ports: 
     - "4444:4444"
    volumes:
     - /docker/openkb/uploads:/var/openKB/public/uploads
     - /docker/openkb/config:/var/openKB/config
    links:
     - mongo:mongo

Stop mongoDB and openKB if they are already running
docker stop openkb && docker stop mongo

Then we can start them again using the docker-compose file
docker-compose -f /path/to/docker-compose.yml up -d