Use Docker-Compose To Start A Lightweight Virtual Machine Container of Locally Installed WordPress

I’m not a Docker guy because I don’t use it often. Basic commands such as “docker ps” are probably new to me, meaning I can’t easily remember them. Regardless, there are plenty of online resources for me to tap into regarding Docker, so I’m not too fretted about forgetting what command to use with Docker. Today, I found a fun Docker activity. Yep, you can already see I’m a Docker noob. Regardless, this activity is about creating a docker-compose file, then spinning up Docker to start all services that run a locally installed WordPress. This docker-compose file could be found on the Internet easily! I got a very fast Internet connection too, and so it took Docker about a minute or two, I think, to just pull the latest WordPress and MySQL 8 (or 5.7 if you want to use this version) images down to my local machine – and just a few more seconds to start the whole locally installed WordPress up.

Why is it fun to do this? Well, I’m not a PHP developer! This means I can’t just write any PHP script to take care of whatever itch I have with WordPress. WordPress is based on the PHP programming language. I am though love to code in Python, and so I thought — hmm… what if I want to Djangorize WordPress? This means, I want to export all WordPress blog posts I have on a WordPress website of mine to a Django blog web app that I will code soon – but I have way too many WordPress blog posts! The problem is I’m not also an XML guy, and so WordPress’s export file I downloaded gives me pause. Although XML’s basic rules aren’t hard – because it’s an extensive markup language – meaning tags are extensive (not restrictive like HTML) – meaning you can make up your own tags pretty much. For example, in HTML, you can only use a built-in tag such as <div></div>, but in XML you could just make up a tag like <friend></friend>. Anywho, but the XML file I downloaded from WordPress’s export (exported my WordPress blog posts) is so huge and long – one look at it I got confused. So, my original solution is to use docker to start a local WordPress up, import the export XML file from the WordPress XML file download earlier – and then just export all the blog posts to CSV. See, I can’t export WordPress blog posts directly to CSV earlier because I’m not hosting my own WordPress, but I’m using’s official WordPress hosting service; these guys don’t allow you to export your blog posts to any other format besides XML. Unfortunately, if I want to use local WordPress to import XML and then export to CSV file format, I have to pay for a WordPress plugin – which I don’t want to do! Regardless, it was fun to do docker-compose!

So, what now? I kick myself a bit because now I remember that Python got Pandas that can read XML files. So, I went to all the troubles with docker-compose for naught. On the plus side, I got a local backup of my current running WordPress blog. Hooray! Anyhow, I’ll use Python, Pandas, and BeautifulSoup to organize the XML blog post data to my liking in the future, and in this way, I’ll able to write a Python script that allows me to import WordPress blog posts to Django’s blog web app. For now, I’ll leave you with a fun docker-compose file that allows you to start up a docker container that contains essential running services like MySQL to let you play with a locally installed WordPress.

One more thing, you need to download Docker yourself before you can use this docker-compose file. Once downloaded and install Docker, create a new folder on a Windows machine and name it “wordpress-local”, but you can name this folder with whatever name you like. Copy and paste the docker-compose file below to a file in this “wordpress-local” folder – and save this file as “docker-compose.yml”. Open up Windows PowerShell terminal, change into the “wordpress-local” folder using commands like “cd C:\Users\your-user-name-here\wordpress-local“, make sure the “docker-compose.yml” file is in “wordpress-local” folder, and then you can do “docker-compose up -d” in the terminal. This will tell Docker to start pulling in images for the latest WordPress and whatever version MySQL you had coded in “docker-compose.yml” file, and then Docker will install these images, and start services to allow you to go to to install WordPress locally. The volume Docker creates will be persisted, but you can do “docker-compose down --volume” in the terminal to delete all persisted Docker volumes. If you just do “docker-compose down”, then only Docker containers get deleted but not the volumes. It is fine that Docker containers get deleted because Docker is meant to be used this way – all it takes for you is to do “docker-compose up -d” to recreate and start the container again.

Docker compose file is below:

version: '2.12.2'

       - db
     image: wordpress:latest
       - wordpress_files:/var/www/html
       - "80:80"
     restart: always
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress

     image: mysql:8
       - db_data:/var/lib/mysql
     restart: always
       MYSQL_ROOT_PASSWORD: root-abcdefg
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: abcdefg

