Steer clear from unnecessary complexity by running everything in a single container
Today we’re dragging LAMP into the 21st century in the worst possible way.
Much of the world wide web reportedly runs on PHP. This includes large online platforms, like Facebook, Flickr, and Wikipedia, but also a countless number of WordPress-based corporate websites and personal blogs.
This does not mean that PHP is a popular programming language. In fact, it’s probably one of the most ridiculed languages on the internet (*). WordPress’s reputation isn’t exactly stellar among web
developers either.
(*) The other one being its stupid cousin, JavaScript. Nowadays JavaScript gets lots of love though.
EvErYtHiNg WaS bEtTeR iN tHe PaSt
Now, there are a lot of reasons to hate on PHP (and WordPress). Some of those are perfectly justified. Most however are based on negative experiences that people once had with some version of the language or ecosystem that hasn’t existed for a very long time now.
The language, its interpreter, community, and ecosystem have all made huge leaps forward, to the point where everything about it is basically just a slightly different Java. Things are pretty okay nowadays.
But sometimes I do long for the “good old days”, when you could still get away with absolutely awful spaghetti code without tests, debug code by (repeatedly) adding var_dump()
s to your PHP files on production, and deploy new code by just FTP’ing a bunch of files to the right directory.
Today, we’re going to use modern development and hosting tools to relive those good old days – or at least parts of it. We’ll do this by packaging WordPress and some other stuff into a Docker container and hosting it on a local Kubernetes cluster as if it is a virtual machine.
Packaging our app
The first thing we need is Docker, a tool that lets you run your code in containers. A container contains your code and an operating system, so it is kind of like a virtual machine, except that it is not a virtual machine.
Containers can be provisioned using a so-called Dockerfile. A Dockerfile is sort of like a shell script, except that it is not a shell script.
One major difference between shell scripts and Dockerfiles, is that Dockerfiles also specify which operating system you’ll use. In our case, we’ll go with the latest LTS version of Ubuntu, for no reason other than that it is a popular choice among those who maintain actual virtual machines:
FROM ubuntu:20.04
Almost everything after this line looks a lot like a shell script, albeit one with a slightly more convoluted syntax. For example, this is how we install the packages that we need in our container:
# Make sure that we don’t get annoying prompts
ARG DEBIAN_FRONTEND=noninteractive
# Install our best friends; Apache, MySQL, and PHP. And also some other stuff
# that we may or may not need
RUN apt update \
&& \
apt install -y \
wordpress \
php \
libapache2-mod-php \
mysql-server \
php-mysql \
php-mbstring \
php-zip \
php-gd \
php-json \
php-curl \
phpmyadmin \
htop \
less \
vim \
sl \
&& \
ln -s /usr/games/sl /usr/bin/sl
Note that we put everything into a single RUN
instruction. This is something that you see often in Dockerfiles, because it’s a best practice.
(**) Of course, in reality it’s a bit more nuanced than that. You can always check out Docker’s documentation of best practices if you need a real guide.
Since we’re not particularly interested in following best (or even acceptable) practices in this guide we’ll just use individual instructions as much as possible, if only because I think it looks prettier.
Anyway, in the previous snippet we used apt
to install two web applications: WordPress and phpMyAdmin. We still need to configure them so that they can be accessed via Apache and know how to connect to the database:
# Configure Apache so that it can serve WordPress and phpMyadmin
COPY wordpress.conf /etc/apache2/sites-available/wordpress.conf
COPY phpmyadmin.conf /etc/apache2/sites-available/phpmyadmin.conf
# Make sure that Apache will actually serve our applications
RUN a2ensite wordpress
RUN a2ensite phpmyadmin
RUN a2enmod rewrite
# Create database accounts
RUN service mysql start \
&& \
mysql -e 'CREATE DATABASE wordpress;' \
&& \
mysql -e "CREATE USER wordpress@localhost IDENTIFIED BY 'wordpress';" \
&& \
mysql -e "GRANT ALL ON wordpress.* TO wordpress@localhost;" \
&& \
mysql -e "CREATE USER phpmyadmin@localhost IDENTIFIED BY 'phpmyadmin';" \
&& \
mysql -e "GRANT ALL ON *.* TO phpmyadmin@localhost;" \
&& \
mysql -e "CREATE USER pma@localhost IDENTIFIED BY 'pmapass';" \
&& \
mysql -e "GRANT ALL ON *.* TO pma@localhost;" \
&& \
mysql -e 'FLUSH PRIVILEGES;'
# Configure applications with database credentials
COPY phpmyadmin-config.php /etc/phpmyadmin/config-db.php
COPY wordpress-config.php /etc/wordpress/config-localhost.php
As you can see, I took the liberty of hardcoding some credentials that are easy to remember, so you’ll never have to worry about locking yourself out of the system!
Speaking of which, we’ll also pretend that we care about security by installing and configuring ufw
so that it allows traffic for ports between 1 and 443 (which we do not actually use in this guide, but whatever):
# This doesn’t do much, but at least we’ve installed and configured something
RUN apt install -y ufw
RUN ufw allow 1:443/tcp
# Why would you want this? I don’t know, but let’s do it anyway
EXPOSE 1
EXPOSE 2
EXPOSE 3
EXPOSE 4
EXPOSE 5
EXPOSE 6
EXPOSE 7
EXPOSE 8
EXPOSE 9
EXPOSE 10
EXPOSE 11
EXPOSE 12
EXPOSE 13
EXPOSE 14
EXPOSE 15
EXPOSE 16
EXPOSE 17
EXPOSE 18
EXPOSE 19
EXPOSE 20
EXPOSE 21
EXPOSE 22
EXPOSE 23
EXPOSE 24
EXPOSE 25
EXPOSE 26
EXPOSE 27
EXPOSE 28
EXPOSE 29
EXPOSE 30
EXPOSE 31
# I may have omitted a line or 412 here
There is one very important thing that we haven’t done yet: we still need to start the Apache web server using CMD
, which is sort of like RUN
, except that it’s the thing that is executed when the container is actually running.
There are also two other very important things.
Remember that MySQL server that we had started earlier so that we could create some database users? It’s no longer up at this point, so we’ll need to start it again as well.
Moreover, Docker containers stop when their main process stops. In our case, we want to start two perpetually running processes via service start
. However, these commands exit once they have started the service in the background and thus so will our container.
Fortunately, we can easily keep our Docker container alive by keeping it comatose until the end of time by adding sleep infinity
to our CMD
instruction:
CMD \
service apache2 start \
&& \
service mysql start \
&& \
sleep infinity
The resulting Dockerfile can be found in the accompanying GitHub repository, along with the various configuration files that were referenced in the snippets above.
We can build a container by executing the following command in the directory that contains the Dockerfile
and configuration files for WordPress and phpMyAdmin:
docker build -t chunfeilung/kubernutty .
The -t chunfeilung/kubernutty
part is used to name the container, which you can also find on Docker Hub.
Run our app with Docker
Our container can be started by executing the following command:
docker run -d -P -p 80:80 chunfeilung/kubernutty
This will take a few seconds. Not only because the container needs to start multiple services, but also because we have exposed an obscene number of ports | I have since learned that exposing too many ports is a very effective way to off the Docker daemon. in our Dockerfile.
It’s worth the wait though; the end result looks glorious in docker ps
! The formatted output below is reasonably close to what I’m seeing on my screen.
Article continues below big-ass code block
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS
NAMES 85c102059687 chunfeilung/ku
bernutty "/bin/sh -c 'service…" 33 seconds ago Up 3 seconds 0.0.0.0:80->
80/tcp, :::80->80/tcp, 0.0.0.0:58967->1/tcp, :::58968->1/tcp, 0.0.0.0:58966->2/t
cp, :::58967->2/tcp, 0.0.0.0:58965->3/tcp, :::58966->3/tcp, 0.0.0.0:58964->4/tcp
, :::58965->4/tcp, 0.0.0.0:58963->5/tcp, :::58964->5/tcp, 0.0.0.0:58962->6/tcp,
:::58963->6/tcp, 0.0.0.0:58961->7/tcp, :::58962->7/tcp, 0.0.0.0:58960->8/tcp, ::
:58961->8/tcp, 0.0.0.0:58959->9/tcp, :::58960->9/tcp, 0.0.0.0:58958->10/tcp, :::
58959->10/tcp, 0.0.0.0:58957->11/tcp, :::58958->11/tcp, 0.0.0.0:58956->12/tcp, :
::58957->12/tcp, 0.0.0.0:58955->13/tcp, :::58956->13/tcp, 0.0.0.0:58954->14/tcp,
:::58955->14/tcp, 0.0.0.0:58953->15/tcp, :::58954->15/tcp, 0.0.0.0:58952->16/tc
p, :::58953->16/tcp, 0.0.0.0:58951->17/tcp, :::58952->17/tcp, 0.0.0.0:58950->18/
tcp, :::58951->18/tcp, 0.0.0.0:58949->19/tcp, :::58950->19/tcp, 0.0.0.0:58948->2
0/tcp, :::58949->20/tcp, 0.0.0.0:58947->21/tcp, :::58948->21/tcp, 0.0.0.0:58946-
>22/tcp, :::58947->22/tcp, 0.0.0.0:58945->23/tcp, :::58946->23/tcp, 0.0.0.0:5894
4->24/tcp, :::58945->24/tcp, 0.0.0.0:58943->25/tcp, :::58944->25/tcp, 0.0.0.0:58
942->26/tcp, :::58943->26/tcp, 0.0.0.0:58941->27/tcp, :::58942->27/tcp, 0.0.0.0:
58940->28/tcp, :::58941->28/tcp, 0.0.0.0:58939->29/tcp, :::58940->29/tcp, 0.0.0.
0:58938->30/tcp, :::58939->30/tcp, 0.0.0.0:58937->31/tcp, :::58938->31/tcp, 0.0.
0.0:58936->32/tcp, :::58937->32/tcp, 0.0.0.0:58935->33/tcp, :::58936->33/tcp, 0.
0.0.0:58934->34/tcp, :::58935->34/tcp, 0.0.0.0:58933->35/tcp, :::58934->35/tcp,
0.0.0.0:58932->36/tcp, :::58933->36/tcp, 0.0.0.0:58931->37/tcp, :::58932->37/tcp
, 0.0.0.0:58930->38/tcp, :::58931->38/tcp, 0.0.0.0:58929->39/tcp, :::58930->39/t
cp, 0.0.0.0:58928->40/tcp, :::58929->40/tcp, 0.0.0.0:58927->41/tcp, :::58928->41
/tcp, 0.0.0.0:58926->42/tcp, :::58927->42/tcp, 0.0.0.0:58925->43/tcp, :::58926->
43/tcp, 0.0.0.0:58924->44/tcp, :::58925->44/tcp, 0.0.0.0:58923->45/tcp, :::58924
->45/tcp, 0.0.0.0:58922->46/tcp, :::58923->46/tcp, 0.0.0.0:58921->47/tcp, :::589
22->47/tcp, 0.0.0.0:58920->48/tcp, :::58921->48/tcp, 0.0.0.0:58919->49/tcp, :::5
8920->49/tcp, 0.0.0.0:58918->50/tcp, :::58919->50/tcp, 0.0.0.0:58917->51/tcp, ::
:58918->51/tcp, 0.0.0.0:58916->52/tcp, :::58917->52/tcp, 0.0.0.0:58915->53/tcp,
:::58916->53/tcp, 0.0.0.0:58914->54/tcp, :::58915->54/tcp, 0.0.0.0:58913->55/tcp
, :::58914->55/tcp, 0.0.0.0:58912->56/tcp, :::58913->56/tcp, 0.0.0.0:58911->57/t
cp, :::58912->57/tcp, 0.0.0.0:58910->58/tcp, :::58911->58/tcp, 0.0.0.0:58909->59
/tcp, :::58910->59/tcp, 0.0.0.0:58908->60/tcp, :::58909->60/tcp, 0.0.0.0:58907->
61/tcp, :::58908->61/tcp, 0.0.0.0:58906->62/tcp, :::58907->62/tcp, 0.0.0.0:58905
->63/tcp, :::58906->63/tcp, 0.0.0.0:58904->64/tcp, :::58905->64/tcp, 0.0.0.0:589
03->65/tcp, :::58904->65/tcp, 0.0.0.0:58902->66/tcp, :::58903->66/tcp, 0.0.0.0:5
8901->67/tcp, :::58902->67/tcp, 0.0.0.0:58900->68/tcp, :::58901->68/tcp, 0.0.0.0
:58899->69/tcp, :::58900->69/tcp, 0.0.0.0:58898->70/tcp, :::58899->70/tcp, 0.0.0
.0:58897->71/tcp, :::58898->71/tcp, 0.0.0.0:58896->72/tcp, :::58897->72/tcp, 0.0
.0.0:58895->73/tcp, :::58896->73/tcp, 0.0.0.0:58894->74/tcp, :::58895->74/tcp, 0
.0.0.0:58893->75/tcp, :::58894->75/tcp, 0.0.0.0:58892->76/tcp, :::58893->76/tcp,
0.0.0.0:58891->77/tcp, :::58892->77/tcp, 0.0.0.0:58890->78/tcp, :::58891->78/tc
p, 0.0.0.0:58889->79/tcp, :::58890->79/tcp, 0.0.0.0:58888->81/tcp, :::58889->81/
tcp, 0.0.0.0:58887->82/tcp, :::58888->82/tcp, 0.0.0.0:58886->83/tcp, :::58887->8
3/tcp, 0.0.0.0:58885->84/tcp, :::58886->84/tcp, 0.0.0.0:58884->85/tcp, :::58885-
>85/tcp, 0.0.0.0:58883->86/tcp, :::58884->86/tcp, 0.0.0.0:58882->87/tcp, :::5888
3->87/tcp, 0.0.0.0:58881->88/tcp, :::58882->88/tcp, 0.0.0.0:58880->89/tcp, :::58
881->89/tcp, 0.0.0.0:58879->90/tcp, :::58880->90/tcp, 0.0.0.0:58878->91/tcp, :::
58879->91/tcp, 0.0.0.0:58877->92/tcp, :::58878->92/tcp, 0.0.0.0:58876->93/tcp, :
::58877->93/tcp, 0.0.0.0:58875->94/tcp, :::58876->94/tcp, 0.0.0.0:58874->95/tcp,
:::58875->95/tcp, 0.0.0.0:58873->96/tcp, :::58874->96/tcp, 0.0.0.0:58872->97/tc
p, :::58873->97/tcp, 0.0.0.0:58871->98/tcp, :::58872->98/tcp, 0.0.0.0:58870->99/
tcp, :::58871->99/tcp, 0.0.0.0:58869->100/tcp, :::58870->100/tcp, 0.0.0.0:58868-
>101/tcp, :::58869->101/tcp, 0.0.0.0:58867->102/tcp, :::58868->102/tcp, 0.0.0.0:
58866->103/tcp, :::58867->103/tcp, 0.0.0.0:58865->104/tcp, :::58866->104/tcp, 0.
0.0.0:58864->105/tcp, :::58865->105/tcp, 0.0.0.0:58863->106/tcp, :::58864->106/t
cp, 0.0.0.0:58862->107/tcp, :::58863->107/tcp, 0.0.0.0:58861->108/tcp, :::58862-
>108/tcp, 0.0.0.0:58860->109/tcp, :::58861->109/tcp, 0.0.0.0:58859->110/tcp, :::
58860->110/tcp, 0.0.0.0:58858->111/tcp, :::58859->111/tcp, 0.0.0.0:58857->112/tc
p, :::58858->112/tcp, 0.0.0.0:58856->113/tcp, :::58857->113/tcp, 0.0.0.0:58855->
114/tcp, :::58856->114/tcp, 0.0.0.0:58854->115/tcp, :::58855->115/tcp, 0.0.0.0:5
8853->116/tcp, :::58854->116/tcp, 0.0.0.0:58852->117/tcp, :::58853->117/tcp, 0.0
.0.0:58851->118/tcp, :::58852->118/tcp, 0.0.0.0:58850->119/tcp, :::58851->119/tc
p, 0.0.0.0:58849->120/tcp, :::58850->120/tcp, 0.0.0.0:58848->121/tcp, :::58849->
121/tcp, 0.0.0.0:58847->122/tcp, :::58848->122/tcp, 0.0.0.0:58846->123/tcp, :::5
8847->123/tcp, 0.0.0.0:58845->124/tcp, :::58846->124/tcp, 0.0.0.0:58844->125/tcp
, :::58845->125/tcp, 0.0.0.0:58843->126/tcp, :::58844->126/tcp, 0.0.0.0:58842->1
27/tcp, :::58843->127/tcp, 0.0.0.0:58841->128/tcp, :::58842->128/tcp, 0.0.0.0:58
840->129/tcp, :::58841->129/tcp, 0.0.0.0:58839->130/tcp, :::58840->130/tcp, 0.0.
0.0:58838->131/tcp, :::58839->131/tcp, 0.0.0.0:58837->132/tcp, :::58838->132/tcp
, 0.0.0.0:58836->133/tcp, :::58837->133/tcp, 0.0.0.0:58835->134/tcp, :::58836->1
34/tcp, 0.0.0.0:58834->135/tcp, :::58835->135/tcp, 0.0.0.0:58833->136/tcp, :::58
834->136/tcp, 0.0.0.0:58832->137/tcp, :::58833->137/tcp, 0.0.0.0:58831->138/tcp,
:::58832->138/tcp, 0.0.0.0:58830->139/tcp, :::58831->139/tcp, 0.0.0.0:58829->14
0/tcp, :::58830->140/tcp, 0.0.0.0:58828->141/tcp, :::58829->141/tcp, 0.0.0.0:588
27->142/tcp, :::58828->142/tcp, 0.0.0.0:58826->143/tcp, :::58827->143/tcp, 0.0.0
.0:58825->144/tcp, :::58826->144/tcp, 0.0.0.0:58824->145/tcp, :::58825->145/tcp,
0.0.0.0:58823->146/tcp, :::58824->146/tcp, 0.0.0.0:58822->147/tcp, :::58823->14
7/tcp, 0.0.0.0:58821->148/tcp, :::58822->148/tcp, 0.0.0.0:58820->149/tcp, :::588
21->149/tcp, 0.0.0.0:58819->150/tcp, :::58820->150/tcp, 0.0.0.0:58818->151/tcp,
:::58819->151/tcp, 0.0.0.0:58817->152/tcp, :::58818->152/tcp, 0.0.0.0:58816->153
/tcp, :::58817->153/tcp, 0.0.0.0:58815->154/tcp, :::58816->154/tcp, 0.0.0.0:5881
4->155/tcp, :::58815->155/tcp, 0.0.0.0:58813->156/tcp, :::58814->156/tcp, 0.0.0.
0:58812->157/tcp, :::58813->157/tcp, 0.0.0.0:58811->158/tcp, :::58812->158/tcp,
0.0.0.0:58810->159/tcp, :::58811->159/tcp, 0.0.0.0:58809->160/tcp, :::58810->160
/tcp, 0.0.0.0:58808->161/tcp, :::58809->161/tcp, 0.0.0.0:58807->162/tcp, :::5880
8->162/tcp, 0.0.0.0:58806->163/tcp, :::58807->163/tcp, 0.0.0.0:58805->164/tcp, :
::58806->164/tcp, 0.0.0.0:58804->165/tcp, :::58805->165/tcp, 0.0.0.0:58803->166/
tcp, :::58804->166/tcp, 0.0.0.0:58802->167/tcp, :::58803->167/tcp, 0.0.0.0:58801
->168/tcp, :::58802->168/tcp, 0.0.0.0:58800->169/tcp, :::58801->169/tcp, 0.0.0.0
:58799->170/tcp, :::58800->170/tcp, 0.0.0.0:58798->171/tcp, :::58799->171/tcp, 0
.0.0.0:58797->172/tcp, :::58798->172/tcp, 0.0.0.0:58796->173/tcp, :::58797->173/
tcp, 0.0.0.0:58795->174/tcp, :::58796->174/tcp, 0.0.0.0:58794->175/tcp, :::58795
->175/tcp, 0.0.0.0:58793->176/tcp, :::58794->176/tcp, 0.0.0.0:58792->177/tcp, ::
:58793->177/tcp, 0.0.0.0:58791->178/tcp, :::58792->178/tcp, 0.0.0.0:58790->179/t
cp, :::58791->179/tcp, 0.0.0.0:58789->180/tcp, :::58790->180/tcp, 0.0.0.0:58788-
>181/tcp, :::58789->181/tcp, 0.0.0.0:58787->182/tcp, :::58788->182/tcp, 0.0.0.0:
58786->183/tcp, :::58787->183/tcp, 0.0.0.0:58785->184/tcp, :::58786->184/tcp, 0.
0.0.0:58784->185/tcp, :::58785->185/tcp, 0.0.0.0:58783->186/tcp, :::58784->186/t
cp, 0.0.0.0:58782->187/tcp, :::58783->187/tcp, 0.0.0.0:58781->188/tcp, :::58782-
>188/tcp, 0.0.0.0:58780->189/tcp, :::58781->189/tcp, 0.0.0.0:58779->190/tcp, :::
58780->190/tcp, 0.0.0.0:58778->191/tcp, :::58779->191/tcp, 0.0.0.0:58777->192/tc
p, :::58778->192/tcp, 0.0.0.0:58776->193/tcp, :::58777->193/tcp, 0.0.0.0:58775->
194/tcp, :::58776->194/tcp, 0.0.0.0:58774->195/tcp, :::58775->195/tcp, 0.0.0.0:5
8773->196/tcp, :::58774->196/tcp, 0.0.0.0:58772->197/tcp, :::58773->197/tcp, 0.0
.0.0:58771->198/tcp, :::58772->198/tcp, 0.0.0.0:58770->199/tcp, :::58771->199/tc
p, 0.0.0.0:58769->200/tcp, :::58770->200/tcp, 0.0.0.0:58768->201/tcp, :::58769->
201/tcp, 0.0.0.0:58767->202/tcp, :::58768->202/tcp, 0.0.0.0:58766->203/tcp, :::5
8767->203/tcp, 0.0.0.0:58765->204/tcp, :::58766->204/tcp, 0.0.0.0:58764->205/tcp
, :::58765->205/tcp, 0.0.0.0:58763->206/tcp, :::58764->206/tcp, 0.0.0.0:58762->2
07/tcp, :::58763->207/tcp, 0.0.0.0:58761->208/tcp, :::58762->208/tcp, 0.0.0.0:58
760->209/tcp, :::58761->209/tcp, 0.0.0.0:58759->210/tcp, :::58760->210/tcp, 0.0.
0.0:58758->211/tcp, :::58759->211/tcp, 0.0.0.0:58757->212/tcp, :::58758->212/tcp
, 0.0.0.0:58756->213/tcp, :::58757->213/tcp, 0.0.0.0:58755->214/tcp, :::58756->2
14/tcp, 0.0.0.0:58754->215/tcp, :::58755->215/tcp, 0.0.0.0:58753->216/tcp, :::58
754->216/tcp, 0.0.0.0:58752->217/tcp, :::58753->217/tcp, 0.0.0.0:58751->218/tcp,
:::58752->218/tcp, 0.0.0.0:58750->219/tcp, :::58751->219/tcp, 0.0.0.0:58749->22
0/tcp, :::58750->220/tcp, 0.0.0.0:58748->221/tcp, :::58749->221/tcp, 0.0.0.0:587
47->222/tcp, :::58748->222/tcp, 0.0.0.0:58746->223/tcp, :::58747->223/tcp, 0.0.0
.0:58745->224/tcp, :::58746->224/tcp, 0.0.0.0:58744->225/tcp, :::58745->225/tcp,
0.0.0.0:58743->226/tcp, :::58744->226/tcp, 0.0.0.0:58742->227/tcp, :::58743->22
7/tcp, 0.0.0.0:58741->228/tcp, :::58742->228/tcp, 0.0.0.0:58740->229/tcp, :::587
41->229/tcp, 0.0.0.0:58739->230/tcp, :::58740->230/tcp, 0.0.0.0:58738->231/tcp,
:::58739->231/tcp, 0.0.0.0:58737->232/tcp, :::58738->232/tcp, 0.0.0.0:58736->233
/tcp, :::58737->233/tcp, 0.0.0.0:58735->234/tcp, :::58736->234/tcp, 0.0.0.0:5873
4->235/tcp, :::58735->235/tcp, 0.0.0.0:58733->236/tcp, :::58734->236/tcp, 0.0.0.
0:58732->237/tcp, :::58733->237/tcp, 0.0.0.0:58731->238/tcp, :::58732->238/tcp,
0.0.0.0:58730->239/tcp, :::58731->239/tcp, 0.0.0.0:58729->240/tcp, :::58730->240
/tcp, 0.0.0.0:58728->241/tcp, :::58729->241/tcp, 0.0.0.0:58727->242/tcp, :::5872
8->242/tcp, 0.0.0.0:58726->243/tcp, :::58727->243/tcp, 0.0.0.0:58725->244/tcp, :
::58726->244/tcp, 0.0.0.0:58724->245/tcp, :::58725->245/tcp, 0.0.0.0:58723->246/
tcp, :::58724->246/tcp, 0.0.0.0:58722->247/tcp, :::58723->247/tcp, 0.0.0.0:58721
->248/tcp, :::58722->248/tcp, 0.0.0.0:58720->249/tcp, :::58721->249/tcp, 0.0.0.0
:58719->250/tcp, :::58720->250/tcp, 0.0.0.0:58718->251/tcp, :::58719->251/tcp, 0
.0.0.0:58717->252/tcp, :::58718->252/tcp, 0.0.0.0:58716->253/tcp, :::58717->253/
tcp, 0.0.0.0:58715->254/tcp, :::58716->254/tcp, 0.0.0.0:58714->255/tcp, :::58715
->255/tcp, 0.0.0.0:58713->256/tcp, :::58714->256/tcp, 0.0.0.0:58712->257/tcp, ::
:58713->257/tcp, 0.0.0.0:58711->258/tcp, :::58712->258/tcp, 0.0.0.0:58710->259/t
cp, :::58711->259/tcp, 0.0.0.0:58709->260/tcp, :::58710->260/tcp, 0.0.0.0:58708-
>261/tcp, :::58709->261/tcp, 0.0.0.0:58707->262/tcp, :::58708->262/tcp, 0.0.0.0:
58706->263/tcp, :::58707->263/tcp, 0.0.0.0:58705->264/tcp, :::58706->264/tcp, 0.
0.0.0:58704->265/tcp, :::58705->265/tcp, 0.0.0.0:58703->266/tcp, :::58704->266/t
cp, 0.0.0.0:58702->267/tcp, :::58703->267/tcp, 0.0.0.0:58701->268/tcp, :::58702-
>268/tcp, 0.0.0.0:58700->269/tcp, :::58701->269/tcp, 0.0.0.0:58699->270/tcp, :::
58700->270/tcp, 0.0.0.0:58698->271/tcp, :::58699->271/tcp, 0.0.0.0:58697->272/tc
p, :::58698->272/tcp, 0.0.0.0:58696->273/tcp, :::58697->273/tcp, 0.0.0.0:58695->
274/tcp, :::58696->274/tcp, 0.0.0.0:58694->275/tcp, :::58695->275/tcp, 0.0.0.0:5
8693->276/tcp, :::58694->276/tcp, 0.0.0.0:58692->277/tcp, :::58693->277/tcp, 0.0
.0.0:58691->278/tcp, :::58692->278/tcp, 0.0.0.0:58690->279/tcp, :::58691->279/tc
p, 0.0.0.0:58689->280/tcp, :::58690->280/tcp, 0.0.0.0:58688->281/tcp, :::58689->
281/tcp, 0.0.0.0:58687->282/tcp, :::58688->282/tcp, 0.0.0.0:58686->283/tcp, :::5
8687->283/tcp, 0.0.0.0:58685->284/tcp, :::58686->284/tcp, 0.0.0.0:58684->285/tcp
, :::58685->285/tcp, 0.0.0.0:58683->286/tcp, :::58684->286/tcp, 0.0.0.0:58682->2
87/tcp, :::58683->287/tcp, 0.0.0.0:58681->288/tcp, :::58682->288/tcp, 0.0.0.0:58
680->289/tcp, :::58681->289/tcp, 0.0.0.0:58679->290/tcp, :::58680->290/tcp, 0.0.
0.0:58678->291/tcp, :::58679->291/tcp, 0.0.0.0:58677->292/tcp, :::58678->292/tcp
, 0.0.0.0:58676->293/tcp, :::58677->293/tcp, 0.0.0.0:58675->294/tcp, :::58676->2
94/tcp, 0.0.0.0:58674->295/tcp, :::58675->295/tcp, 0.0.0.0:58673->296/tcp, :::58
674->296/tcp, 0.0.0.0:58672->297/tcp, :::58673->297/tcp, 0.0.0.0:58671->298/tcp,
:::58672->298/tcp, 0.0.0.0:58670->299/tcp, :::58671->299/tcp, 0.0.0.0:58669->30
0/tcp, :::58670->300/tcp, 0.0.0.0:58668->301/tcp, :::58669->301/tcp, 0.0.0.0:586
67->302/tcp, :::58668->302/tcp, 0.0.0.0:58666->303/tcp, :::58667->303/tcp, 0.0.0
.0:58665->304/tcp, :::58666->304/tcp, 0.0.0.0:58664->305/tcp, :::58665->305/tcp,
0.0.0.0:58663->306/tcp, :::58664->306/tcp, 0.0.0.0:58662->307/tcp, :::58663->30
7/tcp, 0.0.0.0:58661->308/tcp, :::58662->308/tcp, 0.0.0.0:58660->309/tcp, :::586
61->309/tcp, 0.0.0.0:58659->310/tcp, :::58660->310/tcp, 0.0.0.0:58658->311/tcp,
:::58659->311/tcp, 0.0.0.0:58657->312/tcp, :::58658->312/tcp, 0.0.0.0:58656->313
/tcp, :::58657->313/tcp, 0.0.0.0:58655->314/tcp, :::58656->314/tcp, 0.0.0.0:5865
4->315/tcp, :::58655->315/tcp, 0.0.0.0:58653->316/tcp, :::58654->316/tcp, 0.0.0.
0:58652->317/tcp, :::58653->317/tcp, 0.0.0.0:58651->318/tcp, :::58652->318/tcp,
0.0.0.0:58650->319/tcp, :::58651->319/tcp, 0.0.0.0:58649->320/tcp, :::58650->320
/tcp, 0.0.0.0:58648->321/tcp, :::58649->321/tcp, 0.0.0.0:58647->322/tcp, :::5864
8->322/tcp, 0.0.0.0:58646->323/tcp, :::58647->323/tcp, 0.0.0.0:58645->324/tcp, :
::58646->324/tcp, 0.0.0.0:58644->325/tcp, :::58645->325/tcp, 0.0.0.0:58643->326/
tcp, :::58644->326/tcp, 0.0.0.0:58642->327/tcp, :::58643->327/tcp, 0.0.0.0:58641
->328/tcp, :::58642->328/tcp, 0.0.0.0:58640->329/tcp, :::58641->329/tcp, 0.0.0.0
:58639->330/tcp, :::58640->330/tcp, 0.0.0.0:58638->331/tcp, :::58639->331/tcp, 0
.0.0.0:58637->332/tcp, :::58638->332/tcp, 0.0.0.0:58636->333/tcp, :::58637->333/
tcp, 0.0.0.0:58635->334/tcp, :::58636->334/tcp, 0.0.0.0:58634->335/tcp, :::58635
->335/tcp, 0.0.0.0:58633->336/tcp, :::58634->336/tcp, 0.0.0.0:58632->337/tcp, ::
:58633->337/tcp, 0.0.0.0:58631->338/tcp, :::58632->338/tcp, 0.0.0.0:58630->339/t
cp, :::58631->339/tcp, 0.0.0.0:58629->340/tcp, :::58630->340/tcp, 0.0.0.0:58628-
>341/tcp, :::58629->341/tcp, 0.0.0.0:58627->342/tcp, :::58628->342/tcp, 0.0.0.0:
58626->343/tcp, :::58627->343/tcp, 0.0.0.0:58625->344/tcp, :::58626->344/tcp, 0.
0.0.0:58624->345/tcp, :::58625->345/tcp, 0.0.0.0:58623->346/tcp, :::58624->346/t
cp, 0.0.0.0:58622->347/tcp, :::58623->347/tcp, 0.0.0.0:58621->348/tcp, :::58622-
>348/tcp, 0.0.0.0:58620->349/tcp, :::58621->349/tcp, 0.0.0.0:58619->350/tcp, :::
58620->350/tcp, 0.0.0.0:58618->351/tcp, :::58619->351/tcp, 0.0.0.0:58617->352/tc
p, :::58618->352/tcp, 0.0.0.0:58616->353/tcp, :::58617->353/tcp, 0.0.0.0:58615->
354/tcp, :::58616->354/tcp, 0.0.0.0:58614->355/tcp, :::58615->355/tcp, 0.0.0.0:5
8613->356/tcp, :::58614->356/tcp, 0.0.0.0:58612->357/tcp, :::58613->357/tcp, 0.0
.0.0:58611->358/tcp, :::58612->358/tcp, 0.0.0.0:58610->359/tcp, :::58611->359/tc
p, 0.0.0.0:58609->360/tcp, :::58610->360/tcp, 0.0.0.0:58608->361/tcp, :::58609->
361/tcp, 0.0.0.0:58607->362/tcp, :::58608->362/tcp, 0.0.0.0:58606->363/tcp, :::5
8607->363/tcp, 0.0.0.0:58605->364/tcp, :::58606->364/tcp, 0.0.0.0:58604->365/tcp
, :::58605->365/tcp, 0.0.0.0:58603->366/tcp, :::58604->366/tcp, 0.0.0.0:58602->3
67/tcp, :::58603->367/tcp, 0.0.0.0:58601->368/tcp, :::58602->368/tcp, 0.0.0.0:58
600->369/tcp, :::58601->369/tcp, 0.0.0.0:58599->370/tcp, :::58600->370/tcp, 0.0.
0.0:58598->371/tcp, :::58599->371/tcp, 0.0.0.0:58597->372/tcp, :::58598->372/tcp
, 0.0.0.0:58596->373/tcp, :::58597->373/tcp, 0.0.0.0:58595->374/tcp, :::58596->3
74/tcp, 0.0.0.0:58594->375/tcp, :::58595->375/tcp, 0.0.0.0:58593->376/tcp, :::58
594->376/tcp, 0.0.0.0:58592->377/tcp, :::58593->377/tcp, 0.0.0.0:58591->378/tcp,
:::58592->378/tcp, 0.0.0.0:58590->379/tcp, :::58591->379/tcp, 0.0.0.0:58589->38
0/tcp, :::58590->380/tcp, 0.0.0.0:58588->381/tcp, :::58589->381/tcp, 0.0.0.0:585
87->382/tcp, :::58588->382/tcp, 0.0.0.0:58586->383/tcp, :::58587->383/tcp, 0.0.0
.0:58585->384/tcp, :::58586->384/tcp, 0.0.0.0:58584->385/tcp, :::58585->385/tcp,
0.0.0.0:58583->386/tcp, :::58584->386/tcp, 0.0.0.0:58582->387/tcp, :::58583->38
7/tcp, 0.0.0.0:58581->388/tcp, :::58582->388/tcp, 0.0.0.0:58580->389/tcp, :::585
81->389/tcp, 0.0.0.0:58579->390/tcp, :::58580->390/tcp, 0.0.0.0:58578->391/tcp,
:::58579->391/tcp, 0.0.0.0:58577->392/tcp, :::58578->392/tcp, 0.0.0.0:58576->393
/tcp, :::58577->393/tcp, 0.0.0.0:58575->394/tcp, :::58576->394/tcp, 0.0.0.0:5857
4->395/tcp, :::58575->395/tcp, 0.0.0.0:58573->396/tcp, :::58574->396/tcp, 0.0.0.
0:58572->397/tcp, :::58573->397/tcp, 0.0.0.0:58571->398/tcp, :::58572->398/tcp,
0.0.0.0:58570->399/tcp, :::58571->399/tcp, 0.0.0.0:58569->400/tcp, :::58570->400
/tcp, 0.0.0.0:58568->401/tcp, :::58569->401/tcp, 0.0.0.0:58567->402/tcp, :::5856
8->402/tcp, 0.0.0.0:58566->403/tcp, :::58567->403/tcp, 0.0.0.0:58565->404/tcp, :
::58566->404/tcp, 0.0.0.0:58564->405/tcp, :::58565->405/tcp, 0.0.0.0:58563->406/
tcp, :::58564->406/tcp, 0.0.0.0:58562->407/tcp, :::58563->407/tcp, 0.0.0.0:58561
->408/tcp, :::58562->408/tcp, 0.0.0.0:58560->409/tcp, :::58561->409/tcp, 0.0.0.0
:58559->410/tcp, :::58560->410/tcp, 0.0.0.0:58558->411/tcp, :::58559->411/tcp, 0
.0.0.0:58557->412/tcp, :::58558->412/tcp, 0.0.0.0:58556->413/tcp, :::58557->413/
tcp, 0.0.0.0:58555->414/tcp, :::58556->414/tcp, 0.0.0.0:58554->415/tcp, :::58555
->415/tcp, 0.0.0.0:58553->416/tcp, :::58554->416/tcp, 0.0.0.0:58552->417/tcp, ::
:58553->417/tcp, 0.0.0.0:58551->418/tcp, :::58552->418/tcp, 0.0.0.0:58550->419/t
cp, :::58551->419/tcp, 0.0.0.0:58549->420/tcp, :::58550->420/tcp, 0.0.0.0:58548-
>421/tcp, :::58549->421/tcp, 0.0.0.0:58547->422/tcp, :::58548->422/tcp, 0.0.0.0:
58546->423/tcp, :::58547->423/tcp, 0.0.0.0:58545->424/tcp, :::58546->424/tcp, 0.
0.0.0:58544->425/tcp, :::58545->425/tcp, 0.0.0.0:58543->426/tcp, :::58544->426/t
cp, 0.0.0.0:58542->427/tcp, :::58543->427/tcp, 0.0.0.0:58541->428/tcp, :::58542-
>428/tcp, 0.0.0.0:58540->429/tcp, :::58541->429/tcp, 0.0.0.0:58539->430/tcp, :::
58540->430/tcp, 0.0.0.0:58538->431/tcp, :::58539->431/tcp, 0.0.0.0:58537->432/tc
p, :::58538->432/tcp, 0.0.0.0:58536->433/tcp, :::58537->433/tcp, 0.0.0.0:58535->
434/tcp, :::58536->434/tcp, 0.0.0.0:58534->435/tcp, :::58535->435/tcp, 0.0.0.0:5
8533->436/tcp, :::58534->436/tcp, 0.0.0.0:58532->437/tcp, :::58533->437/tcp, 0.0
.0.0:58531->438/tcp, :::58532->438/tcp, 0.0.0.0:58530->439/tcp, :::58531->439/tc
p, 0.0.0.0:58529->440/tcp, :::58530->440/tcp, 0.0.0.0:58528->441/tcp, :::58529->
441/tcp, 0.0.0.0:58527->442/tcp, :::58528->442/tcp, 0.0.0.0:58526->443/tcp, :::5
8527->443/tcp jovial_moser
Things look pretty alright in the browser too.
http://localhost tells you that everything is fine:
http://localhost/blog after we went through the installation process:
http://localhost/phpmyadmin has a new theme nowadays, but somehow still looks as if it hasn’t been updated in 20 years:
Deploy our app to Kubernetes
Good, we’re almost done! Let’s deploy our app to Kubernetes so we can call it a day.
First, create a kubernutty
namespace for our project:
kubectl create namespace kubernutty
Then, we’ll provide definitions for two types of Kubernetes objects that will help us deploy our WordPress container, a Deployment and a Service:
apiVersion: apps/v1
kind: Deployment
metadata:
name: kubernutty
spec:
replicas: 1
selector:
matchLabels:
name: kubernutty
template:
metadata:
labels:
name: kubernutty
spec:
containers:
- name: kubernutty
image: chunfeilung/kubernutty
ports:
- containerPort: 80
resources:
requests:
cpu: 1
memory: 2G
limits:
cpu: 1
memory: 2G
---
apiVersion: v1
kind: Service
metadata:
name: kubernutty
spec:
type: LoadBalancer
ports:
- name: http
port: 80
selector:
name: kubernutty
The Deployment
tells us that we want to run a single instance of the chunfeilung/kubernutty
image and give it access to 1 CPU and 2 gigabytes of memory. The Service
makes the deployed application accessible within the Kubernetes cluster.
I saved the configuration in a file named kubernutty.yaml
, which I’m going to apply to our kubernutty
namespace:
kubectl apply -n kubernutty -f kubernutty.yaml
This creates a single pod that runs our container:
NAME READY STATUS RESTARTS AGE
kubernutty-57f79c7757-5mmz9 1/1 Running 0 8s
The first thing you probably want to do now, is view the result in a browser. Unfortunately you can’t do that yet. Our configuration doesn’t tell Kubernetes how to do that!
What we can do though, is use kubectl port-forward
to forward traffic on our host to the newly created pod:
kubectl port-forward kubernutty-57f79c7757-5mmz9 8080:80 -n kubernutty
We can now access our WordPress installation on http://localhost:8080:
What’s next
Hooray, you have committed your first crimes against humanity!
While we could definitely add more cool things, like a domain name or an FTP server, the best thing we can do for now is delete the kubernutty
namespace by executing
kubectl delete namespace kubernutty
and not talk about this ever again.
Top comments (0)