Day 8: Deploying with GitLab CI/CD & Docker Compose (WordPress + MySQL Stack)


In today's blog, we automate deploying a WordPress and MySQL stack using Docker Compose through GitLab CI/CD. Additionally, weโll discuss an important issue if you later switch WordPress to run on port 80.
๐ Docker Compose File โ docker-compose.yaml
Hereโs the stack configuration:
version: '3.8'
services:
wordpress:
image: wordpress
restart: always
ports:
- 8080:80 # WordPress runs on port 8080
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
volumes:
- wordpress:/var/www/html
db:
image: mysql:8.0
restart: always
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- db:/var/lib/mysql
volumes:
wordpress:
db:
โ
Access WordPress: http://<YOUR_VM_IP>:8080
๐ค GitLab CI/CD Pipeline โ .gitlab-ci.yml
stages:
- deploy
deploy-job:
stage: deploy
image: alpine:latest
before_script:
- apk add --no-cache openssh sshpass
script:
- sshpass -p "$DOCKER_VM_PASSWORD" scp -o StrictHostKeyChecking=no docker-compose.yaml ${DOCKER_VM_USERNAME}@${DOCKER_VM_IP_ADDRESS}:/${DOCKER_VM_USERNAME}/docker-compose.yaml
- sshpass -p "$DOCKER_VM_PASSWORD" ssh -o StrictHostKeyChecking=no ${DOCKER_VM_USERNAME}@${DOCKER_VM_IP_ADDRESS} "
cd /${DOCKER_VM_USERNAME} &&
docker compose -f docker-compose.yaml down &&
docker compose -f docker-compose.yaml up -d
"
tags:
- microk8s
โ Environment Variables Needed:
Variable Name | Description |
DOCKER_VM_IP_ADDRESS | Remote Docker server's IP |
DOCKER_VM_USERNAME | SSH username |
DOCKER_VM_PASSWORD | SSH password |
โ Running WordPress on Port 80 - Beware of Redirection Issues
If you decide to change 8080:80
to 80:80
in your docker-compose.yaml
to run WordPress on port 80, you might face a redirection issue.
โ Reason for the Redirection
WordPress stores the site URL (with the port) in the database when it's first installed. For example, if you ran it on:
http://68.183.86.22:8080
WordPress stores this URL inside the wp_options
table (fields: siteurl
and home
). So, when you shift to port 80, WordPress still tries to redirect to the old port.
๐ How to Check Stored URL in WordPress
- Connect to the MySQL container:
docker exec -it <db-container-name> mysql -u exampleuser -pexamplepass
Example:
docker exec -it root-db-1 mysql -u exampleuser -pexamplepass
- Run these SQL commands:
USE exampledb;
SELECT option_name, option_value FROM wp_options WHERE option_name IN ('siteurl', 'home');
Youโll likely see:
http://68.183.86.22:8080
โ How to Fix the Redirect
Update the siteurl
and home
directly in the database:
UPDATE wp_options SET option_value = 'http://68.183.86.22' WHERE option_name = 'siteurl';
UPDATE wp_options SET option_value = 'http://68.183.86.22' WHERE option_name = 'home';
๐ Restart WordPress Container (Optional but Recommended)
docker restart <wordpress-container-name>
Example:
docker restart root-wordpress-1
๐ Final Step:
Clear browser cache or try incognito mode.
Access your WordPress on:
http://68.183.86.22
๐ฏ Summary
โ
GitLab CI/CD deploys your WordPress stack automatically
โ
Docker Compose makes multi-container deployment simple
โ
WordPress stores its base URL on first install
โ
Update the database if you change the port later
Subscribe to my newsletter
Read articles from Muhammad Hassan directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Muhammad Hassan
Muhammad Hassan
Hey there! I'm currently working as an Associate DevOps Engineer, and I'm diving into popular DevOps tools like Azure Devops,Linux, Docker, Kubernetes,Terraform and Ansible. I'm also on the learning track with AWS certifications to amp up my cloud game. If you're into tech collaborations and exploring new horizons, let's connect!