Dockerize Omeka CMS
We had this activity in our “Advanced Computer Systems” class to deploy a collections archive website using a content management system written in PHP, Omeka CMS. What is Omeka CMS?
Omeka provides open-source web publishing platforms for sharing digital collections and media-rich online exhibits.
- omeka.org
What Omeka CMS is for? Resource sharing. Sharing resources is a valuable asset for hobbyists, enthusiasts, educational institutions and government offices. OMEKA provides such perk plus offers a lot more like publishing collections and digital contents through online exhibits.
My omeka website aptly called 221B Coder Street :D
Just in time, I am also learning Docker. In a nutshell, Docker creates a portable container or package for applications and services. It’s not only useful in development, it also takes a lot of provision, test and ship process. It makes it easy to bundle software requirements and dependencies. Many have adopted Docker as a go-to solution for containerizing the technology stack in order to have a product ready for development and production. It is no surprise that famous technologies written in PHP, like Wordpress, has a readily available Docker image.
Docker is an open platform for developers and sysadmins to build, ship, and run distributed applications, whether on laptops, data center VMs, or the cloud.
- docker.com
Admit it. It’s cute.
At the time, I have limited knowledge in using Docker all the while getting rusty in PHP. The instuctions given to us assumes installation and deployment on a bare metal server. Yet I still manage to get approval from my professor to use Docker. Just making sure this will be not all for nothing in the end just because I have a different method from the rest of the class.
Our goals:
- Create
Dockerfile
for our simple docker image - Use Docker Compose for defining and running services
- Deploy and use the CMS
It’s important to know the following points too:
Manual setup and deploy
Omeka CMS specifications is a standard LAMP stack. In detail its the following:
- Apache HTTP server (with
mod_rewrite
enabled) - MySQL >= v5.0
- PHP >= v5.3.2
- ImageMagick image manipulation software
A typical flow will look like this
$ sudo apt update && sudo apt install apache2 -y
# Make sure UFW firewall allows HTTP(S) traffic for Apache
sudo ufw allow in "Apache Full"
sudo apt install mysql-server -y
sudo apt install -y php libapache2-mod-php php-mcrypt php-mysql
# Enable mod_rewrite
sudo a2enmod rewrite && sudo /etc/init.d/apache2 restart
sudo apt install -y imagemagick
Next is to install and configure Omeka. Download the latest version of Omeka from https://omeka.org/classic/download/. Unzip the downloaded file and move to the directory discoverable by Apache web server.
# replace x.x by version downloaded
unzip omeka-x.x.zip /var/www/html
# set permissions to the web server
chown -R www-data:www-data /var/www/html/files
At this point, the only thing left is to update db.ini
to have the correct database configuration.
[database]
host = "<localhost-or-server-ip>"
username = "omekauser"
password = "omekapass"
dbname = "omekadb"
prefix = "omeka_"
charset = "utf8"
;port = ""
Now check http://localhost-or-ip/
and you should see Omeka ready for use.
Setup and deploy using Docker
Our Dockerfile
will be trimmed-fat version of the manual setup above.
FROM ubuntu:16.04
LABEL maintainer="Wonderful Being <[email protected]>"
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get upgrade -y
RUN apt-get install -y \
zip unzip \
php7.0 \
apache2 \
libapache2-mod-php7.0 \
php7.0-mysql \
php7.0-xml \
imagemagick \
openssh-server \
vnstat \
cron
# Enable mod_rewrite
RUN a2enmod rewrite && /etc/init.d/apache2 restart
# RUN rm /var/www/html/index.html
ADD omeka-2.6 /var/www/html
# Update the default apache site with the config we created.
ADD apache-config.conf /etc/apache2/sites-enabled/000-default.conf
# Set permissions
RUN chown -R www-data:www-data /var/www/html/files
COPY --chown=root:root omekactl /
EXPOSE 80
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]
ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
A companion docker-compose.yml
may look as simple as this
version: '3.3'
services:
omeka:
image: omeka:dev
env_file: .env
restart: always
Development workflow will look like this
docker build -t omeka:dev .
# compose
cd omeka-build
docker-compose up -d
# persist common files
docker volume create file-vol
docker volume ls
docker volume inspect file-vol
docker run --rm -d \
-p 4000:80 \
-v file-vol:/var/www/html/files \
--name omekabox \
omeka:dev
# debugging service
docker exec -it omekabox bash
# stopping service
docker stop omekabox
Deployment
A ready-to-run Docker image is available at the store so deploying your own will be as easy as:
docker pull aldnav/omeka:alpha
docker volume create file-vol
docker run --rm -d \
-p 80:80 \
-v file-vol:/var/www/html/files \
--name omekabox \
aldnav/omeka:alpha
Proceed to Omeka by visiting http://localhost/install/
Conclusion
Easy “A”.
I am happy for what the project has turned out. I get to learn the basics of Docker. There are a lot of things to improve.
You can check out my repository for the entirety of the project at https://github.com/aldnav/omeka-build