The line where the “docker-compose.yml” file said “version: ‘2.12.2’, you can change it to your docker-compose version. In the terminal, do “docker-compose --version” to see your current docker-compose version. The password for WORDPRESS_DB_PASSWORD and MYSQL_PASSWORD needs to be the same – because the former one is for environment settings and the latter one is the actual password that you want to set with MySQL database. You can also change the password for MYSQL_ROOT_PASSWORD to something else if you like. Oh, I almost forgot, when trying to import WordPress blog posts from the download of WordPress’s export XML file, if your file is too big, WordPress may refuse to import the blog posts. This can be fixed easily.

First, you need to install nano or vim for the Docker container. You do not need to stop the running Docker container to do this. In the terminal, do “docker ps” to see the Docker’s CONTAINER ID. In the terminal, do docker exec -it enter-the-container-id-here bash -c "apt-get update && apt-get install -y nano". Once everything is done, you can do “docker exec -it enter-the-container-id-here /bin/sh“. This allows you to mimic how you would ssh into a Linux server, but in our case, we go inside the container. Now, you can do “nano .htaccess“. Go to the very end of the file (.htaccess), and type in two lines:

php_value upload_max_filesize 256M
php_value post_max_size 256M

Save the .htaccess file. You can also create phpinfo.php file by doing “nano phpinfo.php“.


Save the phpinfo.php file. Exit the container’s ssh-like environment by doing Ctrl-d on the keyboard. Now, you can go to to see if upload_max_filesize and post_max_size are actually 256 Megabytes. You can always increase the Megabytes sizes for these two php_values so WordPress can allow the importation of larger WordPress exported files. That’s it! Go ahead and import your blog posts to a local container and play around with locally installed WordPress using Docker. Have fun!

Enabling WebDAV On Fedora 16

Logo for the Apache HTTPD Server Project .

Image via Wikipedia

Here is how I enabled WebDAV on Fedora 16 (before starting, you need to know how to use a terminal/shell and change into root account from terminal/shell):

  1. I opened up ports 80 and 443 for the firewall
  2. I disabled SELinux
    1. Open up the file vi /etc/sysconfig/selinux by typing in the command vi /etc/sysconfig/selinux as root inside a terminal
    2. Change the line that says SELINUX=enforcing to SELINUX=disabled
    3. Save the /etc/sysconfig/selinux file and get out of vi
    4. Reboot the machine
  3. I installed Apache Web Server
    1. Inside a terminal as root, type in the command yum -y install httpd
    2. Edit the file vi /etc/httpd/conf/httpd.conf by typing in the command vi /etc/httpd/conf/httpd.conf inside a terminal as root user
    3. Change line #43 to ServerTokens Prod
    4. Change line #75 to KeepAlive On
    5. Change line #261 to root@localhost
    6. Change line #275 to ServerName localhost:80
    7. Change line #337 to AllowOverride All
    8. Change line #401 to DirectoryIndex index.html index.php
    9. Change line #535 to ServerSignature Off
    10. Comment out the line #758 to something like this #AdDefaultCharset UTF-8
    11. Save the file /etc/httpd/conf/httpd.conf and get out of vi
    12. Type the command systemctl start httpd.service inside the terminal as root user to start Apache web server
    13. Type the command systemctl enable httpd.service to enable the starting of Apache web server on each fresh boot
    14. Install PHP by typing command yum -y install php php-mbstring php-pear inside a terminal as root user
    15. Type the command systemctl restart httpd.service inside a terminal as root user to restart Apache web server
    16. Configuring SSL for Apache to serve websites in SSL mode (i.e., HTTPS) by installing mod_ssl, so type the command yum -y install mod_ssl inside a terminal as root user
    17. Edit the file vi /etc/httpd/conf.d/ssl.conf by typing in the command vi /etc/httpd/conf.d/ssl.conf inside a terminal as root user
    18. Uncomment the line #78 to DocumentRoot “/var/www/html”
    19. Uncomment the line #79 to ServerName localhost:443
    20. Uncomment line #112 if it’s not yet uncommented, so the line should look like this SSLCertificateFile /etc/pki/tls/certs/localhost.crt
    21. Uncomment the line #119 if it’s not yet uncommented, so the line should look like this SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
    22. Save the file /etc/httpd/conf.d/ssl.conf and get out of vi
    23. Type the command systemctl restart httpd.service to restart the Apache web server
  4. Create WebDAV server/protocol
    1. Inside a terminal as root user, type in the command mkdir /home/WebDAV to create a directory named WebDAV
    2. Change the owner for directory WebDAV by typing in the command chown apache. /home/WebDAV inside a terminal as root user
    3. Change permission for WebDAV directory to 770 by typing in the command chmod 770 /home/WebDAV inside a terminal as root user
    4. Make a webdav.conf file to configure WebDAV server by typing in the command vi /etc/httpd/conf.d/webdav.conf inside a terminal as root user
    5. Type the lines below into the file /etc/httpd/conf.d/webdav.conf using vi editor:
    6. Alias /share /home/WebDAV
    7. <location /share>
    8. DAV On
    9. SSLRequireSSL
    10. Options None
    11. AuthType Basic
    12. AuthName WebDAV
    13. AuthUserFile /etc/httpd/conf/.htpasswd
    14. <LimitExcept GET OPTIONS>
    15. Order allow,deny
    16. Allow from 192.168.1.
    17. Require valid-user
    18. </LimitExcept>
    19. </Location>
    20. Stop typing the stuffs into the file /etc/httpd/conf.d/webdav.conf and save it and get out of vi
    21. Type the command htpasswd -c /etc/httpd/conf/.htpasswd fedora inside a terminal as root user to add password for fedora user to use WebDAV server
    22. You will be asked to create a password and confirm password, so type in the same password twice
    23. Now you need to restart the Apache server by typing in the command systemctl restart httpd.service inside a terminal as root user

