A quick look at setting up WordPress in Docker using EasyEngine on Cloud or VPS.

Docker has excellent growth in the last few years and still growing. It is everywhere – from startup to enterprise.

Docker got some of the cool advantages over traditional VM, but this post is not to talk about that. If you are interested in learning in-depth, then I would recommend taking this online course.

Back to topic…

So you know or heard the Docker benefits and keen to try using for WordPress. Technically, there are many ways to do this but let’s check out EasyEngine which make life easier.

I’ve following tested on Google Cloud, but technically, it should work on any cloud hosting like DigitalOcean, Linode, AWS, Alibaba Cloud.

My Google Cloud instance is ready.

and, logged in as a root

EasyEngine is an automated script which needs to be installed on the server where you want to create a WordPress site. So let’s get it installed with the following commands.

Note: EasyEngine doesn’t work on CentOS yet, so you got to use either Debian or Ubuntu.

wget -qO ee rt.cx/ee4 && sudo bash ee

It will take a few minutes to install the necessary components including Docker, and you should see the following information before it returns to the prompt.

Status: Downloaded newer image for easyengine/redis:v4.0.0
+-------------------+----------------------------------------------------------------------------------+
| OS                | Linux 4.15.0-1025-gcp #26~16.04.1-Ubuntu SMP Wed Nov 21 10:13:20 UTC 2018 x86_64 |
| Shell             | /bin/bash                                                                        |
| PHP binary        | /usr/bin/php7.2                                                                  |
| PHP version       | 7.2.13-1+ubuntu16.04.1+deb.sury.org+1                                            |
| php.ini used      | /etc/php/7.2/cli/php.ini                                                         |
| EE root dir       | phar://ee.phar                                                                   |
| EE vendor dir     | phar://ee.phar/vendor                                                            |
| EE phar path      | /root                                                                            |
| EE packages dir   |                                                                                  |
| EE global config  |                                                                                  |
| EE project config |                                                                                  |
| EE version        | 4.0.6                                                                            |
+-------------------+----------------------------------------------------------------------------------+
-----> Run "ee help site" for more information on how to create a site.

This means EasyEngine is installed and ready to use to create a site. It depends on the requirement, and there are multiple types of sites you can create.

Ex:

  • Just an HTML site
  • WordPress site without caching or extra features
  • Create a PHP-based site with a database
  • A site with self-sign or let’s encrypt SSL certificate
  • Multi-site WordPress sites
  • WP site on sub-domain or sub-directory
  • WP site with Redis cache

You see, there are multiple combinations possibility and you can always refer their official documentation. For now, let’s create a WP site with Redis.

ee site create geekflarelab.com --type=wp --cache

Above, I am asking EasyEngine to create a WP site for geekflarelab.com and use a cache. It will take a few seconds, and you should see a success confirmation like below.

[email protected]:~# ee site create geekflarelab.com --type=wp --cache
Configuring project.
Creating WordPress site geekflarelab.com
Copying configuration files.
Starting site's services.
Downloading and configuring WordPress.
Success: Host entry successfully added.
Checking and verifying site-up status. This may take some time.

Installing WordPress site.
Success: http://geekflarelab.com has been created successfully!
Site entry created.
Creating cron entry
Success: Cron created successfully
+--------------------+----------------------------------------+
| Site               | http://geekflarelab.com                |
+--------------------+----------------------------------------+
| Site Root          | /opt/easyengine/sites/geekflarelab.com |
+--------------------+----------------------------------------+
| Site Title         | geekflarelab.com                       |
+--------------------+----------------------------------------+
| WordPress Username | stupefied-margulis                     |
+--------------------+----------------------------------------+
| WordPress Password | xxxxxxxxxxxx                           |
+--------------------+----------------------------------------+
| DB Host            | global-db                              |
+--------------------+----------------------------------------+
| DB Name            | geekflarelab_com                       |
+--------------------+----------------------------------------+
| DB User            | geekflarelab.com-bNmEbX                |
+--------------------+----------------------------------------+
| DB Password        | xxxxxxxxxxxx                           |
+--------------------+----------------------------------------+
| E-Mail             | [email protected]                 |
+--------------------+----------------------------------------+
| SSL                | Not Enabled                            |
+--------------------+----------------------------------------+
| Cache              | Enabled                                |
+--------------------+----------------------------------------+
[email protected]:~#

