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