Log into the WebDAV server by using https://192.168.1.(enter the last bit of number for your server IP address here)/share.  You will be asked to enter username and password.  The username should be fedora, and the password is the password that you had created earlier.

Troubleshooting:  You should check to see if you can ping your Apache server. Check to see if Apache server has a daemon running (i.e., ps aux | grep httpd).  Check to make sure firewall ports 80 and 443 are opened.  Check to make sure SELinux is disabled.  Check to see the configuration file for httpd.conf is correctly configured.  Check to see the configuration file for webdav.conf is correctly configured.  If permission 770 for /home/WebDAV isn’t working, try to change it to 755 or 777.  Make sure you had enabled SSL for Apache correctly.  If all failed, you might want to reboot Apache and to see if problems could be resolved this way.

Installing Virtualmin On Ubuntu 10.04

New php developers and web designers who are wanting to develop their codes in a test environment, they need to learn how to set up a local server or a local server environment on their laptops and desktops.  It’s a dreaded thing for them to learn even more before they can have a test environment going so they can frequently upload their php scripts and related html codes.  It’s a lot of work!  Not to worry, I know an easier way for you to get a test server environment going!  I’m sure there are even easier ways than mine, but if you haven’t found out a better way yet, why not try my method, right?  So how?  One word, Virtualmin!

What’s Virtualmin?  It’s a control panel of sort that helps you manage your server using LAMP configuration.  For your information, LAMP stands for the combination of technologies involves with Linux, Apache, MySQL, and PHP.  Why is it easy to manage your test server or production server with Virtualmin?  For an example, you can create a new virtualhost account that has FTP access, SSH access, email account, SSL protocol for securing website, and a lot more by just filling out a single web page where you can enter new username and password for the new virtualhost account, check necessary boxes of features that you want your virtualhost account to have, and then accept the creation of your newly virtualhost account with one single last click on the create account button.  It’s simple as that!  It saves you time to open up a terminal, editing various configuration files of Apache, Bind, FTP, MySQL, and so on.  Just like any powerful control panel in the market, Virtualmin has many ways for you to manage your server either in the test environment or in the production environment with ease.

I have created a video which shows you how to install Virtualmin.  Also, in this video, I show you how to create a simple virtualhost account.  Check it out after the break!  Have any feedback or comment for me?  Don’t hesitate to write a feedback or a comment on my video.  I don’t mind if it’s a negative comment, because the more critical you’re, the more that I know you care!

Drupal’s Taxonomy

Not everyone knows how to use Taxonomy in Drupal.  Simply put, Taxonomy is how Drupal allows you create categories.  Watch the video below to see how you can create a category in Drupal using Taxonomy!  My apology on the watermark appears across the video since I’m only using the free version of the ScreenFlow screen recorder software.