You see how fast it is to get your site up and running on the cloud?

Great!

Let’s verify what caching mechanism is used.

and, as you can see WP Redis is installed along with the site creation.

WP is running inside the docker, but you don’t have to do anything for it as everything is managed by EasyEngine scripts. Most of the time, you would be interacting with ee scripts. However, if you want to explore services running inside the docker, then you can check out the following.

Processes inside the docker

docker ps would show all the running services.

[email protected]:~# docker ps
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS              PORTS                                      NAMES
6f16b878d548        easyengine/cron:v4.0.0          "/usr/bin/ofelia dae…"   23 minutes ago      Up 23 minutes                                                  ee-cron-scheduler
18b7d9b4b8ac        easyengine/nginx:v4.0.0         "/usr/bin/openresty …"   24 minutes ago      Up 24 minutes       80/tcp                                     geekflarelabcom_nginx_1
5e36d6998bba        easyengine/postfix:v4.0.0       "postfix start-fg"       24 minutes ago      Up 24 minutes       25/tcp                                     geekflarelabcom_postfix_1
9fba9f5a2c77        easyengine/php:v4.0.0           "docker-entrypoint.s…"   24 minutes ago      Up 24 minutes       9000/tcp                                   geekflarelabcom_php_1
d022dd6635d3        easyengine/mariadb:v4.0.0       "docker-entrypoint.s…"   24 minutes ago      Up 24 minutes       3306/tcp                                   ee-global-db
5c29ba40fa06        easyengine/redis:v4.0.0         "docker-entrypoint.s…"   24 minutes ago      Up 24 minutes       6379/tcp                                   ee-global-redis
cae69382b545        easyengine/nginx-proxy:v4.0.1   "/app/docker-entrypo…"   15 hours ago        Up 35 minutes       0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   ee-global-nginx-proxy

As you can see, Nginx, PHP, MariaDB, Redis, Nginx, etc. – all running inside the docker.

Memory, IO, CPU stats

docker stats will give you real-time utilization statistics

CONTAINER ID        NAME                        CPU %               MEM USAGE / LIMIT    MEM %               NET I/O             BLOCK I/O           PIDS
6f16b878d548        ee-cron-scheduler           0.10%               6.246MiB / 1.65GiB   0.37%               1.82kB / 0B         582kB / 0B          7
18b7d9b4b8ac        geekflarelabcom_nginx_1     0.00%               4.316MiB / 1.65GiB   0.26%               3.94MB / 3.74MB     0B / 0B             2
5e36d6998bba        geekflarelabcom_postfix_1   0.00%               4.59MiB / 1.65GiB    0.27%               2.32kB / 688B       3MB / 0B            4
9fba9f5a2c77        geekflarelabcom_php_1       0.00%               12.86MiB / 1.65GiB   0.76%               38.4MB / 7.11MB     18.3MB / 180kB      1
d022dd6635d3        ee-global-db                0.05%               97.02MiB / 1.65GiB   5.74%               1.71MB / 1.75MB     59.7MB / 98.8MB     32
5c29ba40fa06        ee-global-redis             0.12%               2.48MiB / 1.65GiB    0.15%               3.31MB / 23.1MB     7.11MB / 0B         4
cae69382b545        ee-global-nginx-proxy       0.11%               8.988MiB / 1.65GiB   0.53%               2.95MB / 3.2MB      23.2MB / 53.2kB     19

Logs location

I understand you need to review the logs for troubleshooting and time to time. You can find them here.

Nginx & PHP – /opt/easyengine/sites/$SITENAME/logs

EE is well structured, and if interested to learn more then I would recommend checking their handbook. Running WordPress inside the Docker is easy now!

If you don’t want to manage WP server, optimization, security by yourself, then you may try Kinsta who take care of everything for you so you can focus on your core business.