I have a lot of half-finished blog posts that I want to finish up soon coming back from both Reclaim Open and a week-long family vacation, but hey I might as well finish up this old draft as I used this trick yet again today. I’ve got to get the blog momentum going after a few month’s hiatus!
I work with docker and docker-compose very often for Reclaim Cloud stuff nowadays, and while I’m pretty comfortable with bind-mounts, docker volumes, and docker cp
for getting files in and out of containers, doing serious things with databases still scares me a little. While I can use the CLI to do some stuff, I really like a UI when I need to poke around a database; particularly with anything more complicated than a dump or restore. In cPanel-land phpMyAdmin is already set up and ready to go, but I don’t have that luxury when working with docker-compose based stuff.
That’s where Adminer comes in handy. Tom Woodward mentioned it in a WPMS workshop (I think WPMS101 last fall?) and I was intrigued because it could do a lot of what phpMyAdmin does, but for any type of database (not just MySQL). On top of that, you only need to “install” a single PHP file, or add a few lines to a docker-compose setup!
Starting it
Now, whenever I need it, I can simply add a few lines to the “services” section of any docker-compose.yml
file:
adminer:
image: adminer
ports:
- '8080:8080'
Here it is in the context of WordPress running in docker-compose1:
version: "3"
services:
wordpress:
image: wordpress
restart: unless-stopped
ports:
- 80:80
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_USER: foo
WORDPRESS_DB_PASSWORD: bar
WORDPRESS_DB_NAME: wordpress_db
volumes:
- ./public_html:/var/www/html
mysql:
image: mysql
restart: unless-stopped
environment:
MYSQL_DATABASE: wordpress_db
MYSQL_USER: foo
MYSQL_PASSWORD: bar
MYSQL_RANDOM_ROOT_PASSWORD: 1
volumes:
- ./db:/var/lib/mysql
adminer:
image: adminer
ports:
- '8080:8080'
Then I can start it up:
docker-compose up -d
I visit it by appending :8080
to the domain name of the thing I am running. In my example below, I’m just running it on my local computer, so the address is http://localhost:8080
I can log in using the info I already know from my docker-compose file, and I get a very basic, but usable interface!
Removing it
Then, when I am done, I just comment out the lines for Adminer:
version: "3"
services:
wordpress:
image: wordpress
restart: unless-stopped
ports:
- 80:80
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_USER: foo
WORDPRESS_DB_PASSWORD: bar
WORDPRESS_DB_NAME: wordpress_db
volumes:
- ./public_html:/var/www/html
mysql:
image: mysql
restart: unless-stopped
environment:
MYSQL_DATABASE: wordpress_db
MYSQL_USER: foo
MYSQL_PASSWORD: bar
MYSQL_RANDOM_ROOT_PASSWORD: yes
volumes:
- ./db:/var/lib/mysql
#adminer:
# image: adminer
# ports:
# - '8080:8080'
Finally, I run this command to stop Adminer, without having to restart any other docker containers:
docker-compose up -d --remove-orphans
Stopping Adminer when it’s not in use saves on resources2, as well as provides the security benefit of completing eliminating the possibility that anyone could log in to it.
-
Yes, I know that technically for a PHP app like WordPress, I could just drop Adminer’s single PHP file in the web root instead of adding lines to my docker-compose file, but I figured a WordPress-based docker-compose example would still be a good one to go with. ↩︎
-
Not that it really uses many 🤷🏻♂️ ↩︎