Ni som läser denna blogg vet hur förälskad jag är i Docker. Jag tänkte nu försöka förklara hur du kan köra WordPress tillsammans med Docker. Det är ingen lätt process men det finns en stor uppsida:
- Flexibilitet – Möjlighet att flytta komponenter mellan servrar lätt. Exempelvis lyfta ur databasmotorn eller webbservern.
- Säkerhet – Allt separeras med hjälp av Linux Containers. Inte lika säkert som separata fysiska servrar eller virtuella maskiner.
- Skalbarhet – Att växla upp delkomponenter är snabbt och enkelt. Lägga till och ta bort memcached exempelvis.
- Driftsättning – Gå från utveckling, stage-miljö till driftsättning går snabbt och smidigt. Inga jobbiga beroenden som saknas eller är felaktiga.
Men hur gör man då? Jo först och främst är det några saker man måste tänka på:
- En docker med Nginx + WordPress
- Skrivbart filsystem för wp-content utanför dockern till WordPress.
- En docker med MySQL (eller MariaDB, Percona)
- Skrivbart filsystem för MySQL-databasen utanför dockern
- Framtid: En docker med memcached.
Då sätter vi igång. Jag går ej igenom hur du installerar Docker utan det kan du läsa här eller köra Vagrant som jag gör på Mac OS X.
Installera Nginx
Den första dockern vi skapar ska ha Nginx samt WordPress installerat. Port 80 för http ska exponeras utåt.
Först och främst kör vi igång kommandotolken bash i Ubuntu 13.10 samt installerar Nginx.
# mkdir -p /data/wordpress/
Först enligt ovan kommando så skapar vi en gemensam katalog för våra containrar samt värdsystemet som ligger under /data.
# docker run -v /data/wordpress:/data/wordpress -p 80:80 -i -t ubuntu:13.10 /bin/bash
# apt-get update
# apt-get -y dist-upgrade
# apt-get -y install php5-fpm php5-gd php5-mysqlnd nginx php5-cli php5-curl php5-json
Ändra sedan /etc/nginx/sites-enabled/default och lägg till konfigurationsdirektiv enligt exempelvis den konfigg-template du hittar här. Du kan även konfigurera tonvis med andra inställningar i Nginx för att uppnå optimal prestanda, men det är ligger utanför denna guide.
Du måste även sätta root till den delade katalogen /data/wordpress/ i Nginx-konfen samt lägga till nedan i /etc/nginx/nginx.conf:
daemon off;
Vi avslutar dockern genom att trycka ctrl-D eller skriva exit.
Sedan kör vi följande för att spara ändringarna vi har genomfört i vår docker. Obs detta är viktigt annars går allt förlorat:
# docker ps -a
Kontrollera sedan vilket container ID den dockern vi just jobbade med och skriv ner ändringarna permanent genom en commit:
# docker commit 5d jonaslejon/nginx-wp:version1
Det räcker att skriva exempelvis de första två tecken i container ID. Ovan exempel så skriver jag bara 5d.
WordPress installation
Nästa steg är att ladda hem och installera WordPress. Detta görs genom att vi ansluter till dockern som vi just installerade Nginx på:
# docker run -v /data/wordpress:/data/wordpress -p 80:80 -i -t jonaslejon/nginx-wp:version1 bash
Sedan installerar vi wget samt går vi till root-katalogen för webbservern vilket i mitt fall är enligt följande:
# apt-get -y install wget
# chown www-data /data/wordpress/
# cd /data/wordpress/
# wget http://sv.wordpress.org/wordpress-3.8.1-sv_SE.tar.gz
# tar xvfz wordpress-3.8.1-sv_SE.tar.gz
# mv wordpress/* .
# exit
Då var WordPress och Nginx installerat. Och glöm framförallt inte att göra en commit på ändringarna:
# docker ps -a
# docker commit 7e6b550faa50 jonaslejon/nginx-wp:version3
Installation av MySQL, MariaDB eller Percona Server
Här ska vi inte glömma att skapa MySQL dockern i en helt ny docker och inte fortsätta med föregående Nginx-docker.
# mkdir -p /data/mysql
Först skapar vi en gemensam katalog där filerna till databasen ska leva kvar. Sen kör vi igång en docker och delar katalogen:
# docker run -v /data/mysql:/data/mysql -p 3306:3306 -i -t ubuntu:13.10 /bin/bash
# apt-get -y install mysql-server
# chown ubuntu /data/mysql
# vi /etc/mysql/my.cnf
# service mysql start
# echo "create database wordpress"|mysql -plösenord
# echo "GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'localhost' IDENTIFIED BY 'wplösenord'" | mysql -plösenord
# exit
# docker ps -a
# docker commit 1f9b38696a7f jonaslejon/mysql:version1
Ovan så ändrar du även i konfigg-filen /etc/mysql/my.cnf där datadir finns (jag gör det med vi). Ändra katalogen från /var/lib/mysql till /data/mysql/.
Jag skapar även ovan en ny databas med namnet wordpress samt en användare med namnet wordpress och lösenordet wplösenord.
Om allt sedan fungerar och du har gjort en commit så kan du testa denna docker med:
# docker run -v /data/mysql:/data/mysql -p 3306:3306 -i -t jonaslejon/mysql:version1 /usr/bin/mysqld_safe
Starta upp allt
Då var två stycken Docker-containers skapade. Vi ska nu starta upp dessa och hoppas på att allt går vägen. Skillnaden här är att vi anger -d så att containrarna läggs i bakgrunden:
# docker run -d -v /data/mysql:/data/mysql -p 3306:3306 -i -t jonaslejon/mysql:version1 /usr/bin/mysqld_safe
Det vi gör sedan är att titta med docker ps:
Samt kontrollera loggarna från containern:
Ser bra ut! Då ska vi starta upp webbservern Nginx:
# docker run -v /data/wordpress:/data/wordpress -p 80:80 -i -t jonaslejon/nginx-wp:version3 sh -c "service php5-fpm start && service nginx start"
Verifiera att allt körs med hjälp av docker ps-kommandot.
Avslutande anmärkningar
Nu behöver du bara konfigurera WordPress genom att surfa till localhost:80. Detta står även under PORTS när du kör docker ps.
IP-adressen som du behöver när du konfigurerar WordPress-installationen till MySQL-databasen kan du få ut genom att köra inspect på rätt container:
# docker inspect c6e0c1e4e5f0|grep -i ipaddress
"IPAddress": "172.17.0.2",
Om du ansluter via Vagrant mot containrarna så måste du även konfigurera i Vagrantfile alternativt när du kör vagrant up på följande sätt:
# FORWARD_PORTS=80,3306 vagrant [up|reload]
Övrigt
- Du behöver inte ha en delad /data-katalog som jag kör med. Men bra om du vill ha data som ska leva en längre tid.
- Du kan även köra Nginx och MySQL på samma container.
- Supervisord kan vara bra att använda för att starta upp och hålla koll på processer.
- Det finns färdiga containers i det centrala docker-indexet. Sök genom kommandot docker search wordpress eller klicka här >
- Det finns ett fiffigt sätt att automatiskt koppla ihop två containers genom att använda -link argumentet. Då läggs miljövariablar innehållandes port samt IP-nummer till automatiskt på följande sätt:

Gillar du detta blogginlägg? Donera gärna till min Bitcoin-adress nedan eller dela detta inlägg i sociala medier.
- 13cxyC2sFvNfAAShcAaSs2YMW3Q4ygstD4